课后习题3-5:
3.String类有什么特点?
1.一旦赋值,便不能更改其指向的字符对象
2.如果更改,则会指向一个新的字符对象
3.不能为null
4.String什么时候进行值比较,什么时候进行引用比较?
stringA.equals(stringB);进行值比较
stringA==stringB;进行引用比较
5.String与StringBuffer的区别是什么?如何相互转化?
StringBuffer是一个具有对象引用传递特点的字符串对象。
//数据类型由String转为StringBuffer
String s = “hello”;
StringBuffer sb = new StringBuffer(s); //调用的构造函数
//String也有相反的构造函数
String a = new String(sb);
//还可以用StringBuffer的一个方法
String str = sb.toString() ;
补充题:
1.借助JDK,选取几个String与StringBuffer,StringBuilder的常用API,并编写实例测试API的功能。
字符串的遍历
String s = "123456";
for(int i = 0; i < s.length(); i++)
System.out.println(s.charAt(i)+" ");// 1 2 3 4 5 6
字符串的替换
String s = "11123456";
String s1 = s.replaceAll("1", "a");
String s2 = s.replaceFirst("1","a");
System.out.println(s1);///aaa23456
System.out.println(s2);///a1123456
字符串增加
StringBuilder s = new StringBuilder("123");
StringBuilder s1 = new StringBuilder("456");
s.append(s1);
System.out.print(s);// 123456
删除字符串
StringBuilder s = new StringBuilder("123");
StringBuilder s1 = new StringBuilder("456");
s.delete(0, 1);
s1.deleteCharAt(1);
System.out.println(s);// 23
System.out.println(s1);// 46
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
2.请简述String,StringBuffer,StringBuilder三者之间的共同点与区别,应该分别在何种场景下使用?
String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。
StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
StringBuffer:在修改时会改变对象自身,每次操作都是对 StringBuffer 对象本身进行修改,不是生成新的对 象;使用场景:对字符串经常改变情况下,主要方法: append(), insert()等。
StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
StringBuilder、 StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如super.append(…)。 只是 StringBuffer 会在方法上加 synchronized关键字,进行同步。最后,如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。
3.为什么不建议在for循环中使用“+”进行字符串拼接?
由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。
而“+”反编译后的代码,在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。
而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。
因此,经过对比发现,直接使用StringBuilder的方式是效率最高的。因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。
4.什么是字符串的编码与解码?请举例说明。
编码:将Unicode字符集转换为本地字符集(GB2312或GBK)的过程。
解码:将本地字符集转换为Unicode字符集的过程。
储存的时候把字符转化为数字储存起来,当显示的时候又把数字转化为字符显示出来。如数字0的十进制ASCII码是48,‘A’的十进制ASCII为65,‘a’的十进制ASCII为97。