String类
String对象特性
package com.hspedu.string_;
public class String01 {
public static void main(String[] args) {
//1.String 对象用于保存字符串,也就是一组字符序列
//2. "jack" 字符串常量, 双引号括起的字符序列
//3. 字符串的字符使用 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节
//4. String 类有很多构造器,构造器的重载
//常用的有 String s1 = new String();
//String s2 = new String(String original);
//String s3 = new String(char[] a);
//String s4 = new String(char[] a,int startIndex,int count)
//String s5 = new String(byte[] b)
//5. String 类实现了接口 Serializable【String 可以串行化:可以在网络传输】
// 接口 Comparable [String 对象可以比较大小]
//6. String 是 final 类,不能被其他的类继承
//7. String 有属性 private final char value[]; 用于存放字符串内容
//8. 一定要注意:value 是一个 final 类型, 不可以修改(需要功力):即 value 不能指向
// 新的地址,但是单个字符内容是可以变化
String name = "jack";
name = "tom";
final char[] value = {'a','b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H';
//value = v2; 不可以修改 value 地址
}
}
ch 是final类型的数组,ch内存放的是堆中的地址,所以ch不能指向新的地址,但是数组内(堆内)单个字符内容是可以变化。
13.5.2 String VS StringBuffer
第一种理解:String不能更改value数组内容的原因是它没有提供更改方法,所以要更改只能换对象地址。(虽然理论上value数组里面的内容可以变,只是value指向的地址不能变,但是private final 的value数组所在的String类并没有向外提供一个更改方法。所以要更改只能重新创建一个对象。)
第二种理解:String对象中的value[]所指向的地址是常量池,常量池中存放的内容是不可修改的,所以String的value[]数组里存放的内容是不可修改的。value本身也是final不可修改,不能指向新的地址。所以要更改只能重新创建一个对象。
与上文这段代码对比:
//8. 一定要注意:value 是一个 final 类型, 不可以修改(需要功力):即 value 不能指向
// 新的地址,但是单个字符内容是可以变化
String name = "jack";
name = "tom";
final char[] value = {'a','b','c'};
char[] v2 = {'t','o','m'};
value[0] = 'H';
//value = v2; 不可以修改 value 地址
这里的只有value是final的,数组里面的内容是变量而不是常量。(参考上文图)
日期类
13.12 本章作业
public static String reverse(String str, int start, int end) {
//对输入的参数做一个验证
//老韩重要的编程技巧分享!!!
//(1) 写出正确的情况
//(2) 然后取反即可
//(3) 这样写,你的思路就不乱
if(!(str != null && start >= 0 && end > start && end < str.length())) {
throw new RuntimeException("参数不正确");
}