[重走长征路]String字符串学习笔记

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
}
1、声明:
final:String是不可被继承的
Serializable :可以被序列话的接口 凡是实现此接口的对象可以通过网络或者本地流进行传输
Comparable<String>:凡是实现此接口的类 此对象可以比较大小
CharSequence:字符序列
1.2、内部声明的属性
jdk8中:
private final char value[];
存储字符串的容器
final:此处一旦指明,表示此value数组一旦初始化,其地址不可变
jdk9及以后:
private final byte[] value;
从char数组变成byte数组为了节省内存空间
2、字符串量存储位置
字符串常量都存储在字符串常量池中(StringTable)
字符串常量池不允许存两个相同的常量
字符串常量池在不同的jdk版本中 存放的地址不同
jdk7之前 存储在方法区
jdk7存放在堆中 原因是基于jdk基于gc考虑
3、String的不可变性理解
1、当需要重新赋值时 需要重新指定一个字符串常量的位置进行赋值,不能在原有的位置修改
2、当对现有的字符串进行拼接操作时 需要重新开辟空间保存拼接后的字符串不能在原有位置修改
3、当调用replace替换某个字符时,需要重新开辟新的空间保存修改后的字符
4、连接操作
(1)常量+常量  结果仍然在字符串常量池中 此时的常量有可能是常量 也有可能是final修饰的变量(有final修饰的属性就变成了常量了)
(2)变量+变量 或者 常量+变量 都会通过new Stringbulider tostring 返回的是新对象的地址 在堆中
(3)调用字符串的intern() 调用此方法 返回的是字符串常量池中的地址 如果常量池中没有就进行创建
 concat 拼接字符串 不管是参数调用还是常量调用 返回的都是新new的对象
@Test
    public void test02(){
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");

        System.out.println(s1==s2);//true
        System.out.println(s1==s3);//f
        System.out.println(s1==s4); //f
        System.out.println(s3==s4); //f

        System.out.println(s1.equals(s4)); //只比较值 是相等的 其他的都是相等的
        System.out.println();

        /**
         * String s3=new String("hello");
         * 内存解析 或者是 此代码在内存中创建了几个对象  2个 一个堆中的对象new String 堆中的对象指向”hello“
         */

    }
@Test
    public void test03(){
        String s1="hello";
        final String s11="hello";
        String s2="world";

        String s3="helloworld";
        String s4="hello"+"world";

        //s5 底层实际操作是 1、new StringBulider() 2、用StringBulider.Append(s1)利用append方法将s1加进去 再将”world“字符串加进去 3、调用tostring方法再将其返回给s5

        String s5=s1+"world";
        String s55=s11+"world";
        String s6="hello"+s2;
        String s7=s1+s2;
        System.out.println(s3==s4);//true
        System.out.println(s3==s5);//f
        System.out.println(s3==s6);//f
        System.out.println(s3==s7);//f
        System.out.println(s5==s6);//f
        System.out.println(s5==s7);//f

        String s8=s5.intern();//intern返回的是字符串常量池中的值
        System.out.println(s8==s3);
        System.out.println(s55==s3); //final修饰的变量 可以看做是常量
    }

5、String的常用方法

@Test
    public void test01(){
        /**
         * String与char相互转换
         */

        String s1="qwer";
        char[] chars = s1.toCharArray();
        System.out.println(chars);
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }
        /**
         * char转换数组 直接调用String方法构造器
         */
        String s = new String(chars);
        System.out.println(s);

    }
@Test
    public void test03(){

        //isEmpty()
        String s1 ="";
        String s2=new String();
        String s3=new String("");
        System.out.println(
                s1+s2+s3
        );//都是true,使用时必须是实例

        int length = s1.length();
        System.out.println(length);

        String s4="中国人民解放军";
        boolean china = s4.startsWith("中国");
        System.out.println(china);//以什么开始
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值