1.java常量池的介绍

java中的常量池,通常指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,各线程间共享该运行常量池。

java常量池简介:java常量池中保存了一份在编译期间就已确定的数据。它里面包括final常量的值(包括成员常量、局部常量和引用常量)、以及对象字面量的值。

在编译期间,每当给常量赋值它就会去检测常量池中是否存在该值,若存在直接返回该值的地址给常量,若不存在则先在常量池中创建该值,再返回该值的地址给常量。因此常量池中不可能出现相等的数据。

2.final常量

一切经final关键字修饰的变量均为常量,final常量必须在定义时就赋初值,否则编译不通过。

3.对象字面量

对象字面量是指直接以一常量给对象赋值,而不是在堆空间new出一个对象实例。

常见的两种对象字面量:基本类型的包装类对象字面量、String对象字面量。

3.1基本类型的包装类对象字面量

java中基本类型的包装类大都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean。这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。 两种浮点数类型的包装类Float,Double并没有实现常量池技术。

包装类型Integer与常量池

Integer i1 = 40;

Integer i2 = 40;

Integer i3 = 0;

Integer i4 = new Integer(40);

Integer i5 = new Integer(40);

Integer i6 = new Integer(0);

System.out.println("i1=i2   " + (i1 == i2));

System.out.println("i1=i2+i3   " + (i1 == i2 + i3));

System.out.println("i1=i4   " + (i1 == i4));

System.out.println("i4=i5   " + (i4 == i5));

System.out.println("i4=i5+i6   " + (i4 == i5 + i6));

System.out.println("40=i5+i6   " + (40 == i5 + i6));

i1=i2   truei1=i2+i3   truei1=i4   falsei4=i5   falsei4=i5+i6   true40=i5+i6   true

解释:Integer i1=40;直接以字面量给对象赋值,它会先去检查常量池中是否存在该值,若存在直接返回该值的地址,若不存在则现在常量池中创建该值,再返回该值的地址。

Integer i1 = new Integer(40);这种情况会在堆空间创建新的对象。

语句i4 == i5 + i6,因为+这个操作符不适用于Integer对象,首先i5和i6进行自动拆箱操作,进行数值相加,即i4 == 40。然后Integer对象无法与数值进行直接比较,所以i4自动拆箱转为int值40,最终这条语句转为40 == 40进行数值比较。

3.2String对象字面量

String str1 = "abcd";

String str2 = new String("abcd");

System.out.println(str1==str2);//falseString str1 = "str";

String str2 = "ing";

String str3 = "str" + "ing";

String str4 = str1 + str2;

System.out.println("string" == "str" + "ing");// trueSystem.out.println(str3 == str4);//falseString str5 = "string";

System.out.println(str3 == str5);//true

解释:引用str1指向常量池中字符串"abcd"的地址,是在常量池中拿对象,new String("abcd")是直接在堆内存空间创建一个新的对象。只要使用new方法,便需要创建新的对象。

连接表达式 +,只有使用引号包含文本的方式创建的String对象之间使用“+”连接产生的新对象才会被加入常量池中。

对于字符串变量的“+”连接表达式,它所产生的新对象都不会被加入字符串池中,其属于在运行时创建的字符串,具有独立的内存地址,所以不引用自同一String对象。

(3)String.intern()方法强制将字符串放入常量池中

public static void main(String[] args) {

String s1 = new String("计算机");

String s2 = s1.intern();

String s3 = "计算机";

System.out.println("s1 == s2? " + (s1 == s2));

System.out.println("s3 == s2? " + (s3 == s2));

}

s1 == s2? falses3 == s2? true

解释:String的intern()方法会查找在常量池中是否存在一份equal相等的字符串,如果有则返回该字符串的引用,如果没有则添加自己的字符串进入常量池。

注意:final常量必须在定义时就赋初值,但对象字面量可以先定义后赋值。

4. 常量池的好处

常量池是为了避免频繁的创建和销毁对象而影响系统性能,实现了常量池中的内容由对象共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。

节省运行时间:比较字符串时,==比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。

注:==号比较基本数据类型是值比较,但比较引用类型则是引用所指向的地址比较。

