String类
String类属于引用数据类型,只是编译器对其做了特殊处理(使其和基本数据类型一样)。
注意:引用数据类型都可以使用"=="进行比较,只不过比较的并不是内容,而是地址的数值内容,利用这个特性我们可以判断两个不同名的对象是否指向同一块内存空间。
当我们要比较两个字符串是否相等的时候我们可以使用**equals()**方法进行比较。
字符串常量就是String的匿名对象。
关于String类实例化方式的分析:
一.直接赋值实例化String类对象的情况
例:
String string = "hello word";
二.构造方法实例化String类对象的情况
例:
String string = new String("hello word");
构造方法实例化String对象会造成空间的浪费,具体如下图所示:
除了内存空间的浪费之外,如果使用构造方法实例化String类对象,由于关键字new永远表示开辟新的堆内存空间,所以其内容不会保存在字符串的对象池中。
手工入池操作:
String string = new String("hello word").intern(); //使用intern()方法来手工入池
总结:String类的两种对象实例化方式的区别
- 直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池中以供下次重复使用;
- 构造方法:会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()方法手工入池;
String类采用的设计模式为共享设计模式。
在JVM底层实际上会存在一个对象池(不一定只保存String对象),当代码中使用直接赋值的方法定义一个String类对象时,会将此字符串对象所使用的匿名对象入池保存。如果后续还有其他String类对象也采用了直接赋值的方式,并且为同样的内容时,将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。
字符串一旦定义则不可改变
字符串的内容一旦定义则不可改变!!!你所以为的对字符串进行修改的操作其实只是修改了字符串对象的引用,并没有修改储存在堆内存中的字符串。
只能使用StringBuffer或StringBuider类来代替String类来进行字符串的修改操作。
String类的常用方法
- 返回指定索引对应的字符信息
public char charAt(int index)
- 将字符串以字符数组的形式返回
public char[] toCharArray()
- 进行相等判断,区分大小写
public boolean equals(String anObject)
- 进行相等判断,不区分大小写
public boolean equalsIgnoreCase(String anotherString)
- 判断两个字符串的大小(按照字符编码比较),此方法的返回值有三种结果(=0:表示两个字符串的内容相等、>0:表示大于的结果、<0:表示小于的结果)
public int compareTo(String anotherString)
- 判断指定内容是否存在
public boolean contains(String s)
- 由前向后查找指定内容的位置,如果查找到了则返回(第一个字母)的位置索引,如果找不到则返回-1
public int indexOf(String str)
- 用新的内容替换全部旧的内容
public String replaceAll(String regex,String replacement)
- 截取部分子字符串的数据
public String substring(int beginIndex,int endIndex)
- 按照指定的字符串进行全部拆分
public String[] split(String regex)
- 转小写
public String toLowerCase()
- 转大写
public String toUpperCase()
- 取得字符串长度
public int length()
- 数据入池
public String intern()
- 判断是否是空字符串(不是null,而是"",长度为0)
public boolean isEmpty()