判断字符串中存在多少个a_Java 字符串(Part 1)相关面试题

本文探讨Java中String、StringBuffer、StringBuilder的区别与使用,讲解字符串不可变性、编码转换、equals与==的区别,以及字符串常量池。同时,文章通过面试题形式讲解字符串相关知识点,包括对象创建、substring、toUpperCase等操作的影响,强调字符串优化技巧。
摘要由CSDN通过智能技术生成

395e36d787d2f405dac281a07b3e2d32.png

问:下面程序的运行结果是什么?

String s1 = "abc";
StringBuffer s2 = new StringBuffer(s1);
System.out.println(s1.equals(s2));    //1,false

StringBuffer s3 = new StringBuffer("abc");
System.out.println(s3.equals("abc"));    //2,false
System.out.println(s3.toString().equals("abc"));    //3,true 

答:注释 1 打印为 false,主要考察 String 的 equals 方法,String 源码中 equals 方法有对参数进行 instance of String 判断语句,StringBuffer 的祖先为 CharSequence,所以不相等; 注释 2 打印为 false,因为 StringBuffer 没有重写 Object 的 equals 方法,所以 Object 的 equals 方法实现是 == 判断,故为 false; 注释 3 打印为 true,因为 Object 的 toString 方法返回为 String 类型,String 重写了 equals 方法实现为值比较。

问:怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

答:如下代码即可实现

String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");

问:String、StringBuffer、StringBuilder 的区别是什么?

答:String 是字符串常量,StringBuffer 和 StringBuilder 都是字符串变量,后两者的字符内容可变,而前者创建后内容不可变;StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,线程安全会带来额外的系统开销,所以 StringBuilder 的效率比 StringBuffer 高;String 的每次修改操作都是在内存中重新 new 一个对象出来,而 StringBuffer、StringBuilder 则不用,且提供了一定的缓存功能,默认 16 个字节数组的大小,超过默认的数组长度时扩容为原来字节数组的长度 * 2 + 2,所以使用 StringBuffer 和 StringBuilder 时可以适当考虑下初始化大小,以便通过减少扩容次数来提高代码的高效性。

问:String 为什么是不可变的?

答:String 不可变是因为在 JDK 中 String 类被声明为一个 final 类,且类内部的 value 字节数组也是 final 的,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串;如果字符串是可变的则会引起很严重的安全问题,譬如数据库的用户名密码都是以字符串的形式传入来获得数据库的连接,或者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值