当前位置: 代码迷 >> 综合 >> 阶段一/常用工具/字符串
  详细解决方案

阶段一/常用工具/字符串

热度:44   发布时间:2023-12-07 01:22:51.0

目录

String

String的不可变性

常用方法

StringBuilder


 

String

String的不可变性

  • String 对象一旦被创建,则不能修改,是不可变的
  • 所谓的修改其实是创建了新的对象,所指向的内存空间不变
  • 用String操作字符串时,会产生很多中间变量,也会产生很多在常量池中废弃的数据
  • 应用场景:如果有少量字符串操作,可以使用String
  • String类型也有常量池的概念

常用方法

  • 方法equels()比较两个字符串内容是否相等,返回值是boolean类型的值;
  • 方法compareTo()比较两个字符串大小,返回值是int类型的值
public class StringDemo4 {public static void main(String[] args){// String 的不可变性// String 对象一旦被创建,则不能修改,是不可变的// 所谓的修改其实是创建了新的对象,所指向的内存空间不变String s1 = "imooc";// s1不再指向imooc所在的内存空间,而是指向了"hello,imooc"
//        s1 = "hello," + s1;String s2 = "hello," + s1;System.out.println("s1 = " + s1);System.out.println("s2 = " + s2);String s3 = new String("hello, imooc");// s3指向堆中的空间,// s3.substring(0, 5)得到的是hello,存储在常量池中,然后将常量池的hello输出System.out.println("子串:" + s3.substring(0, 5));System.out.println("s3 = " + s3);// concat,是把s4和s1的内容连接起来,然后把连接后的值输出,但是连接操作并没有改变s1和s4的值,s4的值还是hi,String s4 = "hi, ";System.out.println("s4.concat(s1):" + s4.concat(s1));System.out.println("s4: " + s4);}
}

输出

s1 = imooc
s2 = hello,imooc
子串:hello
s3 = hello, imooc
s4.concat(s1):hi, imooc
s4: hi, 

例子:关于常量池

  1. String str1 = "imooc";,在常量池放入"imooc",在栈空间给str1开辟一个空间,str1指向常量池的"imooc"
  2. String str2 = "imooc";,因为常量池中已经存在"imooc",无需再放入,在栈空间给str2开辟一个空间,所以直接让str2指向过去,即此时str2和str1指向的同一块空间
  3. String str3 = new String("imooc");,这边用了new关键字,在堆空间开辟一块空间,在栈给str3开辟空间,让str3指向堆中的空间,故和str1、str2不指向同一块空间
  4. String str4 = new String("imooc");,这边用了new关键字,在堆空间新开辟一块空间,在栈给str4开辟空间,让str4指向堆中的空间,故和str3不指向同一空间,每new一次,堆中就会开辟一个新的空间。
String str1 = "imooc";
String str2 = "imooc";
String str3 = new String("imooc");
String str4 = new String("imooc");

 

StringBuilder

  • String具有不可变性,用String操作字符串时,会产生很多中间变量
  • 也会产生很多在常量池中废弃的数据,使用StringBuilder可以避免这种情况。
  • String比StringBuilder的执行效率要低,因为在运行时产生一些String对象,这样会耗费一些时间
  • StringBuilder VS StringBuffer,二者基本相似,StringBuffer是线程安全的,StringBuilder则没有,所以性能略高。在执行速度熵:StringBuilder>StringBuffer
  • 应用场景:
    • 如果有少量字符串操作,可以使用String,否则使用StringBuilder
public class StringBuilderDemo1 {public static void main(String[] args){// 定义一个字符串"你好"StringBuilder str = new StringBuilder("你好");// 在"你好"后面添加内容,将字符串变成"你好,imooc"// 在原来的对象上进行更改,没有生成新的对象,也没有产生常量
//        str.append(',');
//        str.append("imooc!");
//        System.out.println(str);System.out.println("str = " + str.append(',').append("imooc!"));System.out.println("str = " + str);// 将字符串变成"你好,iMOOC!"/*** 两种方法:* 1、使用delete方法删除mooc,然后再插入MOOC* 2、使用replace方法直接替换*/
//        System.out.println("str = " + str.delete(4, 8).insert(4,"MOOC"));System.out.println("str = " + str.replace(4, 8, "MOOC"));//在字符串"你好,iMOOC"中去除"你好"并输出, substring的返回值是String类型System.out.println(str.substring(0, 2));}
}

输出:append、insert、delete等都是在现在的对象上操作的,不会产生新的对象

str = 你好,imooc!
str = 你好,imooc!
str = 你好,iMOOC!
你好

 

参考: 慕课网-Java工程师