JAVA String类
创建字符串
创建字符串有两种方式:
1.直接创建
2.引用对象创建
String s1 = "lalala"; // String 直接创建
String s2 = "lalalala"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("lalala"); // String 对象创建
String s5 = new String("lalala"); // String 对象创建
public class StringDemo {//String类构造方法来初始化字符串
public static void main(String[] args) {
char[] helloArray={'a','b','c','d'};
String helloString=new String (helloArray);
System.out.println (helloArray);
}
}
注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了
字符串长度
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
public class StringDemo1 {
public static void main(String[] args) {
String site="www.baidu.com";
int len=site.length ();
System.out.println ("输出的字符串长度为"+len);
}
}
那么length() 方法,length 属性和 size() 方法有什么区别呢?
1、length() 方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
2、length 属性是针对 Java 中的数组来说的,要求数组的长度可以用其 length 属性;
3、Java 中的 size() 方法是针对泛型集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!
下面举一个例子
ublic class StringDemo1 {
public static void main(String[] args) {
String array[]={"one","two","three"};
String A="HelloWorld";
List<String> list=new ArrayList<String> ();
list.add (A);
System.out.println ("数组array的长度为"+array.length);
System.out.println ("字符串的长度为"+A.length ());
System.out.println ("list中元素个数为"+list.size ());
}
}
输出结果为:数组array的长度为3
字符串的长度为10
list中元素个数为1
String类常见的问题
String s1 = "abc"; // 常量池
String s2 = new String("abc"); // 堆内存中
System.out.println(s1==s2); // false两个对象的地址值不一样。
System.out.println(s1.equals(s2)); // true
String s1="ab";
String s2="abc";
String s3=s1+"c";
System.out.println(s3==s2); // false
System.out.println(s3.equals(s2)); // true
先在常量池中创建 ab ,地址指向 s1, 再创建 abc ,指向 s2。对于 s3,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s3。故 (s3==s2) 为 false。
public class Main {
public static void main(String[] args) {
String str1 = "hello world";
String str2 = new String("hello world");
String str3 = "hello world";
String str4 = new String("hello world");
System.out.println(str1==str2);//false
System.out.println(str1==str3);//true
System.out.println(str2==str4);//false
}
}
String str1 = “hello world”; 和 String str3 = “hello world”; 都在编译期间生成了字面常量和符号引用,运行期间字面常量 “hello world” 被存储在运行时常量池(当然只保存了一份)。通过这种方式来将 String 对象跟引用绑定的话,JVM 执行引擎会先在运行时常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。
众所周知,通过 new 关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过 new 来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。