java常量池在哪里_【Java基础】Java常量池在哪里? - 收获啦相关推荐

  1. java方法重载实事例_零基础java入门教程函数重载function实例化格式案例

    java函数的重载,说白了就是函数块函数名一样,但函数类型和参数类型和参数列表个数不同 重载之和参数列表有关系,与返回值无关 java函数重载 函数重载铺垫如下图 函数重载铺垫 上图功能显示,功能一致 ...

  2. java中常量final的用法_详解Java中final的用法

    本文主要介绍了Java中final的使用方法,final是java的关键字,本文就详细说明一下它的使用方法,需要的朋友可以参考下 概念 final 具有"不可改变的"的含义,可以修 ...

  3. java面试没有全部答对_十道java基础面试题,你能保证全答对吗?

    java初级开发面试中经常被问到的问题有好多,下面总结一下常见的问题,先给问题,大家思考一下再看答案. 1.JDK 和 JRE 有什么区别?2.== 和 equals 有什么区别?3.说说final在 ...

  4. java培训学费_零基础Java培训大概多少钱

    Java培训多少钱,这个问题是我们准备学习Java的小伙伴比较关注的,特别是从零基础开始来学习Java的小伙伴,对这个行业不太了解,为了防止上当受骗,了解清楚还是比较好的,那么零基础Java培训大概多 ...

  5. java线程池饱和策略_干货:Java几种线程池的分析和使用。

    原标题:干货:Java几种线程池的分析和使用. 利用线程池的优势: 1.降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2.提高响应速度.当任务到达时,任务可以不需要等到线程创建 ...

  6. java char字符转编码_一、java基础-数据类型_数据类型转化_字符编码_转义字符

    1.Java  支持的8种基本数据类型: java的四种整数数据类型:byte 1    short 2     int4     long8 byte     8位带符号整数 -128到127之间的 ...

  7. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  8. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  9. java 面试题合集_撩课-Java面试题合辑1-50题

    1.简述JDK.JRE.JVM? 一.JDK JDK(Java Development Kit) 是整个JAVA的核心, 包括了Java运行环境(Java Runtime Envirnment), 一 ...

  10. java 和c 多态比较_多态在 Java 和 C 编程语言中的实现比较

    2011 年 12 月 22 日发布 众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定.C++ 和 Java 作为当前最为流行的两种 ...

最新文章

  1. python进阶免费-【Python进阶,一学就会】系列1(文末免费送10本书)
  2. 062_html多媒体
  3. vuewebsocket做消息提醒_企业微信群怎么定时群发消息?如何突破群发次数限制?...
  4. 常见的计算机监控系统分类,第二章 发厂计算机监控系统的基本分类.doc
  5. matlab 回退到上一行,对乒乓球回滚的分析与MATLAB模拟
  6. Linux下静态IP地址的设置及TFTP服务的搭建
  7. 在MVC3中使用code first生成数据局库并操作数据库
  8. 利用JAVA Service Wrapper把JAVA程序做成windows服务
  9. python整形_Python中的最大整型数值
  10. 苹果电脑Chrome浏览器截网页长图
  11. statsmodels.stats.proportion.proportions_ztest
  12. ubuntu清理vscode缓存
  13. 吴彩强:从表征到行动---意向性的自然主义进路
  14. 解决eclipse报错:错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)
  15. c语言停车场程序设计,停车场模拟管理程序的设计与实现,高手指教
  16. 想了解更多的话就请加QQ或者访问我的新浪博客
  17. 算法复杂度及渐进符号
  18. 读书笔记 《Python灰帽子-黑客与逆向工程师的Python编程之道》
  19. 特征值和特征向量的本质概念
  20. 51单片机中断与定时器计数器,基于普中科技教学视频学习记录

热门文章

  1. el table 固定表头和首行_再谈table组件:固定表头和表列
  2. Honor V10 BKL-AL20 ROOT(Magisk方式)
  3. mongodb数据的导入导出备份恢复
  4. dateutil模块
  5. dateutil 日期计算_时间工具——DateUtil
  6. 如何成为一名优秀的关卡设计师?
  7. MySQL基础面试题总结
  8. 计算机通信基础教程ppt,计算机网络教程PPT课件.ppt
  9. 史上最简单的spark教程第十章-SparkSQL编程Java案例实践(二)
  10. matlab归一化mapminmax警告,利用mapminmax归一化的问题