字符串常量

我终于搞清楚了和String有关的那点事儿。

匿名 (未验证) 提交于 2019-12-03 00:38:01
String,是Java中除了基本数据类型以外,最为重要的一个类型了。很多人会认为他比较简单。但是和String有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对: Q1: String s = new String("hollis"); 定义了几个对象。 Q2:如何理解 String 的 intern 方法 上面这两个是面试题和String相关的比较常考的,很多人一般都知道答案。 A1:若常量池中已经存在”hollis”,则直接引用,也就是此时只会创建一个对象,如果常量池中不存在”hollis”,则先创建后引用,也就是有两个。 A2:当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用; 两个答案看上去没有任何问题,但是,仔细想想好像哪里不对呀。按照上面的两个面试题的回答,就是说 new String 也会检查常量池,如果有的话就直接引用,如果不存在就要在常量池创建一个,那么还要intern干啥?难道以下代码是没有意义的吗? String s = new String ( "Hollis" ).intern(); 如果,每当我们使用new创建字符串的时候,都会到字符串池检查,然后返回

基础知识点

匿名 (未验证) 提交于 2019-12-03 00:27:02
JAVA中的常量池 在Java的内存分配中,总共3种常量池: 字符串常量池 Java中字符串对象创建有两种形式, 一种为字面量形式,如String str = "droid",另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid") ,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池。 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。 字符串常量池在Java内存区域的哪个位置 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中; 在JDK7.0版本, 字符串常量池被移到了堆中了 。至于为什么移到堆内,大概是由于方法区的内存空间太小了。 举例说明: 字面量创建形式 String str1 = "droid"; JVM检测这个字面量,这里我们认为没有内容为droid的对象存在。JVM通过字符串常量池查找不到内容为droid的字符串对象存在,那么会创建这个字符串对象

PHP基础2--基本语法

匿名 (未验证) 提交于 2019-12-02 22:11:45
知识点: 标记符,注释 变量 常量 数据类型 运算符 流程控制 标记符,注释   4种标记符号:     1. 默认形式: <?php php语句 ?>       如果<?php ...?>之后没有html代码,则 ?> 标记可以省略     2. 短标签形式: <? php语句 ?>       默认是关闭的,需要开启配置项【php.ini】: short_open_tag=on     3. script标签形式: <script language=”php”> php语句 </script>     4. asp形式: <% php语句 %>       默认是关闭的,需要开启配置项【php.ini】: asp_tags =on   大小写      变量: 区分大小写     常量: 区分大小写, 可以在php.ini文件中配置为不区分大小写     其他不区分大小写: 如函数名,系统关键字...   注释     单行注释: //注释内容 或 #注释内容     多行注释: /*注释内容*/ 变量   概念:     代表一定存储空间及其中数据的一个“标识符”     赋值同时定义变量, $v1 = 1; 图示:   命名规则     以字母或下划线开头 后跟任意数量(含0个)字母,数字和下划线     常见命名:         骆驼命名法 : 首单词小写

深入学习Java核心 Java内存分配原理

匿名 (未验证) 提交于 2019-12-02 21:53:32
内存分配 与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介 绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 ◆堆:存放用new产生的数据 ◆静态域:存放在对象中用static定义的静态成员 ◆常量池:存放常量 ◆非RAM存储: 硬盘等永 久存储空间 Java内存分配中的栈 在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量 时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。 Java内存分配中的堆 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 访问堆中的数组或对象。引用变量就相当于是为数组或者对象起 的一个名称。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放

Java字符串比较之――==和equals方法的区别

匿名 (未验证) 提交于 2019-12-02 21:40:30
Java字符串比较之――==和equals方法的区别 我以前以为这两者好像在java中区别不大,事实证明我犯大错了!!! 这两者是有很大的区别的。 如果二者都是常量,那么==和equal方法没有区别。 但是如果一个字符串是变量,另一个字符串是常量,那么如果要比较两个字符串的内容是否相等的话,最好使用equals方法。equals方法是比较字符串的内容是否相等的最保险的方法。 暂时就说这么多吧。核心思想就在上面了。如果想看例子的话,就看下下面这篇博客。 https://www.cnblogs.com/dongguol/p/5845076.html 转载请标明出处: Java字符串比较之――==和equals方法的区别 文章来源: https://blog.csdn.net/ChenglinBen/article/details/91460213

『JavaSE』String类

会有一股神秘感。 提交于 2019-12-02 12:10:39
我们知道,C语言中字符串以字符数组的形式来表示,这种方式可以说很糟糕了。现代的编程语言基本都会有一个基本的类型来表示字符串,本篇博客我们来介绍一下Java中的字符串类型String。 字符串的创建 首先,我们来看一下,如何 创建一个字符串 。我们介绍 三种常见的创建方式 。 方式一 : String str = "hehe"; 。 内存布局如下 : 方式二 : String str2 = new String("hehe"); 。 内存布局如下 : 方式三 : char[] arr = {'h', 'e', 'h', 'e'}; String str3 = new String(arr); 。 内存布局如下 : 结论 : 从上述三种字符串定义方式的内存布局可以看出, 方式一不仅写起来简单,也是最省空间的 。所以在使用中我们 更推荐使用方式一 。 注意 : "hehe" 这样的 字符串字面值常量 , 类型也是String ; Java中除了 四类八种基本的数据类型 (byte、short、int、long、float、double、char、boolean)之外, 全部都是引用类型 ; 既然 String也是引用类型 ,我们来 看一下这段代码的内存布局 。 String str1 = "hehe"; String str2 = str1; 。 修改str1的引用

