java - 工具类 - String
1.String类在java.lang中
2.实现了3个接口:Serializable,CharSequence,Comparable
3.创建:
String s = "aaa";
String s = new String();
String s = new String("aaa");
String s = newString(byte[] b); -----> 数字换成char然后拼起来
String s = newString(char[] b);
4.String的不可变特性:
长度和内容不可变,引用数组不可变。
package stringtest; public class StringTest { public static void main(String[] args){ String s1 = "aaa"; String a = s1; s1 = "bbb";//String每次赋值其实是新new了一个对象,因为本身本质是final char[]所以长度和内容不能改变。 String b = s1; System.out.println(a == b); TestClass tc1 = new TestClass(); tc1.s = "aaa"; TestClass c = tc1; tc1.s = "bbb";//一般的引用类变量则是堆内存空间指针,所以内容改变了本身地址并不会变。 TestClass d = tc1; System.out.println(c == d); } }
5.String类中的常用方法
package stringtest; public class StringTest { public static void main(String[] args){ String s1 = "aaa"; String a = s1; s1 = "bbb";//String每次赋值其实是新new了一个对象,因为本身本质是final char[]所以长度和内容不能改变。 String b = s1; System.out.println("a == b" + (a == b)); TestClass tc1 = new TestClass(); tc1.s = "aaa"; TestClass c = tc1; tc1.s = "bbb";//一般的引用类变量则是堆内存空间指针,所以内容改变了本身地址并不会变。 TestClass d = tc1; System.out.println("c == d" + (c == d)); //常用方法 //equals String s2 = new String("abc"); String s3 = new String(new char[]{'a','b','c'}); System.out.println("s2 == s3" + (s2 == s3)); System.out.println("s2.equals(s3)" + s2.equals(s3)); // 不管地址或者声明方法是否一样,只比较String存储的char[]的值 //hashcode // public static int hashCode(byte[] value) { // int h = 0; // for (byte v : value) { // h = 31 * h + (v & 0xff); // } // return h; // } //把String中每一个字符遍历,每次让h = 31 * h + 字符的字符码 System.out.println("a".hashCode()); System.out.println((int)('a'));//把char a强制转换为int可以知道它的字符码 //a的字符码为97,所以结果为97 System.out.println("ab".hashCode()); //a的字符码为97,b的字符码为98, // 第一次循环h = 31 * 0 + 97 = 97 // 第二次循环h = 31 * 97 + 98 = 3105 System.out.println(31 * 97 + 98); //compareTo //先找寻比较的字符串中较短的那个作为比较循环的次数,然后比较, System.out.println("abc".compareTo("abe")); //比较Char1[i] - Char2[i],c - e = -2 System.out.println("abcde".compareTo("ab")); //如果两个字符串长度不同,但是前半部分一样,则比较长度 5 - 2 = 3 System.out.println("abde".compareTo("abc"));// d - c = 1 //toString TestClass testToString = new TestClass(); System.out.println(testToString.toString()); //一般引用类的toString = 类名@hashcode int i = testToString.hashCode(); System.out.println(Integer.toHexString(i));//转化为16进制 //也可以用这个方法,后面参数是进制: System.out.println(Integer.toString(i,16)); String sToString = "a"; System.out.println(sToString.toString());//String的toString重写过,结果为char[]的值 //charAt System.out.println("abc".charAt(2));//返回char[2]的值 //length System.out.println("abc".length());//返回char[]长度 System.out.println(new char[]{'a','b','c'}.length);//注意和char[]的区别,数组的length是属性,String的是方法 //concat System.out.println("a".concat("bc"));//拼接“a”和“bc”,返回一个Stirng类型,与+效果相同,性能concat更好。 // 如果频繁拼接,最好使用StringBuilder(效率高)或者StringBuffer(更安全,适合多线程) StringBuffer sb1 = new StringBuffer("a"); StringBuffer sb2 = new StringBuffer("bc"); StringBuffer sb3 = sb1; sb1 = sb1.append(sb2);//append()用来拼接sb1 和 sb2 StringBuffer sb4 = sb1; System.out.println(sb3 == sb4); //如果是string的话,之前测试过会返回false,因为String不可变性,会让它每次改变时生成新的对象,而StringBuffer则是原基础拼接,所以效率更高。 //toLowerCase System.out.println("ABc".toLowerCase());//全部变成小写,常用来做比较 //codePointAt System.out.println("ABc".codePointAt(0));//返回char[2]的字符码值,A是65,a是97 //substring System.out.println("ABc".substring(1,2));//char[1] - char[2] 的截取 System.out.println("ABc".substring(1)); //从char[1]截取到最后 //split String[] sArr = "aaadbcd//dedfd".split("d"); //以d为分界线,分割string并返回分割后的数组 System.out.println(sArr.length); for(int j = 0 ; j < sArr.length; j++){ System.out.println("sArr中的第" + j + "个值=" + sArr[j] + "!!!"); } // 5 // sArr中的第0个值=aaa!!! // sArr中的第1个值=bc!!! // sArr中的第2个值=//!!! // sArr中的第3个值=e!!! // sArr中的第4个值=f!!! //结尾d后面并没有切割出"" sArr = "aaadbcd//dedfd".split("/"); //以d为分界线,分割string并返回分割后的数组 System.out.println(sArr.length); for(int j = 0 ; j < sArr.length; j++){ System.out.println("sArr中的第" + j + "个值=" + sArr[j] + "!!!"); } // 3 // sArr中的第0个值=aaadbcd!!! // sArr中的第1个值=!!! //中间两个//之间的""被切割了出来 // sArr中的第2个值=dedfd!!! sArr = "aaadbcd\\dedfd".split("\\\\"); //以d为分界线,分割string并返回分割后的数组 两个\\表示转义,String中\是特殊字符,不能存在。|也是特殊字符,需要用\\|来表示 System.out.println(sArr.length); for(int j = 0 ; j < sArr.length; j++){ System.out.println("sArr中的第" + j + "个值=" + sArr[j] + "!!!"); } // 2 // sArr中的第0个值=aaadbcd!!! // sArr中的第1个值=dedfd!!! sArr = "aaadbcd|dedfd".split("\\|"); //以d为分界线,分割string并返回分割后的数组 两个\\表示转义,String中\是特殊字符,不能存在。|也是特殊字符,需要用\\|来表示 System.out.println(sArr.length); for(int j = 0 ; j < sArr.length; j++){ System.out.println("sArr中的第" + j + "个值=" + sArr[j] + "!!!"); } // 2 // sArr中的第0个值=aaadbcd!!! // sArr中的第1个值=dedfd!!! //replace System.out.println("abcba".replace("b","abc"));//replace(old,new)替换 //aabccabca } }