网站首页 > java教程 正文
Java中的字面常量(区别于final创建的有名常量)通常会保存在常量池中,常量池可以理解为像堆一样的内存区域。但是常量池有一个特性就是,如果常量池中已存在该常量将不会再次为该常量开辟内存
还是看个程序:
package reverse; public class Reverse { public static void main(String[] args) { String s1="张汉青"; String s2="张汉青"; String s3=new String("张汉青"); System.out.println(""+(s1==s2)); System.out.println(""+(s1==s3)); System.out.println("-----------------------"); Integer I=Integer.valueOf(5); Integer J=Integer.valueOf(5); Integer Q=5; System.out.println(""+(I==J)); System.out.println(""+(J==Q)); System.out.println("-----------------------"); Integer k=Integer.valueOf(128); Integer g=Integer.valueOf(128); System.out.println(""+(k==g)); System.out.println("-----------------------"); Double d=12.5; Double e=12.5; System.out.println(""+(d==e)); } }
输出结果为:
s1所引用的字符串对象是字面常量,会存储在常量池,
s2所引用的字符串对象也是字面常量,而且常量“张汉青”在常量池中出现过,所以Java并不会为s2所引用的对象开辟新的内存而是让s2直接引用之前存在的"张汉青"
内存中的模拟:
所以s1==s2为true;
s3是用new创建的,该对象的内存应该位于堆;
所以s1==s3为false
除了String类的字面常量会用到常量池,Java基础类型的包装类也会用到常量池,包括Byte,Short,Integer,Long,Character,Boolean;
所以I==J==Q为true
要注意Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,也即对象不负责创建和管理大于127的这些类的对象
所以k==g为false
另外double和float并没有实现常量池技术。
所以d==e为false
- 上一篇: Java入门:常量变量和数据类型的全部基础知识点
- 下一篇: 常量(Constant)
猜你喜欢
- 2025-01-12 Java类是如何加载的?
- 2025-01-12 Java 字符串常量池
- 2025-01-12 Java 注解底层原理
- 2025-01-12 Java基础概念整理(必备熟记)
- 2025-01-12 Java量与变量的区别
- 2025-01-12 金蝶一面:Java基本数据类型有哪些?包装类型的常量池技术了解么
- 2025-01-12 卧槽!Spring中竟然有12种定义Bean的方法?
- 2025-01-12 Java项目中枚举定义以及使用
- 2025-01-12 常量和变量
- 2025-01-12 自学Java2(保姆级教学)——常量与变量
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)