对java String类型字符串的一些浅薄理解
2017-06-04 17:13
316 查看
一直对java中的String类型不是太理解,今天好好看了一下,说说自己对String的理解。 一:String 类型创建的两种方式 String a="abcd"; String b="abcd"; System.out.println("a==b:"+(a==b)); //true System.out.println("a.equals(b):"+a.equals(b));true 使用双引号创建的字符串,jvm会首先去常量池中查找是不是有对应的字符串,如果有就直接引用这个对象,如果没有,则创建一个新的实例对象,然后引用它。所以上面不管是"=="还是equals都是true。a在创建是在常量池没有找到字符串(假设此时常量池中没有“abcd"这个字符串),则会在常量池中创建一个对象实例,然后a引用指向它,b在创建引用时会在常量池中找到了a之前引用的对象,然后b也会引用这个对象,而不会创建新的对象。所以a和b引用的都是同一个对象,所以==和equals都是true.
String a=new String ("abcd"); String b=new String ("abcd"); System.out.println("a==b:"+(a==b));//false System.out.println("a.equals(b):"+a.equals(b));//true
使用new构造函数创建的字符串,是直接在堆中创建的对象,而a和b是指向他们的引用,看上面结果就知道,虽然值相同,a和b指向的是不同的对象,使用构造函数创建字符串时,不管前面有没有值相同的字符串对象,java都会创建一个新的对象在堆中。 那么一个问题来了,我们知道使用构造函数创建的字符串对象会在堆中创建对象,那么它会不会在常量池也会存在呢?
String a=new String ("abcd"); String b="abcd"; System.out.println("a==b:"+(a==b)); //false System.out.println("a.equals(b):"+a.equals(b));//true
看上面结果知道使用构造函数创建字符串时,并没有在常量池中创建,所以b在常量池中并没有找到a所引用的对象,所以“==”输出结果是false。
引用块内容
1.单独使用”“引号创建的字符串都是常量,编译期就已经确定存储到String Pool中;
2,使用new String(“”)创建的对象会存储到heap中,是运行期新创建的;
3,使用只包含常量的字符串连接符如”aa” + “aa”创建的也是常量,编译期就能确定,已经确定存储到String Pool中;
4,使用包含变量的字符串连接符如”aa” + s1创建的对象是运行期才创建的,存储在heap中;
以上就是一点对String的浅薄理解,或许有不对的地方,望大家多多指教,博主只是一个菜鸟。
相关文章推荐
- java中的一些string类型使用,如替换指定的字符串。
- java中八种基本数据类型以及它们的封装类,String类型的一些理解
- java中八种基本数据类型以及它们的封装类,String类型的一些理解
- java中八种基本数据类型以及它们的封装类,String类型的一些理解
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 全面理解Java中String数据类型
- Java常量字符串String理解
- 理解Java中的String数据类型
- 理解Java中字符串(String)的存储和赋值原理
- Java字符串的一些理解
- 全面理解Java中的String数据类型
- java的String类型的一些简单操作
- 理解:引用类型,string类型(字符串驻留),值类型
- 在JAVA中, 在使用String.split方法时要注意的一些特殊分隔字符串
- java String 类的一些理解 关于==、equals、null
- 全面理解Java中的String数据类型
- 全面理解Java中的String数据类型
- 全面理解Java中的String数据类型
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 全面理解Java中的String数据类型