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?

  • 相关阅读:
    Swift3 重写一个带占位符的textView
    Swift3 使用系统UIAlertView方法做吐司效果
    Swift3 页面顶部实现拉伸效果代码
    Swift3 倒计时按钮扩展
    iOS 获取当前对象所在的VC
    SpringBoot在IDEA下使用JPA
    hibernate 异常a different object with the same identifier value was already associated with the session
    SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
    SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)
    SpringCloud IDEA 教学 (四) 断路器(Hystrix)
  • 原文地址:https://www.cnblogs.com/dont27/p/3807249.html
Copyright © 2011-2022 走看看