JVM笔记:Java虚拟机的常量池

别说谁变了你拦得住时间么 提交于 2019-12-02 05:09:34
这篇文章主要是做一个总结,将查找到相关的资料自己做一个整理,最后会列出查找过的相关资料,感兴趣的可以去翻一翻。 常量池 class文件常量池(class constant pool) 常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,包含了类也是占用Class文件中第一个出现的表类型数据项目。 常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。而符号引用则属于编译原理方面的概念,包含了下面三类常量: 类和接口的全限定名(Full Qualified Name) 字段的名称和描述符(Descriptor) 方法的名称和描述符 类和接口的全限定名,例如: com/example/demo/Demo.class 字段的名称和描述符,例如: Field a:[Ljava/lang/String 方法的名称和描述符,例如: Method java/lang/String."<init>":(Ljava/lang/String;)V 后两个是字节码指令,不懂得可以查阅下相关资料(TODO) + 可以通过查看字节码的形式来查看Class的常量池的内容,因为是在编译时产生的,也可以称为 静态常量池 。

Java中String类的特殊性

不问归期 提交于 2019-12-02 05:05:43
java中特殊的String类型 Java中String是一个特殊的包装类数据有两种创建形式: String s = "abc"; String s = new String("abc"); 第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值'a'、'b'、'c',然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{'a'、'b'、'c'},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果"abc"已经被保存在字符串常量池中,则在字符串常量池中找到值为"abc"的对象object,然后将s指向这个对象的地址。 第一种特点:JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。 第二种可以分解成两步1、String object = "abc"; 2、String s = new String(object); 第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。 第二种特点:一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。 在讲字符串比较前,必须要了解=

第十二章 基本数据类型

泪湿孤枕 提交于 2019-12-01 08:59:04
第十二章 基本数据类型 数值概论1654948748 下面一些建议能够使你在使用数的时候少犯错误。 避免使用神秘数值 修改会变得更可靠; 修改会变得更容易; 你的代码变得更可读。 如果需要可以使用硬编码的0和1; 预防除零错误; 使类型转换变得明显; 避免混合类型的比较; 注意编译器的警告。 整数 在用整数的时候,要注意下面的注意事项。 检查整数除法; 检查整数溢出; 检查中间结果溢出。 浮点数 使用浮点数应遵循的原则: 避免数量级相差巨大的数之间的加减运算; 避免等量判断; 处理舍入问题: 换用一种精度更高的变量类型; 换用二进制编码的十进制变量; 把浮点变量变成整数变量; 检查语言和函数库对特定数据类型的支持。 字符和字符串 使用字符串的技巧: 避免使用神秘字符和神秘字符串; 避免off-by-one错误; 了解你的语言和开发环境是如何支持Unicode的; 在程序生命周期中尽早决定国际化/本地化策略; 如果你知道只需要支持一种文字的语言,请考虑使用ISO 8859字符集; 如果你需要支持多种语言,请使用Unicode; 采用某种一致的字符串类型转换策略。 C语言中的字符串 直接处理C字符串避免常见错误的方法。 注意字符串指针和字符串数组之间的差异: 警惕任何包含字符串和等号的表达式; 通过命名规则区分变量是字符串数组还是字符串指针。 把C

JVM_1

喜夏-厌秋 提交于 2019-12-01 05:12:42
这里面加了很多我自己的看法,有啥错误的阔以给我留言一手,多谢您! JAVA虚拟机在执行java程序的时候会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自不同的用途,以及创建和销毁时间. java虚拟机所管理的内存包括以下几个运行时数据区域 Method Area方法区(线程共享) VM Stack虚拟机栈(线程私有) Native Method Stack本地方法栈(线程私有) Heap堆(线程共享) Program Counter Register程序计数器(线程私有) 注意:这几个区域都是JVM管理的运行时数据区,要记住运行时数据区这几个字. 程序计数器(线程私有) 它是一块较小的内存空间, 可以看作是当前线程所执行的字节码的行号指示器,其中的值的数据类型为returnAddress类型 字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码指令的,分支,循环,跳转,异常处理,线程恢复等都需要依赖这个计数器来完成. 为什么说它是线程私有的呢? 因为虚拟机的多线程是通过线程轮流切换并分配处理器时间的方式来实现的,在任何一个确定的时刻,一个处理器都 只会 执行一条线程中的指令,因此,为了保证线程切换后能恢复到正确的执行位置,每条线程都会有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储! 如果当前线程执行的时java方法