我是靠谱客的博主 乐观招牌,最近开发中收集的这篇文章主要介绍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方法是一个本地方法,先去查看常量池中有没有相同内容的字符串,如果有则返回该常量池字符串引用,如果不存在,
则将该字符串放入到常量池中,并返回一个该字符串引用;

最后

以上就是乐观招牌为你收集整理的String、StringBuffer、StringBuilder的全部内容,希望文章能够帮你解决String、StringBuffer、StringBuilder所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(88)

评论列表共有 0 条评论

立即
投稿
返回
顶部