zoukankan      html  css  js  c++  java
  • String学习

    最近一直在复习以前的java基础知识,感觉有些东西都忘记了

    String可以说是一个很常用的类了,现在记录一下它的原理

    String(java.lang.String)

    关于String对象创建的问题

        @Test
        public void StringTest() {
            String str1 = "123";
            String str2 = "123";
            String str3 = new String("123");
            System.out.println(str1 == str2);
            System.out.println(str2 == str3);
        }
    true
    false
    运行结果

    解析:

     String str1 = "123";
    JVM会在常量池里查找是否有"123",没有就创建,有就不创建,并把地址返回给str1。因为刚开始常量池里没有,所以会创建。
    String str2 = "123";
    常量池粒已经有"123"了,所以不会创建对象,直接把常量池的中"123"的地址返回给str2。因此str1 == str2 结果是true
    String str3 = new String("123");

    先去常量池中查找有没有"123",因为已经存在所以不创建,但是因为这里是new所以会在中创建"123"对象并且把堆中对象的地址返回给str3。
    要注意这里返回的地址不是常量池中的是堆中的。因此str2 == str3 false

    那么上面的代码创建了几个对象呢?

    答案是2个,执行str1创建了一个,str3创建了一个。如果把String str3 = new String("123"),改成String str3 = new String("666"),答案就变成了创建了3个对象。因为常量池

    中还创建了一个。

    StringBuffer:线程安全,方法被synchorized修饰,因此是线程安全的

    StringBuilder: 线程不安全

    String是不可变字符串,因此每次+=的时候,都会在产生一个新的字符串

    StringBuffer,StringBuilder采用的是追加的形式,不会产生一个新的字符串

  • 相关阅读:
    七种数据类型
    js字符串解析成数字
    html节点操作与事件
    form表单的默认提交行为
    CSS中的各种width(宽度)
    Javascript读写CSS属性
    ECMAScript6新特性之Reflect
    ECMAScript6新特性之String API
    ECMAScript6新特性之Array API
    判断Javascript对象是否为空
  • 原文地址:https://www.cnblogs.com/amberbar/p/9864075.html
Copyright © 2011-2022 走看看