String类
定义:在Java中,数组和String字符串都不是基本数据类型,它们被当作类来处理,是引用数据类型。引用类型(reference type)指向一个对象,不是原始值,指向对象的变量是引用变量。在java里面除去基本数据类型的其它类型都是引用数据类型,自己定义的class类都是引用类型,可以像基本类型一样使用。
1.实例化方式
l.直接赋值
eg:
String str = "hello world";//str是一个对象,所以"hello world"应该保存在堆内存中
System.out.println(str);
ll.构造法
eg:
String str = new String ("hello world");
System.out.println(str);
2. 字符串相等比较
eg:int类型比较
int a = 9;
int b = 9;
System.out.println(a == b);
输出如下:
eg:String类型比较
String str = "hi";
String str1 = new String("hi");
System.out.println(str == str1);
输出如下:
内存图分析如下:
== 本身是进行数值比较的,如果现在用于对象比较,那么所比较的就应该是两个对象所保存的内存地址数值比
较,而并没有比较对象的内容。
那么要想比较内容比较,则必须采用String类提供的equals方法。
eg:使用equals方法比较字符串内容
String str = "hi";
String str1 = new String("hi");
System.out.println(str.equals(str1));
输出如下:
#### String类中 == 和 equals的区别
1. ”==”:进行的数值比较,比较的是两个字符串对象的内存地址数值。
2. “equals()”:可以进行字符串内容的比较
3.实例化的区别
3.1采用直接赋值
String str1 = "hello";
String str2 = "hello";
String str3 = "hello";
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str2 == str3);
输出如下:
内存图分析如下:
在JVM底层上会自动维护一个对象池(字符串对象池),如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用;如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用
所谓的对象池是为了减少开销而存在的
3.2采用构造方法
String str = new String("hello");
如果使用String构造方法就会开辟两块堆内存空间,并且其中一块堆内存将成为垃圾空间。除了这一缺点之外,也会对字符串共享产生问题。
String类中两种对象实例化的区别
- 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
- 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用
intern()方法手工入池。
4.字符串不可变更
字符串一旦定义不可改变。所有的语言对于字符串的底层实现,都是字符数组,数组的最大缺陷就是长度固定。在定义字符串常量时,它的内 容不可改变。