String家族常见面试题

1、String在什么包,使用时需要导入吗?

String属于java.lang包,是系统自己提供的,直接使用就好,不需要导入

2、==和equals方法

==用于比较两者的地址
equals是覆写了Object类中的方法,先比较地址是否一样,如果一样返回true,如果不一样,比较类型是否一样,如果类型不一样,直接返回false,如果类型一致,对象不一致,需要先还原回去,然后两个数组分别把每一个元素取出来比,完全一样返回true,否则返回false。默认也是比较地址,如果需要修改其比较规则,我们可以重写equals方法
例题一、String str=“abc”;
String str1=“abc”;
String str2=new String(“abc”);
String str3=“ab”+“c”;
System.out.println(str= =str1); //true 直接赋值后,字符串就被存入常量池,下一次再有相同字符,就直接引用常量池中的相同字符串,因此地址也是相等的
System.out.prinln(str1= =str2); //false new在堆上开辟了新的空间,而str1是在常量池内,因此地址不等
System.out.println(str1.equals(str2)); //true 两个内容相等,因此返回true
System.out.println(str= =str3); //true
System.out.println(str.equals(str3)); //true

例题二、String str=“a”+“b”+“c”+“d”;
以上语句一共创建了多少个对象?

七个;
str=“a”;第一个
str=“b”;第二个
str=“ab”;第三个
str=“c”;第四个
str=“abc”;第五个
str=“d”; 第六个
str=“abcd”; 第七个

3、关于String的特性

不可变性:看String源码可知,String底层存储使用char[]实现,这个char[]是被final所修饰的,我们知道数组是引用数据类型,而被final修饰时,地址与数组长度都不可变,因此String类型的数据是不可变的

4、String、StringBuffer、StringBuilder区别

1>版本:String、StringBuffer是JDK1.0版本,StringBuilder是Jdk1.5版本

2>继承的接口:String实现的Serializable、Charsequence、Comparable接口,StringBuilder、StringBuffer实现的Serializable、Charsequence、Appendable接口。直接造成的结果的就是,String含有compareTo()方法,StringBuffer、StringBuilder含有append()方法

3>关于多线程:String、StringBuffer,底层用了synchronized修饰,因此是同步的,线程安全;StringBuilder是异步的,线程不安全

4>关于效率:String<StringBuffer<StringBuilder,版本越靠后性能被优化的越好

5>关于是否可变性:String家族底层都用char[]存储实现,而String底层的char[]用了final修饰,数组被fianl修饰则地址不可变,数组长度不可变,所以String是不可变的,而StringBuffer、StringBuilder底层则不被final修饰,因此不具有可变性

6>关于拼接是否创建新对象:String底层是char[]并用final修饰,所以在拼接时,每拼接一次都会创建一个新对象;StringBuilder、StringBuffer在拼接时,每拼接一次都扩容一次,不必创建新对象

7>关于创建对象:String可以向基本数据类型一样直接赋值,而其他的只能调用构造函数

5、关于String的compareTo方法

compareTo方法是实现自Comparable接口的,按照字典索引的顺序(Unicode编码)比较,返回值是int类型

6、关于String对象的储存
String a="abc” —>字符串常量池
Stirng a=new String(“abc”) ----->堆内存上
“a”+“b”+“c”+“d” ------>如上,看字符串常量池产生七个对象

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值