Java中String的详细介绍和细节讨论。创建String对象的两种方式及不同之处。经典面试题1:String a = “hello“ + “ret“;创建了几个对象?...

1.基本介绍:

        (1)String类型的对象用于保存字符串,也就是一组字符序列。如:“ret”,"123","你好"...

        (2)字符串的字符使用Unicode字符编码,即一个字符(不区分字母和汉字)占两个字节

        (3)String的常用构造器有:String(),String(String original),String(char[] a)

,String(char[]a,startIndex,int count)

2.创建String对象的两种方式

        方式一:直接赋值:String s1 = "ret";

        方式二:调用构造器:String s2 = new String("ret") ;

上述两种创建String对象的方式是不同的 

        方式一:这种方式是通过字符串字面值直接创建String对象。Java中的字符串字面值被存储在一个被称为字符串池(String Pool)的特殊内存区域中。当创建一个字符串字面值时,JVM首先会检查字符串池是否已经有了相同内容的字符串,如果有,就会直接返回池中的引用,而不会创建新的对象。这种机制被称为字符串驻留(String Interning)

        方式二:这种方式通过new关键字显式地创建了一个新的String对象。不同于字符串字面值,这种方式会在堆内存中创建一个新的String对象,无论字符串池中是否已存在相同内容的字符串。所创建的对空间中里面有value属性,指向常量池,检查常量池中是否有“ret”,若有则直接通过value指向,若没有则在常量池中创建“ret”并让value指向创建的value。因此,即使内容相同,使用new关键字创建的String对象也会占用不同的内存空间

JVM的内存图:

 3.详细说明:

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

        (2)字符串常量池中的字符串对象是不可变的,即字符串对象的值不能被修改

代码:

String s1 = "ret";
s1 = s1.concat("ret"); // s1现在是"retret"

注:s1实际上并没有修改原始的字符串对象,而是创建了一个新的字符串对象"retret"并将其赋值给s1

经典面试题1:String a = "hello" + "ret";创建了几个对象?

        分析: 编译器会对字符串字面值进行编译时优化,将字符串拼接的操作直接计算出结果,然后将结果作为一个新的字符串字面值存储在字符串池中。因此,"helloret"这个字符串字面值在编译时就被创建并存储在字符串池中,而不是在运行时通过字符串拼接创建。故只创建了一个对象。

经典面试题2:String n1 = "hello"; String n2 ="ret"; String n3 = n1 +n2;创建了几个对象?

        共创建了3个对象。分析:第一个对象: "hello" 字符串字面值被创建并存储在字符串池中,然后变量 n1 引用这个对象。第二个对象: "ret" 字符串字面值被创建并存储在字符串池中,然后变量 n2 引用这个对象。第三个对象:当执行 String n3 = n1 +n2;时,执行时,实际上会被编译器转化为类似以下代码:StringBuilder temp = new StringBuilder();temp.append(n1);temp.append(n2);String n3 = temp.toString();最后,通过调用 temp.toString() 方法,StringBuilder 内部的字符数组会被转化为一个新的不可变的 String 对象,这个对象即为最终的拼接结果。

String中常用的方法:

代码:

public class StringMethods {
    public static void main(String[] args) {
        //1. equals方法,比较内容是否相同,区分大小写
        String str1 = "hello";
        String str2 = "Hello";
        System.out.println(str1.equals(str2));//false
        // 2.equalsIgnoreCase 忽略大小写的判断内容是否相等
        String username = "hello";
        if ("Hello".equalsIgnoreCase(username)) {
            System.out.println("Success!");//Success
        } else {
            System.out.println("Failure!");
        }
        // 3.length 获取字符的个数,字符串的长度
        System.out.println("ret".length());//3
        // 4.indexOf 获取字符在字符串对象中第一次出现的索引,索引从 0 开始,如果找不到,返回-1
        String s1 = "ret@ret123@456";
        int index1 = s1.indexOf('@');
        System.out.println(index1);// 3
        int index2 = str2.indexOf("ret");
        System.out.println(index2);//0
        // 5.lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从 0 开始,如果找不到,返回-1
        int index3 = s1.lastIndexOf('@');
        System.out.println(index3);//10
        // 6.substring 截取指定范围的子串
        String name = "hello,ret";
        //下面 name.substring(6) 从索引 6 开始截取后面所有的内容
        System.out.println(name.substring(6));//截取后面的字符ret
        //name.substring(0,5)表示从索引 0 开始截取,截取到索引 5-1=4 位置
        System.out.println(name.substring(2,5));//llo
        // 7.toUpperCase 转换成大写
        String s2 = "HeLLo";
        System.out.println(s2.toUpperCase());//HELLO
        // 8.toLowerCase
        System.out.println(s2.toLowerCase());//hello
        // 9.concat 拼接字符串
        String s3 = "ret1";
        s3 = s3.concat("ret2").concat("ret3");
        System.out.println(s3);//ret1ret2ret3
        // 10.replace 替换字符串中的字符
        s3 = "ret1ret2";
        //在 s3 中,将所有的ret1替换成ret2
        //注:s1.replace() 方法执行后,返回的结果才是替换过的。注意对s3没有任何影响
         s3 = s3.replace("ret1", "ret2");
        System.out.println(s3);//ret2ret2
        // 11.split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等
        String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦";
        // 注:以 , 为标准对 poem 进行分割 , 返回一个数组。在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \
        String[] split = poem.split(",");
        poem = "E:\\aaa\\bbb";
        split = poem.split("\\\\");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }
        // 12.toCharArray 转换成字符数组
        String s4 = "happy";
        char[] chs = s4.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            System.out.println(chs[i]);
        }
        // 13.compareTo 比较两个字符串的大小,如果前者大,则返回正数,后者大,则返回负数,如果相等,返回 0
        /*
            (1) 如果长度相同,并且每个字符也相同,就返回 0
            (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小
                就返回 if (c1 != c2) {
                        return c1 - c2;
                      }
            (3) 如果前面的部分都相同,就返回 str1.len - str2.len
         */
        String a = "ret1";
        String b = "rct1";
        System.out.println(a.compareTo(b)); // 返回值是 'e' - 'c' = 2 的值
        // 14.format 格式字符串
        /* 占位符有:
         * %s 字符串 %c 字符 %d 整型 %.2f 浮点型
         */
        String name1 = "ret";
        int age = 23;
        double score = 99.9;
        char gender = '男';
        /*将所有的信息都拼接在一个字符串.*/
        String info ="我的姓名是" + name1 + "年龄是" + age + ",成绩是" + score + "性别是" + gender;
        System.out.println(info);
        /*
        1. %s , %d , %.2f %c 称为占位符
        2. 这些占位符由后面变量来替换
        3. %s 表示后面由 字符串来替换
        4. %d 是整数来替换
        5. %.2f 表示使用小数来替换,替换后,只会保留小数点两位, 并且进行四舍五入的处理
        6. %c 使用 char 类型来替换
        */
        String formatStr = "我的姓名是%s 年龄是%d,成绩是%.2f 性别是%c";
        String info2 = String.format(formatStr, name, age, score, gender);
        System.out.println("info2=" + info2);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值