zoukankan      html  css  js  c++  java
  • 日常总结 -- 字符串池

    最近被人问到关于java字符串的问题,做了一点小的归纳
    先上经典代码:

      1.String a = "Hello";

      2.String b = "Hello";

      3.String c = new String("Hello");

      4.String d = new String("Hello");

      System.out.println(a == b);

      System.out.println(b == c);

      System.out.println(c == d);

      System.out.println(a.equals(b));

      System.out.println(b.equals(c));

      System.out.println(c.equals(d));

      这几行输出语句分别输出的是true,false,false,true,true,true.

      这里就有涉及到字符串池的问题了,java为了提高内存利用率而采取了字符串池这个手段。在遇到第一句话时,会自动在字符串池中寻找是否存在"Hello"对象,

    没有则创建;当第二句话执行时,再一次在字符串池中寻找这个对象,发现已经存在了,那么直接将变量b指向这个地址。那么第三和第四的语句又是怎么回事呢?

    因为其使用了new这个关键字,则不会去访问字符串池,而是先为变量 c 开辟空间,然后将值写入空间。对于java中两个String类型的比较,"=="比较的是地址,

    而equals比较的是值。那么不难得出,a和b指向的是同一个对象,地址相同,a==b返回true;b和c还有c和d指向的对象都不相同,那么他们使用"=="比较自然

    返回false。因为equals比较的是值,这里都是"Hello"所有后面三个返回的是true。

      总结(摘抄自网络):Java虚拟机有一个字符串池,保存着几乎所有的字符串对象。字符串表达式总是指向字符串池 中的一个对象。使用new操作创建的字符串

    对象不指向字符串池中的对象但是可以使用intern方法使其指向字符串池中的对象(注:如果池中已经有相同的 字符串--使用equals方法确定,则直接返回池中的

    字符串,否则先将字符串添加到池中,再返回)。池中两个相等的字符串如果使用“==”来比较将返回 真。

    String a = "Hello";

    String b = "Hello";

    String c = new String("Hello");

    String d = new String("Hello");

    System.out.println(a == b);

    System.out.println(b == c);

    System.out.println(c == d);

    System.out.println(a.equals(b));

    System.out.println(b.equals(c));

    System.out.println(c.equals(d));

  • 相关阅读:
    B
    A
    UVA
    马的移动(BFS) 详细注释 一个具有情怀的题目
    JAVA JDK 环境变量配置--简单图解
    linux系统(rpm与deb环境),JAVA JDK的配置
    Jmeter接口测试+压力测试+环境配置+证书导出
    LR访问Https接口
    GitHub linux 提交文件及403错误处理
    random模块写的验证码
  • 原文地址:https://www.cnblogs.com/zmc-change/p/5393306.html
Copyright © 2011-2022 走看看