JAVA学习笔记-String类
Java字符串就是Unicode字符序列,例如字符串"Java"就是4个Unicode字符J,a,v,a组成的。
Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。
String str = new String("abcd");
String str2 = new String("abcd");
System.out.println(str.charAt(2));//charAt的含义是字符串中第2位的字符,所以输出结果为c;
System.out.println(str2.equals(str));//equals的含义为比较2个字符串是否相等,在源码里面,如果2个String变量指向的是同一个对象,那么直接返回ture;
System.out.println(str2==str);//结果为false,他们的内容虽然一样,但是都是new出来的一个实例,两者的地址不一致。
String str3 = "def";
String str4 = "def";
System.out.println(str3.equals(str4));//结果为ture,因为两者内容一致。但是在jdk源码中,检查机制是和上面的有些许区别的。具体可见jdk的equals源码。
System.out.println(str3==str4);//结果为ture,因为两者都指向了代码区的 "def",共用一个常量池"def",所以两者的地址是一致的。
System.out.println(str3.indexOf('e')); //找出'e'的索引位置,结果为1(因第一位'd'为0);如果不在有效范围内,结果会为-1;
String s = str3.substring(0);//从第0位开始截取到最后的字符串,返回一个新的字符串。
System.out.println(s);
String str5 = str3.replace('e','*');//替换字符串中的所有'e'字符为'*';
String str6 = "abcde,rrtt,cccee";
String[] strArray = str6.split(","); //split切割字符串,返回的是一个String数组。
for(int i=0;i<strArray.length;i++){ //这里的strArray.length的值为3,因为","把str6切成了3份
System.out.println(strArray[i]); //循环遍历strArray数组里面的字符串
}
String str7 = " aa bb ";
String str77 = str7.trim();//trim()为除去首尾空格并返回一个新的字符串;
System.out.ptintln(str77.length()); //长度为6
System.out.println("Abc".equalsIgnoreCase("abc"));//忽略大小写,比较2个字符串是否相等,显然结果为ture;
System.out.println("Abcbd".indexOf('b'));//从左向右的顺序开始检查字符'b',如果有则显示索引位置为1;
System.out.println("Abcbd".laseIndexOf('b'));//从右向左的顺序开始检查字符'b',如果有则显示索引位置为3;
System.out.println("Abcbd".startsWith("Ab"));//检查是不是以"Ab"开头。可见结果为真
System.out.println("Abcbd".endsWith("bd"));//检查是不是以"bd"结尾。可见结果为真
System.out.println("Abcbd".toLowerCase());//全部转换为小写字母;
System.out.println("Abcbd".toUpperCase());//全部转换为大写字母;
String gh = "a"; //截止到这句话,创建了一个"a",如果为String gh = new String("a"); 会被创建2个值:value:xxx 和 "a";
for(int i=0;i<10;i++){
gh += i;
}
System.out.ptintln(gh); //这里因String中的value值一旦被创建不可变,在这里遍历之后,会被创建11个对象。造成了内存的浪费,如果这里遍历n次(n的数目足够多),可想而知结果。
解决方法,可以参照StringBuilder和StringBuffer来解决。