Java中字符串理解:
1.字符串不可变,它们的值在创建后不能被更改。
这里说的是,他们的值而不是地址值。
当我们使用String s = “hello”;语句创建字符串的时候,首先会去常量池中查找,如果有,就返回这个常量的地址,如果没有,在常量池中创建并返回。world也是这样的。比如这里的“hello”,一开始是没有的,所以要先创建,然后返回一个地址,比如0x01下一次,如果String s= “hello”;的时候,s指向的也会是这个0x01的地址。
String s = "hello"; //常量池中没有常量"hello"就创建,假设地址值为0x001 String s1 = "hello"; //在常量池中查找到"hello",因此s1也指向地址0x001 System.out.println(s==s1); //地址值相同,所以返回的结果为true System.out.println(s1.equals(s));//值相同,所以返回的结果为true
s += "world"//hello world
s+="world" =>"hello world" 在常量池创建一个0x03
之前的变量s会重新指向这个新的地址0x03,而不是原先的0x01 所以说字符串一旦被创建,值就不可改变 这里的值指的字符串本身的值,而不是地址值
String s2 = new String("hello");//存放在堆中 System.out.println(s2.equals(s));//比较值是否相同,返回为true System.out.println(s2==s);//比较两个对象地址值,返回false
new String()会在堆内存中创建对象,而引用变量String s1则会在栈里面被创建,然后s1指向堆内存中被创建的String对象
”hello“也会在常量池中被创建,然后new String()创建的String对象会指向”hello“的地址,比如0x001,而String对象本身在堆内存中的地址,假设为0x0001,两个地址是不一样的
因此,这里的引用变量s1指向的是堆内存中String对象地址0x0001,而不是直接指向常量池中”hello“的地址0x001
2.字符串常量相加与变量相加的区别
- 字符串如果是变量相加,是先开辟空间,然后再拼接
- 字符串如果是常量相加,是先加,然后再去常量池里找,如果找到了就返回,如果找不到就创建
String s1 = "hello"; String s2 = "world"; String s3 = "helloworld"; System.out.println(s3==(s1+s2)); //false System.out.println(s3==("hello"+"world")); //true
s3==(s1+s2)的结果是false,是因为变量相加是先在常量池中开辟空间,然后将拼接后的字符串放入开辟的空间之中,因此地址会改变。
s3==(“hello”+“world”)的结果是true,是因为常量相加,是先拼接,然后在常量池中查找,是否有拼接后的字符串,如果有就返回这个地址值,如果没有才会创建新的空间。因为之前s3已经创建了”helloworld“字符串,所以返回的是s3指向的这个地址。因此地址相同。
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = s1+s2;
String s5 = "helloworld";
System.out.println(System.identityHashCode(s3)); //第一行
System.out.println(System.identityHashCode(s4)); //第二行
System.out.println(System.identityHashCode(s5)); //第三行
第一行与第三行返回的值相同,说明s5优先指向的地址是s3一开始就创建的地址
3.创建字符串的四种方法
//创建字符串对象的四种方法
//public String():创建一个空白字符串对象,不含有任何内容 String s1 = new String(); System.out.println("s1:" + s1); //public String(char[] chs):根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs); System.out.println("s2:" + s2); //public String(byte[] bys):根据字节数组的内容,来创建字符串对象 byte[] bys = {97, 98, 99}; String s3 = new String(bys); System.out.println("s3:" + s3); //String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc String s4 = "abc"; System.out.println("s4:" + s4);
//显示结果
a1:abc
s2:abc
s3:abc
s4:abc
4.字符串常用的方法
String s = "abcde"
字符串的方法 解释说明
charAt(): 会根据索引获取对应的字符 s.charAt(i) i表示索引 length(): 会返回字符串的长度 s.length()
substring(start,end) 截取字符串 s.substrng(0,3) a b c
substring(start) s.substrng(1) bcde
replace(需要替换的文字,替换成的东西) s.replace('a','g') gbcde
5.StringBuilder与StringBuffer、StringJoin
StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("a").append("b").append("c"); System.out.println(stringBuilder.toString()); stringBuilder.reverse(); System.out.println(stringBuilder.toString()); abc cba
//1.创建对象 StringJoiner sj = new StringJoiner(", ","[","]"); //2.添加元素 sj.add("aaa").add("bbb").add("ccc"); int len = sj.length(); System.out.println(len);//15 //3.打印 System.out.println(sj);//[aaa, bbb, ccc] String str = sj.toString(); System.out.println(str);//[aaa, bbb, ccc]
在 Java 语言中,由于 String 类是final 类型的,所以使用 String 定义的字符串是一个常量,因此它一旦创建,其内容和长度是不可改变的。如果需要对一个字符串进行修改,则只能创建新的字符串。
解决方法:可以使用 StringBuffer 类(也称字符串缓冲区)来操作字符串。
说明:StringBuffer 类和 String 类最大的区别在于它的内容和长度都是可以改变的。StringBuffer 类似一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,因此并不会产生新的 StringBuffer 对象。
1.使用StringBuffer类的构造方法初始化字符串对象 StringBuffer 变量名=new String(字符串); 2.借助String类来创建StringBuffer类对象 String s="abc"; StringBuffer s5=new StringBuffer(s); 如果直接 StringBuffer sb = "abc";会报错
StringBuffer s1=new StringBuffer("abcd1234!?,;"); StringBuffer s2=new StringBuffer("987654321987654"); StringBuffer s3=new StringBuffer("987654321"); System.out.println("↓↓↓StringBuffer类的一些常用方法如下↓↓↓"); System.out.println("-----------------------------------------------------"); System.out.println("字符串s1的长度为:" + s1.length());//返回字符串的实际长度 System.out.println("-----------------------------------------------------"); System.out.println("字符串s1所占容器的大小为:" + s1.capacity());//返回字符串所占容器的总大小 System.out.println("-----------------------------------------------------"); System.out.println("获取字符串s1中第2个位置的字符:" + s1.charAt(2)); System.out.println("-----------------------------------------------------"); System.out.println("子字符串'654'第一次出现在字符串s2中的索引为:" + s2.indexOf("654")); System.out.println("从指定的索引6开始搜索,返回子字符串'654'第一次出现在字符串s2中的索引:" + s2.indexOf("654",6)); System.out.println("-----------------------------------------------------"); System.out.println("子字符串'987'最后一次出现在字符串s2中的索引为:" + s2.lastIndexOf("987")); System.out.println("从指定的索引5开始反向搜索,返回字符串'87'在字符串s2中最后一次出现的索引:" + s2.lastIndexOf("87",5)); System.out.println("-----------------------------------------------------"); s1.append('x');//在字符串s1的末尾添加字符'c' s1.append("Java");//在字符串s1的末尾添加字符串"Java" System.out.println("修改后的字符串s1为:" + s1); System.out.println("-----------------------------------------------------"); s1.insert(4,"abcd");//在第4个位置插入字符串"abcd" System.out.println("修改后的字符串s1为:" + s1); System.out.println("-----------------------------------------------------"); s1.deleteCharAt(1);//删除字符串s1中第一个位置的字符 s1.delete(2,5);//删除字符串s1中第2到第4个位置的字符 System.out.println("修改后的字符串s1为:" + s1); System.out.println("-----------------------------------------------------"); s1.replace(4,8,"5678");//将字符串s1中第4到第7个位置的字符串修改为"5678" System.out.println("修改后的字符串s1为:" + s1); System.out.println("-----------------------------------------------------"); s1.setCharAt(1,'b');//将字符串s1中第一个位置的字符修改为'b' System.out.println("修改后的字符串s1为:" + s1); System.out.println("-----------------------------------------------------"); s2.reverse();//将字符串s2反转 System.out.println("修改后的字符串s2为:" + s2); System.out.println("-----------------------------------------------------"); System.out.println("截取字符串s1从第4个位置开始到结尾:" + s1.substring(4)); System.out.println("-----------------------------------------------------"); System.out.println("截取字符串s1从第4个位置开始到第7个位置结尾:" + s1.substring(4,8)); System.out.println("-----------------------------------------------------"); System.out.println("获取s1的变量类型:" + s1.getClass().getName()); System.out.println("将对象信息转化为字符串:" + s2.toString());
↓↓↓StringBuffer类的一些常用方法如下↓↓↓ ----------------------------------------------------- 字符串s1的长度为:12 ----------------------------------------------------- 字符串s1所占容器的大小为:28 ----------------------------------------------------- 获取字符串s1中第2个位置的字符:c ----------------------------------------------------- 子字符串'654'第一次出现在字符串s2中的索引为:3 从指定的索引6开始搜索,返回子字符串'654'第一次出现在字符串s2中的索引:12 ----------------------------------------------------- 子字符串'987'最后一次出现在字符串s2中的索引为:9 从指定的索引5开始反向搜索,返回字符串'87'在字符串s2中最后一次出现的索引:1 ----------------------------------------------------- 修改后的字符串s1为:abcd1234!?,;xJava ----------------------------------------------------- 修改后的字符串s1为:abcdabcd1234!?,;xJava ----------------------------------------------------- 修改后的字符串s1为:accd1234!?,;xJava ----------------------------------------------------- 修改后的字符串s1为:accd5678!?,;xJava ----------------------------------------------------- 修改后的字符串s1为:abcd5678!?,;xJava ----------------------------------------------------- 修改后的字符串s2为:456789123456789 ----------------------------------------------------- 截取字符串s1从第4个位置开始到结尾:5678!?,;xJava ----------------------------------------------------- 截取字符串s1从第4个位置开始到第7个位置结尾:5678 ----------------------------------------------------- 获取s1的变量类型:java.lang.StringBuffer 将对象信息转化为字符串:456789123456789
标签:java,String,s1,System,字符串,------,println,out From: https://www.cnblogs.com/hellotoworld/p/18095535