一:String类的概述
1.String类在java.lang.String包下,代表字符串,java中所有的字符串常量都是String这个类的对象,如下图:
public class Main {
public static void main(String[] args) {
String str="abc";
int length = str.length();
System.out.println(length);
//输出结果为:3
}
}
在java.lang包下的类是不需要导包的;并且"abc"能调用方法,我们知道对象能调用方法,也从侧面证明了字符串常量是String这个类的对象。
2.字符串的内容是不可变的;即字符串的内容是不能被修改的;
String str1 = "abc";
String str2 = "cde";
System.out.println(str1 + str2);
//输出结果为:abccde
str1 = str2;
System.out.println(str1);
//输出结果:cde
这个过程中产生了三个字符串:分别是:abc,cde,abccde。我们可能会疑惑第二个输出结果,字符串的内容不是不可变吗?其实,没有改变str1这个字符串的内容,只是用str2这个字符串对象替换str1这个字符串对象,"abc"这个字符串没有改变。
二:创建对象
1.方法一:直接赋值
String str="abc";
2.方法二:用new关键字
先来看一下String这个类的构造方法
String() | 初始化一个新创建的 String 对象,使其表示一个空字符序列。 |
String(byte[] bytes) | 指定的 byte 数组,构造一个新的 String |
String(String original) | 初始化一个新创建的 |
String(char[] value | 指定的char类型的数组,构造一个新的String |
这只是几个常用的构造方法,其实还有很多构造方法,接下来用这些构造方法创建对象
String str="abc";
char[] ch={'a','b','c'};
byte[] bytes={97,98,99};
String s1 = new String();
String s2 = new String(str);
String s3 = new String(ch);
String s4 = new String(bytes);
三:字符串常量池
在JDK7及之前的版本中,字符串常量池位于方法区中。方法区是Java虚拟机中的一块内存区域,用于存储类的信息、静态变量、常量池等数据。其中,字符串常量池是方法区的一部分,用于存储字符串常量。
在JDK7以后,字符串常量池被移动到了堆内存中。这是因为在JDK7之前,字符串常量池位于方法区中,由于方法区的内存是有限的,如果程序中创建的字符串过多,可能会导致方法区内存溢出。
字符串常量池在内存中的位置:
认识了字符串常量池在内存中的位置后我们说一下下面代码的执行过程;
public class Main {
public static void main(String[] args) {
String str1="abc";
String str2 ="abc";
String str3 = new String("abc");
System.out.println(str1==str2);
System.out.println(str2==str3);
//输出结果:true
// false
}
}
大致过程如下:
(1):字节码文件被JVM虚拟机加载到方法区【代码执行过程中用到哪个类的字节码文件就加载哪个类的字节码文件】
(2):Main方法进栈;
(3)首先执行第一段代码:String str1="abc",先到字符串常量池中找是否有这个字符串"abc",刚开始是没有的 所以就在字符串常量池中创建了这个字符串,并将内存地址返回给 str1=【假设为:0x0011】;
(4).执行第二段代码:String str2="abc",同样到字符串常量池中寻找,当然这次有,直接返回内存地址str2=【0x0011】;
(5):执行第三段代码:有new关键字,直接在堆内存中开辟一个空间,并返回内存地址【假设为:0x0022】;
最终的内存图为:
因此可以得出结果: str1==str2【0x0011】 为 true
str2==str3 为 false
四:字符串中常用的方法
- length():返回字符串的长度。
- charAt(int index):返回指定索引位置的字符。
- indexOf(String str):返回指定子字符串在原字符串中第一次出现的位置。
- lastIndexOf(String str):返回指定子字符串在原字符串中最后一次出现的位置。
- substring(int beginIndex):返回从指定索引开始到字符串末尾的子字符串。
- substring(int beginIndex, int endIndex):返回从指定索引开始到指定索引结束之间的子字符串。
- toLowerCase():将字符串转换为小写形式。
- toUpperCase():将字符串转换为大写形式。
- trim():去除字符串首尾的空格。
- split(String regex):根据指定的正则表达式分割字符串,并返回一个字符串数组。
- equals(Object anObject):比较字符串是否相等。
- startsWith(String prefix):判断字符串是否以指定前缀开头。
- endsWith(String suffix):判断字符串是否以指定后缀结尾。
- replace(char oldChar, char newChar):用新字符替换字符串中的旧字符。
- contains(CharSequence s):判断字符串是否包含指定的字符序列
如有错误,欢迎大家指正;如果对你有帮助,那就点个免费的👍吧!