1.String对象用于保存字符串,也就是一组字符序列。
2.String name = "aaa", "aaa"是字符串常量。双引号括起。
3 字符使用unicode字符编码,一个字符(不区分字符汉字)占两个字节。
4 常用构造器
String s1 = new String();//空
String s2 = new String(String s);
String s3 = new String(char[] a);
String s4 = new String(char[] a,int startIndex,int count) 指的是将数组从startIndex开始count个数的字符传入。
String s5 = new String(byte[] b)
5 String 类实现了Serializable,表示String 可以串行化(序列化),可以在网络传输。
实现了Comparable,对象可以比较大小。
6 String 是final类,不能被继承。
7 属性 private final char value[]用于存放字符串内容。
8 value 是final类型,不可以被修改地址,但是单个字符可以变化。
代码如下
String name = "jack";
name = "tom";
final char[] value ={'a','b','c'};
char[] v2 = {'t','o','m'};
char[] v3 = {'a','b'};
value[0] = 'H';
//value =v2;//不可改变地址。
v3 = v2;//不加final可以改变地址。
当然,String类的字符串不可变可以看我的另外一篇文章,这里不多说了。
intern方法
当调用intern方法时,返回的是常量池的地址。所以当a = new String("ab");
a != a.intern();
下面有几个问题。
以下语句创建了几个对象。
String s1 = "hello"; s1 = "haha";
首先常量池创建一个"hello"的地址,s1指向他。然后又创建了"haha"地址,然后s1又指向了"haha"
所以创建了两个对象。
String a = "hello" + "abc";
当看到这条语句时编译器会优化语句,会编译为String a ="helloabc";所以只创建一个对象。
String a ="hello";String b = "abc"; String c = a + b;
就结果来看是创建了三个对象。
过程中还创建过一个StringBuilder对象。先后执行两次append方法,最后执行toString方法才创建的c对象。内存图是。
看下面代码输出什么,可以画内存图。
成员变量和局部变量在内存的位置。
这个图看的有些混乱,但是当change方法出栈后,那么最后的输出为hsp and hava。
最后补充一点api方法。
String username = "jackttttt";
//1.equalsIgnoreCase忽略大小写,判断内容是否相等
System.out.println("Jack".equalsIgnoreCase(username));
//2.字符串长度
"success".length();
username.length();
//3.indexOf返回某字符第一次出现的索引,没有返回-1;
int index1 = username.indexOf('a');
int index2 ="ddbdf".indexOf('d');
//4.lastIndexOf和3对比,取最后一次出现的。
//5.substring截取子串
System.out.println(username.substring(2));//从索引为2向后取。
System.out.println(username.substring(2,5));//从索引2开取,到索引4,即[2,5)
//6.toUpperCase转大写,toLowerCase转小写。
username.toUpperCase();
//7.concat拼接
String username1 = username.concat("and").concat("tom");
//replace替换
String username2 = username.replace("a","j");//将a替换为j。
System.out.println(username);
//split分割字符串
String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒艰辛苦";
String[] split = poem.split(",");//通过逗号分割返回数组。
poem = "E:\\aaa\\bbb";
split = poem.split("\\\\");
for (int i = 0; i <split.length ; i++) {
System.out.println(split[i]);
}
//toCharArray转化成字符数组
char[] chars = username.toCharArray();
for (char aChar : chars) {
System.out.println(aChar);
}
//8.compareTo比较大小,
username.compareTo(poem);
//总结:两个字符串都从头开始比对。一旦遇到不一样的,就用第一个串的那个字符的值减去第二个字符串的那个值。
//当某个串个数不够了,就返回的是第一个串的长度减去第二个串的长度。
//9.format格式化
String name ="DaBao";int age = 18;double score = 9.550;char gender = '男';
//一般我们想到的可能是拼接。
String info ="我叫%s,我今年%d岁了,我的成绩是%.2f,我是个%c生";
//%s字符串,%.2f保留小数点后两位,%c字符
String infor = String.format(info,name,age,score,gender);
System.out.println(infor);
}