String、StringBuffer、StringBuilder

一、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);
结果:false,false,false,true;原因:这个前几个应该都没有问题了,就最后一个使用intern方法的,返回true
intern方法是一个本地方法,先去查看常量池中有没有相同内容的字符串,如果有则返回该常量池字符串引用,如果不存在,
则将该字符串放入到常量池中,并返回一个该字符串引用;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值