目前排名比较靠前的答案都回答得很浅显易懂了。

我这里给你一个最可靠的理论依据(虽然比较晦涩)。

Java语言规范(JavaSE 1.8版本)章节3.10.5中对此作了规范,因此所有的Java语言编译、运行时环境实现都必须依据此规范来实现。

里面有这么一句话Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

大意是:凡是内容一样的字符串常数,都要引用同一个字符串对象,换句话说就是内存地址相同。

原因是,其值为常量的字符串,都会通过String.intern()函数被限定为共享同一个对象。

具体也可以参考一下String.intern()函数的说明:String (Java Platform SE 8 )

上面的Java语言规范3.10.5里,还有一段代码例子。

package testPackage;

class Test {

public static void main(String[] args) {

String hello = "Hello", lo = "lo";

System.out.print((hello == "Hello") + " ");

System.out.print((Other.hello == hello) + " ");

System.out.print((other.Other.hello == hello) + " ");

System.out.print((hello == ("Hel"+"lo")) + " ");

System.out.print((hello == ("Hel"+lo)) + " ");

System.out.println(hello == ("Hel"+lo).intern());

}

}

class Other { static String hello = "Hello"; }

and the compilation unit:

package other;

public class Other { public static String hello = "Hello"; }

produces the output:

true true true true false true

从这段例子可以看出,凡是编译期能推断出值内容的字符串,都会在编译时变成字符串常量,从而享有上面提到的共享对象的待遇。而运算中间插入了变量,让编译器认为只有运行时才能判断其内容的字符串,则会在运行时产生新的对象。(倒数第二个输出false的情况。)

计算机世界的东西就是这样的,有人定下了规矩,大家就都得照规矩办。毕竟整个计算机世界都是人造出来的,也就是这个帝国是由人类的规矩构建的,无论这个规矩是合理的还是不合理如键盘排布,一旦定下来也就不得不遵从了。

于是,就出现了你提问中的现象。说白了,做Java的人强制如此的。当然,从规矩产生的原因上说,这个规矩是有利于改善性能的。

Java不是true值不变_Java语言中String a=a;String b=a; 为什么 a==b 值为 true?相关推荐

  1. php true to 1,PHP语言中,______函数能检测一个变量是否存在,返回true表示变量存在,false表示变量不存在;______函数可以删除一个指定的变量,没有返回值。...

    [单选题]A comparison of traditional pedagogy and language use in real life in ______ . [单选题]下颌下腺 [判断题]双 ...

  2. 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...

    [简答题]需求分析完整话术 [简答题] [单选题]适用于场地面积有限,集装箱吞吐量较大的水陆联运码头的起重机系统是( )系统 [单选题]利用叉车或半挂车.汽车承载货物,连同车辆一起开上开下船,到达目的 ...

  3. java中父类创建子类的语法_Java 语言中,所创建的子类都应有一个父类。( )_学小易找答案...

    [判断题]一个类可以实现多个接口,接口可以实现"多重继承". ( ) [简答题]报价议价环节话术 [单选题]定义一个公有double型常量PI,哪一条语句最好?( ) [论述题]展 ...

  4. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  5. java里面赋值运算符解释_Java语言中,赋值运算符是双目运算符。

    [判断题]Java编译器可以将Java字节码文件解释为二进制代码. [单选题] [单选题]为了能够使MCS-51单片机在正常工作中及时服务于多个外设,以下传送方式最适用的是(). [单选题]当使用AT ...

  6. java语言用数组接收字符_Java基础——数组应用之字符串String类

    字符串String的使用 Java字符串就是Unicode字符序列,例如串"Java"就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准J ...

  7. double取两位小数_Java语言中:float、double数据类型在内存中是如何存储的

    java语言中,float类型数字在计算机中用4个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float ...

  8. java后端怎么返回音频流_Java语言中的IO流read()方法返回值为什么是int而不是byte?...

    下面是read方法的API public abstract int read()throws IOException Reads the next byte of data from the inpu ...

  9. java 不可修改的集合对象_java集合:关于hashmap存储一个对象,中间改变对象的值,为什么再remove不能用新名字来删除...

    代码如下:publicclassDemo1{publicstaticvoidmain(String[]args){HashSetsc=newHashSet<>();bookbook1=ne ...

最新文章

  1. 如何释放指针又不影响内存数据_C# 内存机制 - 基础篇
  2. JavaScript设计模式与开发实践——JavaScript的多态
  3. 皮一皮:再一次,有钱人的世界我不懂...
  4. python中变量类型在程序中可以改变_Python中的变量和数据类型,python,及
  5. [USACO1.1]坏掉的项链Broken Necklace
  6. 变换编码(DCT)基本理解
  7. 4.extern关键字.rs
  8. 实战干货:基于Redis6.0 部署迷你版本消息队列
  9. 瑞星对Windows7捆绑杀毒软件等消息的回应
  10. Android Activity类详解
  11. 六石管理学:发现自己确实错了,怎么办
  12. Pycharm使用---Black代码格式化工具
  13. **MA2灯光控台的TIMECODE 说明**
  14. 优化理论10----约束优化的罚函数法、外点法(Penalty method)、内点法(**Barrier Methods**)、混合惩罚函数法
  15. HDU 4699 对顶栈
  16. docker之安装jdk8
  17. Codeforces 300D Painting Square dp
  18. CSR867x — sink工程的编译与下载(run)
  19. 移动端开发(学好移动端这一篇就够啦)
  20. 软件测试市场前景怎么样,软件测试的发展前景怎么样?

热门文章

  1. 云+X案例展 | 金融类:青云QingCloud助力泰康人寿云计算演进之路
  2. 刷爆了!GitHub标星1.6W,这个 Python 项目太实用!
  3. 雾计算精华问答 | 雾计算是如何构成的?
  4. 01let和const
  5. linux 开机启动设置密码,Linux下Redis设置密码及开机自启动
  6. java集合表_java集合类散列表
  7. python多线程操作字典_在Python中使用带有线程的全局字典
  8. 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
  9. RabbitMQ管控台操作手册
  10. flowable实战(三)flowable流程实例管理接口