public class StringTest {

/**
   * @param args
   */
  public static void main(String[] args) {
   test1();
   test2();
  
  
  }

private static void test2() {
   // TODO Auto-generated method stub
   String s1 = "kvill";
   String s2=s1.intern();
   System.out.println( s1==s1.intern() );
   System.out.println( s1+" "+s2 );
   System.out.println( s2==s1.intern() );
  }

result:

true
kvill kvill
true

private static void test1() {
   // TODO Auto-generated method stub
   String s1 = new String("kvill");
   String s2=s1.intern();
   System.out.println( s1==s1.intern() );
   System.out.println( s1+" "+s2 );
   System.out.println( s2==s1.intern() );
  }

result:

false
kvill kvill
true
  /**
   * 说明:从上面的结果可以看出,针对语句string str = "abc"而言,它在编译期的时候就会检查常量池,是否有“abc”这个字符串是否存在,
   * 不存在就添加进去,存在就不创建对象的引用(引用1),这种方式创建的字符串对象在底层可能也是以类“String”的方式来创建对象;
   * 针对于语句String str = new String("abc")来说,在编译期是不会创建对象的,而且,到了运行期,当执行了s2 = s1.intern()
   * 方法后,s1!=s2说明,new String()这个对象存储的其实不是“abc”这个常量,而是“abc”这个常量的引用(引用2)
   *
   *
   * intern方法将返回常量字符串的引用(引用1),可以看出这里的“常量”字符串引用和string的引用(引用2)是不同的
   *
   *
   * 猜想:我想为什么会出现上面的情况,那是因为new string中存储的可能是“abc”这个常量的“真身”,到了运行期的某个时期,JVM就会将
   * 这个真身“复制”(可能不是复制)到常量池中,然后再销毁这个“真身”,这时候,他们指向的就是一个对象引用了。
   */

不过总觉得想到了,却还差点什么,希望大神们看看,给我一些新的提示!

java中关于string类和常量池的一点猜想的更多相关文章

  1. String类、常量池、字符串比较

    String类.常量池.字符串比较 一:String类           1.String类又称作不可变字符序列           2.String位于java.lang包中,Java程序默认导入 ...

  2. 关于Java中的String类知识点小总结

    Java中的String类知识点 前言 在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 如何创建字符串 最简单的方式 String str = "he ...

  3. JAVA中的String类(详解)

    Java.lang.String类是final类型的,因此不可以继承这个类.不能修改这个类.String是一个类不属于基本数据类型. 可以从源码中看到,String是一个final类型. String ...

  4. java中的String类常量池详解

    test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[ ...

  5. JAVA中String类以及常量池和常用方法

    一.String类的定义 String类特点:String 代表字符串.java程序中所有的字符串文字(例如:"abc")都被实现为String类的子类 String类特点:长度不 ...

  6. Java中的String类

    /*String类用于描述字符串事物的那么它就提供了多个方法对字符串进行操作 方法都会用,字符串这块就结束了常见的操作有哪些?“abcd”它应该具备什么功能,我们才能更好得操作它?1.获取(必须要掌握 ...

  7. Java中堆、栈、常量池分析

    栈用于存储局部变量,包括基本类型的变量(方法语句块内部定义的变量.方法中的形参).引用类型的变量,它们都是存储在各自的方法栈中,随着方法的执行完成而消失: 堆用于存储引用类型变量所指向的对象,包括普通 ...

  8. 为什么Java中的String类是不可变的?

    String类是Java中的一个不可变类(immutable class). 简单来说,不可变类就是实例在被创建之后不可修改. 在<Effective Java> Item 15 中提到了 ...

  9. java中的String类的不可变性的小例子

    在java语言中,String类具有不可变性,即常量字符串不可更改.下面的一个小例子简单演示相关概念. public class test { public static void main(Stri ...

随机推荐

  1. rabbitMQ报错:Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method:

    1.输入的机器的 IP:15672进入Raabitmq的登陆管理界面 点击admin,进去点击set permission ok, 在运行应该就不会包这个错了

  2. C# WINFORM进销存系统开发(内涵免费源码+部分实操视频讲解)

    互联网的时代,电商火爆,大家都开始进行线上销售货品,那你是如何管理你的商品库存和进销问题?软积木--小敏用的是C# WINFORM进销存系统来管理我的数据,给我带来了很多便利. 它是高频需求项目,很多 ...

  3. spring boot+vue实现H5聊天室客服功能

    spring boot+vue实现H5聊天室客服功能 h5效果图 vue效果图 功能实现 spring boot + webSocket 实现 官方地址 https://docs.spring.io/ ...

  4. 关于 RocketMQ 事务消息的正确打开方式 → 你学废了吗

    开心一刻 昨晚和一哥们一起吃夜宵,点了几瓶啤酒 不一会天空下起了小雨,哥们突然道:糟了 我:怎么了 哥们:外面下雨了,我老婆还在等着我去接她 他给了自己一巴掌,说道:真他妈不是个东西 我心想:哥们真是 ...

  5. Import “google/api/annotations.proto“ was not found or had errors.问题;proto 中外部引入proto文件问题解决方案

    问题 在proto 中引入了一些其他 proto 文件的情况下会出现was not found or had errors.问题 在使用Kratos框架时proto文件引入import "g ...

  6. 菜鸡的Java笔记 第二十五 wrapperClass 包装类

    wrapperClass 包装类         1.包装类的特点        2.装箱与拆箱操作        3.数据转型处理            内容        Object 类可以接收 ...

  7. c++ 中vector 常见用法(给初学者)

    c++ 中 vector vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capacity,表示当前vector在内存中申请的这片区域所能容纳的元素个数. ca ...

  8. [luogu7600]封闭道路

    对于确定的$K$,问题也可以看作每一个点最多选$K$条出边,并最大化选择的边权和 关于这个问题,有如下的树形dp-- 令$f_{k,0/1}$表示以$k$为根的子树中,根节点选择不超过$K/K-1$个 ...

  9. [atAGC013F]Two Faced Cards

    先对$c_{i}$离散到$[0,n]$上,并令$a_{i},b_{i},d_{i},e_{i}$对应到第一个大于等于他的数 考虑若$a_{n+1}$和$b_{n+1}$也已经确定如何做: 有一个$o( ...

  10. 解决FastJson中"$ref重复引用"的问题方法

    对象的引用重复使用造成了重复引用问题,Fastjson默认开启引用检测将相同的对象写成引用的形式: 1 2 3 4 5 {"$ref": "$"} // 引用根 ...