概述
一、String类
1、String是final类,不可被继承;
2、String底层是通过char数组来实现(通过查看源码得知);另外字符串的相关修改操作都会生成一个新的String对象;
注:String对象的任何改变都不会影响到原对象,相关的任何change操作都会生成新的String对象(具体可以参看源码)
3、字符串常量通常存在常量池中,如:
String str1 = "hello world";
String str2 = "hello world";
这两个语句如果使用equals方法会返回true,使用==也会返回true;但如果是下面的:
String str3 = new String("Hello world");
String str4 = new String("hello world");
如果使用equals方法判断3和4,会相等,但使用==会返回false,这是因为==比较的是其值,引用不同,所以返回false;
但3和4创建过程:1和2都会放入到常量池中,对应同一个地址,引用放在栈中以供使用(仅仅一份);而3和4是通过
new来创建的,先去检查常量池中有没有相同的,如果有就拷贝一份并在堆中生成一个String对象存放;如果没有就直接在
堆中生成一个String对象, 相关的引用放在栈中以供使用
二、StringBuffer类(线程安全,不可继承)
1、StringBuffer相比String类来效率会高很多,是因为String进行相关change操作会生成很多的临时变量string对象,占用内存
而StringBuffer仅仅生成一个对象,占用内存较少;其中方法都是synchronized,是线程安全的;
2、推荐使用StringBuffer类
三、StringBuilder类(线程不安全,不可被继承)
1、StringBuilder类和StringBuffer基本一致,但StringBuilder不是线程安全的,效率稍微高点;
2、StringBuilder类和StringBuffer类仍然都是底层为char数组,默认初始化大小为16;
四、相关
1、在字符串相加操作或者改动较少的情况下,建议采用String str = ‘hello"这种形式,当字符串相加较多的情况下,就使用
StringBuilder,如果使用了多线程,就使用StringBuffer
2、相关面试:
代码输出结果:
String str1 = "hello"; Sring str2 = "hell" + "o"; System.out.println((a==b));
结果:true。原因:str2在编译器就优化成hello并放入到常量池中,所以str1和str2指向同一个对象
String str1 = "hello";
String str2 = "hell";
String str3 = str2 + "o"; System.out.println(str1 == str3);
结果是false。原因:str3中使用了引用,生成的对象保存在堆中(运行时生成),而str1保存在常量池中,所以返回false;
如果是equals则返回true;
String str1 = "hello"; final String str2 = "hell"; String str3 = str2 + "o"; System.out.println(str1 == str3);
结果:true;原因:被final修饰的变量,会在常量池中保存一个副本,不用通过连接就可以访问,final变量在编译期间就会
被直接替换为真实的值。
String a =
"hello"
;
String b =
new
String(
"hello"
);
String c =
new
String(
"hello"
);
String d = b.intern();
System.out.println(a==b);System.out.println(b==c);
System.out.println(b==d);
System.out.println(a==d);
最后
以上就是乐观招牌为你收集整理的String、StringBuffer、StringBuilder的全部内容,希望文章能够帮你解决String、StringBuffer、StringBuilder所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复