关于String的总结

1String特性

在这里插入图片描述

1.1字面量的定义方式

在这里插入图片描述
字符串一经创建不可修改,例如给s1字符重新赋值,就是在方法区重新创建了一个hello,并且方法区也不会重复创建字符串。

1.2两种创建字符串方式的区别

在这里插入图片描述

  • 采用字面量赋值法,就是在常量池中创建一个字符串对象,而使用new对象的方式创建,是在堆中创建个对象,之后这个对象指向常量池中的字符串对象。
  • 使用new对象的方式创建字符串会创建两个对象(面试题)

1.3字符串对象的存储

在这里插入图片描述

  • 使用new的方式创建字符串对象后,其变量在栈中存储的是堆中对象的地址值,如s3的0x8899和s4的0x7777
  • 假设Person类具有name和age属性,以下存储过程如图:
    在这里插入图片描述
    p1.name == p2.name所比较的是对象中name属性的地址值,此时正好均指向方法区中的0x1111,一般==比较的是地址值,而equals比较的是字符串是否相同

1.4关于字符串拼接的注意点

  • 有关字符串拼接的内容看结论结合图理解即可
    在这里插入图片描述
  • 字符串与变量拼接的例子
    在这里插入图片描述
  • 但凡有变量的,其结果就会出现在堆中。此结论要注意一种特殊的形式,比如变量前面加了final,将其修饰为常量,此时拼接的话,其字符串对象仍然在常量池中,而不是堆中
final String a = "abc";
String b = a + "def";

1.5面试题

public class StringTest {
    String str = new String("good");
    char[] ch = { 't', 'e', 's', 't' };
    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'b'; }
    public static void main(String[] args) {
        StringTest ex = new StringTest();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str);
        System.out.println(ex.ch);
    }
}
//考察java值传递
/*
虽然方法中传入的是str引用类型,但是字符串具有不可变性,此时的str是方法中的形参str,与外部的str无关,因此str输出good
但是char型数组名代表的就是数组地址,有了地址值,则直接就是对数组进行改变,这点可参考c语言中的数组名传递机制
*/

2常用方法

2.1 第一部分

在这里插入图片描述

2.2 第二部分

在这里插入图片描述

2.3 第三部分

在这里插入图片描述

3String类型转换

3.1String与基本数据类型转换在这里插入图片描述

在这里插入图片描述

String a = "123";
int i = Integer.parseInt(a);
//此时调用Integer.parseInt方法转为基本类型
String s = String.valueOf(i);
//调用String的valueOf方法将其转为类对象

3.2String与字符数组转换

在这里插入图片描述

        String a = "abcde";
        //toCharArray将字符串转为字符数组
        char[] chars = a.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            System.out.print(chars[i]);
        }

        System.out.println();
		
        char []chars1 = {'a','b','c','d','e'};
        //String构造器将字符数组转为字符串
        String s = new String(chars1);
        System.out.println(s);

3.3String与字节数组转换

在这里插入图片描述

public class Persontest {
    public static void main(String[] args) {
        String a = "abc123";
        //将字符串转为字节数组
        byte[] bytes = a.getBytes();

        for (int i = 0; i < bytes.length; i++) {
            System.out.print(bytes[i]+" ");
        }

        System.out.println();

        //将字节数组转为字符串
        String s = new String(bytes);
        System.out.println(s);
    }
}

4 StringBuffer

4.1 特点

重点在于:可变
在这里插入图片描述
在这里插入图片描述

4.2 常用方法

在这里插入图片描述
在这里插入图片描述

4.3 String StringBuffer StringBuilder三者的对比

在这里插入图片描述

4.4面试题

4.4.1
public class Persontest {
    public static void main(String[] args) {

        String str = null;
        StringBuffer sb = new StringBuffer();
        sb.append(str);
        System.out.println(sb.length());
        System.out.println(sb);
        
        StringBuffer sb1 = new StringBuffer(str);
        System.out.println(sb1);
    }
}

输出结果:
在这里插入图片描述

  • 首先第一个输出是4的原因是源码里append()方法有一条语句,将null空值改写成了字符串"null",因此执行append()方法后长度为4
if(str == null){
	str = "null"
}
  • 最后报异常是因为,构造器里面还要去调用父类的构造器,不能传递空指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值