目录
一、两种实例化String对象
1、直接赋值
public class StringDemo01{
public static void main(String args[]){
String name = "直接赋值" ; //实例化String类对象
System.out.println("name的值为 " + name) ;
}
};
2、通过关键字New
public class StringDemo02{
public static void main(String args[]){
String name = new String("new关键字") ; //实例化String类对象
System.out.println("name的值为" + name) ;
}
};
两种方法效果一样,程序均正常执行,下文将对此两种方法进行对比
二 、String 内容的比较
public class StringDemo04{
public static void main(String args[]){
String str1 = "hello" ; // 直接赋值
String str2 = new String("hello") ; // ͨnew关键字赋值
String str3 = str2 ; // 传递引用
System.out.println("str1 == str2 --> " + (str1==str2)) ; // false
System.out.println("str1 == str3 --> " + (str1==str3)) ; // false
System.out.println("str2 == str3 --> " + (str2==str3)) ; // true
}
};
程序运行结果:
从程序运行结果可以发现,String的内容都一样,但比较的结果却是有的相等,有的不等,此时,进行内存分析如下
使用 " == " 比较,判断的是内存地址是否相等,判断的是地址值
如果想要判断其内容是否相等,则就需要使用 String 类中提供的 equals() 方法完成,代码如下:
public class StringDemo05{
public static void main(String args[]){
String str1 = "hello" ; // 直接赋值
String str2 = new String("hello") ; // ͨnew关键字赋值
String str3 = str2 ; // 传递引用
System.out.println("str1 equals str2 --> " + (str1.equals(str2))) ; // true
System.out.println("str1 equals str3 --> " + (str1.equals(str3))) ; // true
System.out.println("str2 equals str3 --> " + (str2.equals(str3))) ; // true
}
};
程序运行结果:
小结:String 有两种比较方式
- 一种是使用 " == " 进行比较,比较的是 地址值
- 另一种是使用 " equals() " 方法比较,比较的是具体的内容,开发中比较常用
三 、两种实例化方式的区别
1、
public class StringDemo06{
public static void main(String args[]){
System.out.println("hello".equals("hello")) ; //true
}
};
以上代码运行结果:
一个字符串可以直接调用 String类中的方法,说明了 一个字符串就是String类的匿名对象
2、
public class StringDemo07{
public static void main(String args[]){
String str1 = "hello" ; //直接赋值
String str2 = "hello" ; //直接赋值
String str3 = "hello" ; //直接赋值
System.out.println("str1 == str2 --> " + (str1==str2)) ; // true
System.out.println("str1 == str3 --> " + (str1==str3)) ; // true
System.out.println("str2 == str3 --> " + (str2==str3)) ; // true
}
};
以上代码运行结果为: ,说明 三个对象内存地址一样 ,内存分析如下
使用直接赋值的方式实例化String类 可有效节省内存,当内容重复时,对象将指向已存在的实例空间
3、
public class StringDemo08{
public static void main(String args[]){
String str1 = new String("hello") ;
}
};
使用 newString() 方式则意味着 即使内容相同,仍会开辟新的内存空间
在开发中,最好使用直接赋值的方式
四 、字符串的内容不可改变
在使用String类进行操作时,有一个特性,那就是 字符串内容一旦声明则不可改变
public class StringDemo09{
public static void main(String args[]){
String str = "hello" ; // 声明字符串
str = str + " world!!!" ; // 修改字符串
System.out.println("str = " + str) ;
}
};
程序运行结果:
从结果来看,内容可以修改,但实际上改变的是堆内存地址的指向
五 、小结
- String 类要使用 直接赋值 的方式实例化对象,因为使用 new 会开辟新空间,造成内存浪费
- 一个字符串就是 String 类的匿名对象
- 字符串的比较有两种方式: == 和 equals()