常用类-String

2.String

2.1 String的理解和创建对象

  1. String对象用于保存字符串,也就是一组字符序列

  2. 字符串常量对象是用双引号括起来的字符序列,如"你好"、"12.9"

  3. 字符串的字符使用Unicode字符编码,一个字符(无论字母还是汉字)占两个字节

  4. String类有很多的构造器,构造器的重载

    较常用的构造方法

    String s1 = new String();
    String s2 = new String(String original);
    String s3 = new String(char[] a);
    String s4 = new String(char[] a,int startIndex,int count);
    String s5 = new String(byte[] b);
    
  5. String类实现了接口Serializable:String可以串行化,可以进行网络传输

    String类实现了接口Comparable:String对象可以比较大小

    常用类2.1.1

  6. String是final类,不能被其他的类继承

  7. String有属性,private final char value[];用于存储字符串内容

  8. 一定要注意:value是一个final类型,不可修改其地址(具体字符可以修改)

2.2 创建String对象的两种方式

方式一:直接赋值

String s = "hsp";

先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。

s最终指向的是常量池的空间地址

![常用类 2.2.1](D:\桌面\博客\picture\常用类 2.2.1.png)

方式二:调用构造器

String s = new String("hsp");

先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池没有"hsp",重新创建;如果有,直接calue指向

最终指向的是堆中的空间地址

![常用类 2.2.2](D:\桌面\博客\picture\常用类 2.2.2.png)

课堂测试:

String a = "abc";
String b = "abc";
System.out.println(a.equals(b));  //true;比较的是value数组
System.out.println(a == b); //true;两者在常量池中的地址相同
String a = "hsp";
String b = new String("hsp");
System.out.println(a.equals(b)); //true
System.out.println(a == b); //false;堆的地址和常量池的地址不相同

//intern()方法是返回字符串数据在常量池中的地址
System.out.println(a == b.intern()); //true
System.out.println(b == b.intern()); //false
Person p1 = new Person();
p1.name = "hspedu";
Person p2 = new Person();
p1.name = "hspedu";

System.out.println(p1.name.equals(p2.name)); //true;比较内容
System.out.println(p1.name == p2.name)); //true
System.out.println(p1.name == "hspedu"); //true

String s1 = new String("bcde");
String s2 = new String("bcde");
System.out.println(s1 == s2); //false
//画出内存布局图

![常用类 2.2.3](D:\桌面\博客\picture\常用类 2.2.3.png)

2.3 String对象的特性

String是一个final类,代表不可变的字符序列

字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的

//以下语句创建了几个对象
String s1 = "hello";
s1 = "haha";

//创建了两个对象
//注意"hello"和"haha"属于字符串对象,内容不可变,所以"haha"需要重新在常量池创建
//但对于是s1这个String,不可修改其地址,具体字符可以修改(相当于不换地址换指向)

![常用类 2.3.1](D:\桌面\博客\picture\常用类 2.3.1.png)

//以下语句创建了几个对象
String a = "hello" + "abc";

//创建一个对象
//编译器不是傻子,可以优化==>String a = "helloabc"
//以下语句创建了几个对象
String a = "hello";
String b = "abc";
String c = a + b;

//String c = a + b;
//1.先创建一个StringBuilder sb = new StringBuilder()
//2.执行sb.append("hello")
//3.执行sb.append("abc")
//4.String s = sb.toString()
//最后其实是c指向堆中的对象(String) value[] ->池中的"helloabc"

![常用类 2.3.2](D:\桌面\博客\picture\常用类 2.3.2.png)

重要规则:

String s1 = "ab" + "cd",常量相加,看的是池;String s2 = a +b,变量相加,是在堆中

public class Test1{
    String str = new String("hsp");
    final char[] ch = {'j','a','v','a'};
    public void change(String str,char ch[]){
        str = "java";
        ch[0] = 'h';
    }
    public static void main(String[] args){
        Test1 ex = new Text1();
        //调用方法会产生新栈,新栈随着方法结束而结束
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + "and");
        System.out.println(ex.ch)
    }
}

常用类 2.3.3

2.4 String类的常见方法

String类是保存字符常量的。每次更新需要重新开辟空间,效率比较低。所以设计StringBuilder和StringBuffer增强功能提高效率

  • equals // 区分大小写,判断内容是否相等

  • equalsIgnoreCase //忽略大小写的判断内容是否相等

  • length // 获取字符的个数,字符串的长度

  • indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1

  • lastindexOf //获取字符在字符串中最后1次出现的索引,索引从0开始,如找不到,,返回-1

  • substring //截取指定范围的子串

    String name = "hello,张三";
    name.substring(6); //索引6开始截取的字符串
    name.substring(0,5); //索引0开始截取,截取到索引5-1的位置(前开后闭)
    
  • trim //去前后空格

  • charAt:获取某索引处的字符,注意不能使用Str[index]这种方式(即不能当作数组直接获取,如str[0])

第二组String相关的方法:

  • toUpperCase //转化成大写

  • toLowerCase //转换成小写

  • concat //拼接字符串

    String name = "hello,张三";
    s1 = s1.concat("你好").concat("我是李四");
    
  • replace 替换字符串中的字符

    1. 注意,s1.replace方法执行后,返回的结果如果用s1接收,s1才是被替换过的
    2. 否则对s1没有任何影响
  • split 分割字符串,对于某些分割字符,我们需要 转义比如|\\等

    String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆件路径";
    String[] split = poem.split(","); //以逗号分割
    
    String poem = "E:\\aaa\\bbb";
    String[] split = poem.split("\\\\"); //对字符串进行分割时,如果有特殊字符,需要加入转义符\
    //输出E:  aaa    bbb
    
  • compareTo //比较两个字符串的大小,前大返回正数;后大返回负数;相等则为0

    1. 长度一样:返回两值差
    2. 长度不同:返回长度差
  • toCharArray //转换成字符数组

  • format//格式字符串,%s字符串%c字符%d 整型 %.2f浮点型

posted @ 2025-08-20 17:11  lu璐  阅读(10)  评论(0)    收藏  举报