Java不是true值不变_Java语言中String a=a;String b=a; 为什么 a==b 值为 true?
目前排名比较靠前的答案都回答得很浅显易懂了。
我这里给你一个最可靠的理论依据(虽然比较晦涩)。
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?相关推荐
- php true to 1,PHP语言中,______函数能检测一个变量是否存在,返回true表示变量存在,false表示变量不存在;______函数可以删除一个指定的变量,没有返回值。...
[单选题]A comparison of traditional pedagogy and language use in real life in ______ . [单选题]下颌下腺 [判断题]双 ...
- 在java语言中 ()方法是不可以继承的_Java 语言中,构造方法是不可以继承的。( )_学小易找答案...
[简答题]需求分析完整话术 [简答题] [单选题]适用于场地面积有限,集装箱吞吐量较大的水陆联运码头的起重机系统是( )系统 [单选题]利用叉车或半挂车.汽车承载货物,连同车辆一起开上开下船,到达目的 ...
- java中父类创建子类的语法_Java 语言中,所创建的子类都应有一个父类。( )_学小易找答案...
[判断题]一个类可以实现多个接口,接口可以实现"多重继承". ( ) [简答题]报价议价环节话术 [单选题]定义一个公有double型常量PI,哪一条语句最好?( ) [论述题]展 ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
- java里面赋值运算符解释_Java语言中,赋值运算符是双目运算符。
[判断题]Java编译器可以将Java字节码文件解释为二进制代码. [单选题] [单选题]为了能够使MCS-51单片机在正常工作中及时服务于多个外设,以下传送方式最适用的是(). [单选题]当使用AT ...
- java语言用数组接收字符_Java基础——数组应用之字符串String类
字符串String的使用 Java字符串就是Unicode字符序列,例如串"Java"就是4个Unicode字符J,a,v,a组成的. Java中没有内置的字符串类型,而是在标准J ...
- double取两位小数_Java语言中:float、double数据类型在内存中是如何存储的
java语言中,float类型数字在计算机中用4个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float ...
- java后端怎么返回音频流_Java语言中的IO流read()方法返回值为什么是int而不是byte?...
下面是read方法的API public abstract int read()throws IOException Reads the next byte of data from the inpu ...
- java 不可修改的集合对象_java集合:关于hashmap存储一个对象,中间改变对象的值,为什么再remove不能用新名字来删除...
代码如下:publicclassDemo1{publicstaticvoidmain(String[]args){HashSetsc=newHashSet<>();bookbook1=ne ...
最新文章
- 如何释放指针又不影响内存数据_C# 内存机制 - 基础篇
- JavaScript设计模式与开发实践——JavaScript的多态
- 皮一皮:再一次,有钱人的世界我不懂...
- python中变量类型在程序中可以改变_Python中的变量和数据类型,python,及
- [USACO1.1]坏掉的项链Broken Necklace
- 变换编码(DCT)基本理解
- 4.extern关键字.rs
- 实战干货:基于Redis6.0 部署迷你版本消息队列
- 瑞星对Windows7捆绑杀毒软件等消息的回应
- Android Activity类详解
- 六石管理学:发现自己确实错了,怎么办
- Pycharm使用---Black代码格式化工具
- **MA2灯光控台的TIMECODE 说明**
- 优化理论10----约束优化的罚函数法、外点法(Penalty method)、内点法(**Barrier Methods**)、混合惩罚函数法
- HDU 4699 对顶栈
- docker之安装jdk8
- Codeforces 300D Painting Square dp
- CSR867x — sink工程的编译与下载(run)
- 移动端开发(学好移动端这一篇就够啦)
- 软件测试市场前景怎么样,软件测试的发展前景怎么样?
热门文章
- 云+X案例展 | 金融类:青云QingCloud助力泰康人寿云计算演进之路
- 刷爆了!GitHub标星1.6W,这个 Python 项目太实用!
- 雾计算精华问答 | 雾计算是如何构成的?
- 01let和const
- linux 开机启动设置密码,Linux下Redis设置密码及开机自启动
- java集合表_java集合类散列表
- python多线程操作字典_在Python中使用带有线程的全局字典
- 不带头节点的链表有哪些缺点_14. 删除链表中重复的结点
- RabbitMQ管控台操作手册
- flowable实战(三)flowable流程实例管理接口