一、String
1、String定义是指向堆内存中的引用;String的赋值本身是引用对象的切换,切换前后的对象依然存在;源码为:private final char value[];
2、对多个String对象进行+符号链接,其实是创建了一个StringBuilder对象,进行多个append,然后赋值给一个String对象。
3、常用方法
3.1、基于源码的 final char value[]特征:
- int length(); // 返回String长度,亦即value[]数组长度;
- char charAt(int index); // 返回指定位置字符;
- int indexOf(int ch, int fromIndex); //从fromIndex位置开始,查找ch字符在字符串中首次出现的位置。
- char[] toCharArray() ; // 将字符串转换成一个新的字符数组
3.2、字串相关的方法
- int indexOf(String str, int fromIndex) ;与indexOf含义相反有lastIndexOf(..),反向索引。
- boolean contains(String str); //实际上 contains内部实现也是调用的indexOf,然后将其结果与-1相比较。
- boolean startsWith(String str); // 判断字符串是否以str开头
- boolean endsWith(String str); //.....是否以str结尾
- String replace(CharSequence target, CharSequence replacement) ; // 替换
- String substring(int beginIndex, int endIndex); //字符串截取,不传第二个参数则表示直接截取到字符串末尾
- String[] split(String regex); // 字符串分割
3.3、String类重写了Object类的equlas方法,使得比较字符串内容是否相等可以直接使用equlas方法。
3.4、常量池概念:已有对象直接引用,除非对象创建时声明创建新的
1 String a = "abc"; 2 String b = "abc"; 3 System.out.print(a == b); //true 4 5 String a = "Hello"; 6 String b = new String("Hello"); 7 System.out.println(a == b); //false 8 System.out.println(a.equals(b)); //true
3.5、String是不可变字符串对象,StringBuilder和StringBuffer是可变字符串对象(其内部的字符数组长度可变),StringBuffer线程安全,StringBuilder非线程安全。
3.6、Java中的反射机制实现不可变字符串对象变化
1 public static void stringReflection() throws Exception { 2 3 String s = "Hello World"; 4 5 System.out.println("s = " + s); //Hello World 6 7 //获取String类中的value字段 8 Field valueField = String.class.getDeclaredField("value"); 9 10 //改变value属性的访问权限 11 valueField.setAccessible(true); 12 13 char[] value = (char[]) valueField.get(s); 14 15 //改变value所引用的数组中的第5个字符 16 value[5] = '_'; 17 18 System.out.println("s = " + s); //Hello_World 19 }
二、Object类
有12个方法:hashCode和equale函数用来判断对象是否相同,
wait(),wait(long),wait(long,int),notify(),notifyAll()
toString()和getClass,
clone() finalize()用于在垃圾回收