1.String类:即字符串类,其主要构造方法为:
String(String Original),把字符串封装成字符串对象;
举例:String s1 = new String(“hello”);
String(char[] value),把字符数组的数据封装成字符串对象;
举例:char[] chs = {‘h’,‘e’,‘l’,‘l’,‘o’};
String s2 = new String(chs);
String(char[] value,int index, int count),从索引index开始把count个字符数组值封装成字符串对象。
举例:char[] chs = {‘h’,‘e’,‘l’,‘l’,‘o’};
String s3 = new String(chs,1,3);
最为简单的一种方法是直接构造法:
举例:String s4 = “hello”;
2.new创建与直接赋值:针对创建的String类的对象,通过构造方法创建的String对象,存放在java虚拟机的堆内存,堆内存里存放的是字符串常量的地址,字符串常量存放在方法区的常量池中;通过直接赋值所创建的对象直接是方法区中的常量池中的字符串常量。而语句(s1==s2)是比较s1和s2中存放的地址,显然不相同,但是s2和s3的地址相同,则会得到true结果。其示意图如下图所示:
字符串的不变性
1.String类中定义了常量字符数组,一旦赋值,这个字符数组的值不能被改变
2.字符串修改值的时候,不是修改的字符串的本身,而是更新修改字符串的地址引用
3,经常需要变化的字符串建议使用StringBuffer定义
Java有垃圾回收机制,自动释放内存的资源
代码示例:
/**
* @author ZhangXiaoDie 2022/12/1 18:31
* @version 1.0
*/
public class StringTest01 {
public static void main(String[] args) {
/*字符串的不变性
1.String类中定义了常量字符数组,一旦赋值,这个字符数组的值不能被改变
2.字符串修改值的时候,不是修改的字符串的本身,而是更新修改字符串的地址引用
3,经常需要变化的字符串建议使用StringBuffer定义
Java有垃圾回收机制,自动释放内存的资源
* */
String str=new String("abc");
String s1="luck";//在内存中查找是否存在luck这个字符串,不存在则创建一个luck字符串,然后把该字符串地址放入s1栈内存中
String s2="luck";//在内存中查找是否存在luck这个字符串,存在则把该字符串地址放入s2栈内存中
System.out.println(s1==s2);
s1="jack";//不是修改s1地址映射的字符串的内容,重新在内存中查找字符串,存在就赋值,不存在就创建后赋地址
StringBuffer sb1=new StringBuffer("zhangsan");
sb1.append("xxx");
System.out.println(sb1);
}
}
String常用的方法:
int length():返回字符串的长度
char charAt(int index):返回指定索引处的字符
boolean isEmpty():判断字符串是否为空
String toLowerCase():将字符串中的所有字符转换为小写
String toUpperCase():将字符串中的所有字符转换为大写
String trim():返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):忽略大小写,比较字符串的内容是否相同
String concat(String str):将指定字符串连接到此字符串的结尾,等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回从beginIndex到末尾的子字符串
String substring(int beginIndex, int endIndex):返回从beginIndex到endIndex前一位的子字符串,不包括endIndex
boolean endsWith(String suffix): 判断字符串是否以指定的后缀结束
boolean startsWith(String prefix):判断字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):判断字符串在指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):判断当前字符串中是否包含指定的字符串
int indexOf(String str):返回指定子字符串在当前字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中第一次出现处的索引
int lastIndexOf(String str):返回指定子字符串在当前字符串中最后一次出现处的索引
int lastIndexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中最后一次出现处的索引
注:indexOf和lastIndexOf方法如果未查找到指定子字符串时,返回值都为-1。
String replace(char oldChar, char newChar):替换当前字符串中指定的子字符串
String[] split(String regex):根据指定的符号拆分当前字符串,然后返回一个String数组
个别使用方法代码的示例 如下:
/**
* @author ZhangXiaoDie 2022/12/1 18:47
* @version 1.0
*/
public class StringTest02 {
public static void main(String[] args) {
String s1="abc";//引用abc字符串的地址
System.out.println("s1:"+s1);//abc
String s2=new String();//创建一个空字符串
System.out.println("s2:"+s2);
String s3=new String("xyz");//引用堆中的xyz字符串地址
System.out.println("s3:"+s3);//xyz
byte[] bytes1={97,98,99,100,101,102};//byte的取值范围是:-128到127
String s4=new String(bytes1);//把字节整数数组按照ASCII码表解析成字符串
System.out.println("s4:"+s4);//abcdef
byte[] bytes2={97,98,99,100,101,102};//byte的取值范围是:-128到127
String s5=new String(bytes2,2,2);//对bytes2数组从索引2开始解析2个长度
System.out.println("s5:"+s5);//cd
char[] char1={'a','b','c','d','e','f'};
String s6=new String (char1);
System.out.println("s6:"+s6);
char[] char2={'a','b','c','d','e','f'};
String s7=new String (char2,2,2);
System.out.println("s7:"+s7);
}
}
/**
* @author ZhangXiaoDie 2022/12/1 18:59
* @version 1.0
*/
public class StringTest03 {
public static void main(String[] args) {
//方法调用:1,调用方法 对象.方法名();2,传入参数 3,接受方法的返回值
String s1="abcdef";
char ch1=s1.charAt(2);//获取字符串中指定索引位置的字母
System.out.println(ch1);
String s2=s1.concat("xyz");
System.out.println(s2);
boolean b1=s1.contains("x");
boolean b2=s2.contains("x");
System.out.println(b1);
System.out.println(b2);
String s3="zhangsan.jpg";
boolean b3=s3.endsWith(".jpg");//常用来判断文件名的后缀
System.out.println(b3);
byte[] bytes1=s1.getBytes();//把字符串按照ASCII码表解析成byte数组 bytes1={97,98,99,100,101,102}