zoukankan      html  css  js  c++  java
  • java学习-关于字符串String

    有必要总结记录一下java的学习,否则,永远只是记忆碎片化和always google(费时)

    刚好,小伙伴给了一份自己做的review,在学习的过程中,update一下自己的见解和学习内容;

    关于String:

     1 package string_keywords;
     2 /**
     3  * 参考url: http://developer.51cto.com/art/201106/266454.htm
     4  *
     5  * 常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
     6  *
     7  * 当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量;
     8  *   多个常量连接;如果是像代码里s7的方式,字符串保存在堆?
     9  *
    10  * 当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
    11  *
    12  * http://www.importnew.com/10756.html
    13  *
    14  * */
    15 public class Demo1 {
    16     public static void main(String[] args) {
    17         String s1 = "abc";
    18         String s2 = "bcd";
    19         String s3 = s1; //引用赋值,相当于s3 也指向了“abc”这个地址
    20         String s4 = "abc";
    21         String s5 = new String("abc");
    22         String s6 = "ab"+"c";
    23         String s7 = new String("ab")+"c";
    24         String s10 = "c";
    25         String s11 = "ab"+s10;
    26         s1 += s2;//字符串的连接时,实际上是新开辟了一个字符串
    27         System.out.println(s1);
    28         System.out.println(s3);
    29         System.out.println(s1 == s3);
    30         System.out.println("s4==s3:"+(s4==s3)); //字符串常量池,s4 = "abc"实际上是指向了已有的abc的地址,因此用==判断时,指向一致,所以返回true
    31         System.out.println("s5==s3:"+ (s5==s3)); // new String 的方式不同于直接赋值(常量池),而是新开辟了一个空间,因此判断字符串是否相等一般采用equals方法
    32         System.out.println("s6==s3:"+(s6==s3)); //常量连接常量,还在常量池
    33         System.out.println("s7==s3:"+(s7==s3)); //new的方式,不再是常量
    34         String s8 = s4.intern();
    35         String s9 = s5.intern();
    36         System.out.println("s8==s3:"+(s8==s3));
    37         System.out.println("s8==s4:"+(s8==s4));//s4本来就是指向常量池的,返回的intern地址当然也就是本身了
    38         System.out.println("s9==s3:"+(s9==s3));// intern方法会去常量池查找是否存在该字符串常量,有则返回其地址,没有就加入常量池并返回地址
    39         System.out.println("s11==s3:"+(s11==s3)); //在运行时通过连接计算出的字符串是新创建的
    40         /*
    41         * 疑问: String s = "a" +"bc";
    42         * 我们知道a和bc是常量,abc存在于常量池,那么a和bc是否也存在于常量池?
    43         * 如何验证呢?
    44         *
    45         * 内存跟常量池是什么关系?
    46         * 为什么上述方式一般不推荐,而推荐使用StringBuffer,是因为扩大了常量池么?
    47         *
    48         * */
    49     }
    50 }

    intern()补充:

            String s8 = s4.intern();
            String s9 = s5.intern();
            System.out.println("s8==s3:"+(s8==s3));//true
            System.out.println("s9==s3:"+(s9==s3));//true

    目前存在的疑问是:

    1. 内存跟常量池的更深入理解

    2. intern()方法是否对常量池做的是一种动态的update?

  • 相关阅读:
    mybatis源码(八) Mybatis中的#{} 和${} 占位符的区别
    mybatis源码(七)mybatis动态sql的解析过程下篇
    mybatis源码(六)mybatis动态sql的解析过程上篇
    JDBC的API介绍
    mybatis源码(五)mybatis日志实现
    jmeter: 报错锦集
    python3升级后pip提示TLS/SSL错误问题
    Pytest+Jenkins+Allure
    建议
    Android Studio Button事件的三种方式
  • 原文地址:https://www.cnblogs.com/dont27/p/3807249.html
Copyright © 2011-2022 走看看