注意点:
(1) equals(Object anObject)方法和contentEquals(CharSequence cs)的不同是:设计不同,equals()是重写object类的而contentEquals()是String类自身的;
(2) String、StringBuffer、StringBuilder之间的区别:
- String类表示的是不可变的字符串,只有通过不断的创建对象来来达到改变数值的目的,耗内存,效率低;
- StringBuffer表示线程安全的可变序列,安全的用于多线程;
- StringBuilder类提供了与StringBuffer兼容的API,但不保证同步(指线程同步)。被单个线程使用的时候建议优先使用该类,一般它比StringBuffer要快;
- String类重写了equals()方法,而StringBuffer、StringBuilder没有重写;
- 三者都重写了toString()方法,但是重写的方式不同,String返回的是当前String实例的引用,Stringbuffer和StringBuilder返回的是一个当前对象缓冲区中所有字符内容的新的String对象;
// 创建一个字符串的对象,String是一个比较特殊的引用类型
// 第一种方式
String name = "admin"; // admin的对象,保存在常量池中。
// System.out.println(name.hashCode());
// 第二种方式
String newName = new String("guest");// 保存在堆内存中。
// String类的对象是不可修改(修改就是保证地址一致,内部不同)的。
name = "张三";// 这是重新引用了一个全新的字符串对象。
// System.out.println(name.hashCode());
// 对于String类的对象就没有修改的操作,只是重新的引用了一个对象,改变的地址。
System.out.println(name + "......." + newName);
// 为什么String类的对象不可以修改。
// 见源码: private final char value[];
// value是不可能完成动态数组的实现了。并不是因为是final修饰的原因。