String本身是一个类本类。其它是一个char[]数组。
字符串为空的两种形式
1.表示引用为空: String str = null;——还没有初始化,没有分配内存空间。
2.表示空字符串: String str = “”;——已经创建了对象,已经分配了内存,但内存当中的内容为空。
String数据比较
1、“==”比较的是堆内存空间的地址。
2、“equals()”比较的是字符串的内容。
——————————————————————————————————————
实例化对象:
1、直接赋值
public static void main(String[] args) {
// TODO Auto-generated method stub
String name1="神仙姐姐";
String name2="神仙姐姐";
System.out.println("name1地址是否等于name2->"+(name1==name2));
}
//结果:name1地址是否等于name2->true
一个字符串就是一个String类的匿名对象。
String采用直接赋值,只要以后声明的字符串内容一样,就不会再去开辟新的堆内存空间。直接变换栈空间的引用地址。
2、构造方法完成实例化
public static void main(String[] args) {
// TODO Auto-generated method stub
String name=new String("神仙姐姐");
System.out.println("name->"+name);
}
会开辟两个内存空间,而只有一个是有效的(不推荐使用这种方式)
——————————————————————————————————————
字符串内容不能改变
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="神仙";
str=str+"姐姐";
System.out.println("str="+str);
}
//结果:str=神仙姐姐
实际情况内存分析:
String对象内容的改变是通过内存地址的“断开-连接”变化完成的,而本身字符串的内容没变化。
String中常用方法:
1、字符串——>字符数组:toCharArray()
2、从字符串中取出指定位置字符:charAt()
3、字符串<=>byte数组:getBytes()
4、取得字符串的长度:length()
取数组长度使用length,取字符串长度用length()方法
5、查找指点字符串是否存在:indexOf()
6、去掉左右空格:trim()
7、字符串截取:substring()
8、按照指定位置拆分字符串:split()
9、转换字符串大小写:toLowerCase()
11、不区分大小写比较字符串内容:equalsIgnoreCase()
12、将指定字符串替换为其他字符串:replaceAll()
引用传递
引用传递实际上就是将堆内存空间试用权交给多个栈内存空间。