javase面试题-字符串

一:字符串链接

String s1 = "abc";
String s2 = "qug";
//字符串拼接的实质
String s = (new StringBuilder(String.valueOf(s1))).append(s2).toString();
System.out.println(s);

二:String对象不可变的原因

String所有属性都被final修饰、私有的并且没有提供修改方法。 (主要字段是char数组,虽然被final修饰但数组是可变的,私有保证了不被修改但还是可以通过反射来改变String)

//String对象的底层实际上是一个char[]数组,用final修饰的对象值可变,但是引用不变,即:value指向不可变,但是value[]数组的值可变,但因为有private关键字对其进行封装达到value[]数组值也不可变的目的
private final char value[];

三: 为什么String设计成final

避免被继承后破坏,防止方法被重写

四: 为什么String设计成不可变的

1.字符串常量池的需要,提升效率和减少内存分配
2.安全性考虑,防止被意外修改(HashSet中存的值如果是可变的String,则破坏了唯一性;不可被写所以线程安全;)
3.作为HashMap、HashTable等hash型数据key的必要。因为不可变的设计,jvm底层很容易在缓存String对象的时候缓存其hashcode,这样在执行效率上会大大提升。

五: String和StringBuilder、StringBuffer的区别?

Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰(非同步),因此它的效率也比StringBuffer要高。

在 JDK5.0 中引入 StringBuilder 类。 这个类的前身是 StringBuffer, 其效率稍有些 低 ,
但允许采用多线程的方式执行添加或删除字符的操作U 如果所有字符串在一个单线 程中编辑 (通常都是这样,) , 则应该用> StringBuilder 替代它。 这两个类的 AP丨是相同的。

六:如何将字符串转换为基本数据类型?

调用基本数据类型对应的包装类中的方法parseXXX(String)即可返回相应基本数据类型

七:如何将基本数据类型转换为字符串?

一种方法是将基本数据类型与空字符串("")连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串。

八:能不能自己写个类,也叫java.lang.String?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar 包中的那个java.lang.String。
由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat 的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String。
但是这么干就会出很多潜在的问题,原来所有用了java.lang.String 类的都将出现问题。
另外,java 提供了endorsed技术,但是,能够被覆盖的类是有限制范围,反正不包括java.lang 这样的包中的类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值