您的位置:首页 > 编程语言 > Java开发

对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的浅薄理解,或许有不对的地方,望大家多多指教,博主只是一个菜鸟。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: