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

目录

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工程师

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值