public class HelloWorld {
public static void main(String []args) {
String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2);
}
}
上面代码运行结果为 false,由于 ” == “在比较时比较的是 string 对象的地址,将 “==”改成 str1.equals(str2)后,运行结果为 true, equals()方法比较的是 string对象地址所指向的内容。
public class HelloWorld {
public static void main(String []args) {
String str2 = new String("hello").intern();
String str1 = "hello";
System.out.println(str1 == str2);
}
}
上面代码运行结果返回值为 true ,由于String的两种实例化方法有区别
String采用了共享设计模式
String str1 = "hello";
采用直接赋值的模式进行实例化对象,该实例化对象将自动保存到对象池之中,若下次还采用直接赋值实例化对象,可以直接使用。
String str2 = new String("hello");
采用构造方法进行实例化,会开辟两块堆内存空间,有一块堆内存空间会成为垃圾空间。而且该字符串常量不会保存在对象池之中。
String str2 = new String("hello").intern();
该方法调用 intern()方法会手工入池。
String的两种不同实例化方法的区别
- 直接赋值 : 只会开辟一块堆内存空间,并且该字符串对象可以直接保存在对象池之中以供下次使用
- 构造方法赋值:会开辟两块堆内存空间,有一块堆内存空间会变成垃圾空间,而且不能保存在对象池之中,可以用 intern()方法手工入池。
字符串的底层实现是字符数组,由于数组长度在定义之后是不可变的,字符串长度不可改变。
字符串与字符数组转换
public class HelloWorld {
public static void main(String []args) {
String str = "hello";
char [] data = str.toCharArray();
for(int i=0;i<data.length;i++){
System.out.print(data[i]+",");
}
System.out.println();
System.out.println(new String(data));
System.out.println(new String(data,2,2));
}
}
输出结果为:
h,e,l,l,o,
hello
ll
字符串的比较
public class HelloWorld {
public static void main(String []args) {
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2));//区分大小写
System.out.println(str1.equalsIgnoreCase(str2));//不区分大小写
System.out.println("a".compareTo("A"));//大于的话返回正数
System.out.println("ab".compareTo("ab"));//相等的话返回0
System.out.println("AC".compareTo("ac"));//小于的话返回负数
}
}
运行结果为
false
true
32
0
-32