一,String类的概述
1,String类在java.lang包下,所以使用的时候不需要导包
2,String类代表字符串,java程序中的所有字符文字(列如“abc”)都被实现此类的实列也就是说。java程序中所有的双引号字符串,都是String类的对象
3,字符串不可,它们的值在创建后不能被更改
二,String类的构造方法
具体运用如下代码;
package com.wedu.string;
public class Demo2StringConstructor {
/*
String类常见构造方法:
public String() : 创建一个空白字符串对象,不含有任何内容
public String(char[] chs) : 根据字符数组的内容,来创建字符串对象
public String(String original) : 根据传入的字符串内容,来创建字符串对象
String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
注意:
String这个类比较特殊, 打印其对象名的时候, 不会出现内存地址
而是该对象所记录的真实内容.
面向对象-继承, Object类
*/
public static void main(String[] args) {
// public String() : 创建一个空白字符串对象,不含有任何内容
String s1 = new String();
System.out.println(s1);
// public String(char[] chs) : 根据字符数组的内容,来创建字符串对象
char[] chs = {'a','b','c'};
String s2 = new String(chs);
System.out.println(s2);
// public String(String original) : 根据传入的字符串内容,来创建字符串对象
String s3 = new String("123");
System.out.println(s3);
}
三,创建字符串对象的区别
通过构造方法创建
通过new创建的字符串对象,每日一次New都会申请一个内存空间,虽然内容相同,,但地址不同
直接赋值方法创建
以“‘方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
而从上面两个创建方法中延申出对字符串的比较
所以,最后的内存结构如下:
-
== 比较基本数据类型:比较的是具体的值
-
== 比较引用数据类型:比较的是对象地址值
-
package com.wedu.stringmethod;
public class Demo1Equals {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ABC";
String s3 = "abc";// equals : 比较字符串内容, 区分大小写
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3)); - // equalsIgnoreCase : 比较字符串内容, 忽略大小写
System.out.println(s1.equalsIgnoreCase(s2));
}
}四,引用String 类型创建对象在内存中是如何分配内存?
-
列如:画出如下几行代码的内存(堆栈)结构:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
s1 += “world”;
-
在Java中,String对象是存储在堆(Heap)上的,而引用变量(如s1,s2,s3)是存储在栈(Stack)上的。下面是这几行代码的内存结构:
-
String s1 = "hello";
:在字符串常量池(String Constant Pool)中创建一个字符串对象,内容为"hello",然后在栈上创建一个变量s1,指向这个字符串对象。 -
String s2 = "hello";
:不会再创建新的字符串对象,而是在栈上创建一个变量s2,指向已经存在的字符串对象"hello"。 -
字符串常量池中有一个字符串对象"hello",被s2引用。
-
堆上有两个字符串对象,一个是"hello",被s3引用,另一个是"helloworld",被s1引用。
-
栈上有三个引用变量,s1指向"helloworld",s2和s3都指向"hello"。
-
-
String s3 = new String("hello");
:在堆上创建一个新的字符串对象,内容为"hello",然后在栈上创建一个变量s3,指向这个新的字符串对象。 -
s1 += “world”;
:在堆上创建一个新的字符串对象,内容为"helloworld",然后更新s1的引用,使其指向这个新的字符串对象。
-