您的位置:首页 > 产品设计 > UI/UE

String、StringBuffer、StringBuilder

2015-09-11 11:54 525 查看
一、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变量在编译期间就会

被直接替换为真实的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: