【Java开发】String类的两种实例化方法及字符串的比较==和.equals()区别 String类的特点

String类特点

String类直接实例化:String str = new String(“Hello World”);
String类的构造方法:public String(String str),构造里依然要接收一个本类对象;
构造方法实例化:String str =new String(“Hello World”);
字符串的比较==和.equals()
“==”会进行比较,但是不是比较字符串包含的内容,==主要是进行数值相等判断,会进行内存地址的数值比较,若想比较字符串的内容,可以使用String类里定义的.equals(String str)方法。
所以进行字符串相等比较,不可用= =

字符串常量就是String的匿名对象

实际上任何语言都没有提供字符串这一概念,很多语言是使用了字符数组来描述字符串的概念。在java里也没有字符串的概念,但是开发是离不开字符串应用的,那么最终的Java自己创造了字符串。但是字符串依然不属于基本数据类型,它是将字符串做为了String类的匿名对象的形式存在的。
例:
public class test1{
public static void main(String[] args) {
String str =“hello”; System.out.println(“hello”.equals(str));//true
}
}
【Java开发】String类的两种实例化方法及字符串的比较==和.equals()区别 String类的特点
所以所谓的直接赋值相当于给匿名对象设置了一个名字而已,但是唯一的区别是String类匿名对象是系统直=直接生成的不要用户创建。
为了避免空指向异常的出现,可以将字符串写在前面调用方法
比价下面两种方法:
1.
String input =null;//假定input为用户输入
//如果用户输入的是hello则满足条件。
if(input.equals(“hello”)){
System.out.println(input);
}
2.
String input =null;//假定input为用户输入
//如果用户输入的是hello则满足条件。
if(“hello”.equals(input)){
System.out.println(input);
}
可见,把字符串写在前面调用方法可以减少空指针的出现。所以,在开发过程中,若需要判断输入的内容是否是某一字符串,一定要把字符串写在前面调用equals()方法,这样不会出现空指针异常

String类两种实例化方法的区别:

1.分析直接赋值:直接赋值相当于给匿名对象设置了一个名字。 String 变量= 字符串常量;
此时内存中会开辟堆内存和一个栈内存指向堆内存。
直接赋相同值的String类对象的堆内存地址完全相同。

例如:
String str1=”hello”;
String str2=”hello”;
String str3=”hello”;
str1= =str2;
str1= =str3;
str2= =str3;
结果为:true,true,true.
此处介绍共享设计模式:
在JVM的底层会存在一个对象池(不一定只保存String对象),当代码之中使用了直接赋值的方式定义了一个String类对象时,会将次字符串对象使用的匿名对象入池保存,然后如果其他String类对象也采用了直接赋值的方法且内容相同时则不会开辟新的堆空间,而是使用已有的对象进行引用分配,从而继续使用。
2.构造方法实例化:一定要使用关键字new,一定会开辟新的堆内存空间,因为匿名对象也会开辟堆空间,所以会产生垃圾空间。
【Java开发】String类的两种实例化方法及字符串的比较==和.equals()区别 String类的特点
所以,构造方法实例化String类不仅浪费空间,其内容也不会自动保存在池中,若希望新开辟的内存数据也可以进行对象池的保存,可以使用String类提供的手动入池的方法:
public String intern();
例:String str1 =new String(“hello”).intern();//表示用构造方法定义新内存空间后入池。
区别总结:
直接构造:只会开辟一块堆内存空间,并且自动入对象池;
构造方法构造:会开辟两块内存空间,会产生垃圾空间,且不会自动入对象池,但是可以手动使用intern()方法入池。
所以通常使用直接构造,不采用构造方法构造。

字符串一旦定义则不可改变
在这里可能会产生疑惑,比如:
String str =”Hello”;
str = str+” World”;
str +=” !!!”;
System.out.println(str);
最终输出的会是”Hello World!!!”;
str 对象的内容是被改变了,但是下面通过内存关系来分析到底是怎么改变的。
【Java开发】String类的两种实例化方法及字符串的比较==和.equals()区别 String类的特点
可见,字符串内容并没有改变(Java定义好了String的内容不能改变),发生改变的是内存空间的指向,即字符串对象的内容变化是利用了引用关系变化而实现的,但是每一次变化都会产生垃圾空间(上图的红色框区域)。
例:
public class test1{
public static void main(String[] args) {
String str =null;
for (int i = 0; i <1000 ; i++) {
str +=i;//任何数据类型遇见String都会转化成String
}
System.out.println(str);
}
}
以上的代码修改了String对象的引用关系1000次,产生大量的垃圾空间所以此类代码在开发在开发中是严格禁止使用的,String的内容不要过多频繁的修改。