Java - 包装类 常量池
概述:
在Java中存在一些基本数据类型,这些基本数据类型变量,不能像其他对象一样调用方法,属性....
一些情况下带来一些问题,包装类就是为了解决这个问题而出现

包装类可以使得这些基础数据类型,拥有对象的能力

包装类与基础类型的对应关系

特点:
- 包装类都是final修饰无法继承
- 数字类型的父类都是Number
- 当包装类作为类属性时,其默认值都为Null
拆箱与装箱
拆箱指的是将基础数据类型包装为对象,拆箱与之相反
自动装箱
将基础数据类型直接赋值给对应包装类的引用变量,系统会自动进行装箱操作
Integer a = 10;
自动拆箱
Integer a = new Integer(10);
int b = a;
手动拆箱
Integer a = new Integer(10);
int b = a.intValue();
手动装箱/装箱
Integer as = new Integer(10);//装箱
Integer.valueOf(1);//装箱
Float.valueOf(1.1);//装箱
.... as.intValue();//拆箱
通常我们不需要进行手动拆装箱
自动拆箱的时机
1.将包装类型变量直接赋值给对应基础类型时,系统会自动进行拆箱操作
2.当要访问这个对象的真实数据值时会进行自动拆箱,例如要输出对象的值
3.当要对包装类的实际值进行数学运算时,会自动拆箱,例如比较大小
需要注意的是,当使用判断是否相等时,符号任意一边是基础数据类型另外一边都会自动拆箱(不会出问题),但如果两边都是包装类型则会比较对象引用是否相同(可能产生问题)
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1 == i2); //结果为false
字符串与包装类互相转换
在开发中经常需要将基础数据类型与字符串类型相互转换
//我们可以使用包装类提供的valueof()方法来将字符串转为对象的包装类
System.out.println(Float.valueOf("1.1ff"));
System.out.println(Boolean.valueOf("true"));
//相反的String提供了静态方法valueOf() 其他任意类型转换为字符串类型 Object表示所有类均可,包括包装类
System.out.println(String.valueOf('c'));
System.out.println(String.valueOf(true));
对象常量池
Java虚拟机会默认将一些简单的字面量对象放到常量池中,来减少频繁的内存操作;是一种优化机制;
测试代码:
Long s1 = Long.valueOf(127l);
Long s2 = 127l;
Long s3 = new Long(127l);
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //false
String st1 = "常量池噢噢噢噢";
String st2 = "常量池噢噢噢噢";
String st3 = new String("常量池噢噢噢噢");
System.out.println(st1 == st2); //true
System.out.println(st1 == st3); //false
Boolean b1 = true;
Boolean b2 = true;
Boolean b3 = new Boolean(true);
System.out.println(b1 == b2); //true
System.out.println(b1 == b3); //false
Character c1 = 'a';
Character c2 = 'a';
Character c3 = new Character('a');
System.out.println(c1 == c2); // true
System.out.println(c1 == c3); // false
Float f1 = 1.0f;
Float f2 = 1.0f;
Float f3 = new Float(1.0f);
System.out.println(f1 == f2);//flase
System.out.println(f1 == f3);//flase
Double d1 = 1d;
Double d2 = 1d;
Double d3 = new Double(1d);
System.out.println(d1==d2);//flase
System.out.println(d1==d3);//flase
- String类型的所有字面量都会进入常量池
- Byte Short Integer Long 四种类型字面量在大于等于 -128 且小于等于127 时对象将进入常量池
- Character 类型 不能为负数,字面量大于等于0 且 小于等于127时对象将进入常量池
- Boolean类型 两个字面量都会进入常量池
- Float 和Double 类型 不会进入常量池
强调:
字面量的意思是说,在编译期间就直接指定了实际值,非常明确的数据
这意味着当我们没有使用字面量而是使用 new关键字时,对象将直接进入堆区而不会进入常量池 ,请看下面的例子:
Integer a1 = new Integer(10);
Integer a2 = new Integer(10);
System.out.println(a1 == a2); //false
一旦出现了new 则必然要开辟新内存空间,无法利用常量池了!因此建议在代码中尽量使用字面量避免使用new;
补充说明:
这些包装类,以及String类提供的静态方法valueOf();都会先访问常量池,而不是立即new, 所以使用字面量或者valueOf方法都可以利用常量池;
注意:
基础数据类型不需要缓存到常量池中因为基础数据类型不存在引用这么一说,就是一个实际的值随方法存储在栈区;
Java - 包装类 常量池的更多相关文章
- Java字符串常量池是什么?为什么要有这种常量池?
简单介绍 Java中的字符串常量池(String Pool)是存储在Java堆内存中的字符串池.我们知道String是java中比较特殊的类,我们可以使用new运算符创建String对象,也可以用双引 ...
- Java字符串常量池及字符串判等解析
一.理解"=="的含义 "=="常用于两个对象的判等操作,在Java中,"=="主要有以下两种用法: 1.基础数据类型:比较的是他们的值是否 ...
- Java基础-常量池
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析
/** * 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放 在常量池中). 堆(heap):存 ...
- 【转】Error,java对常量池来说字符串xxx的UTF8表示过长的解决及其理解
做项目,客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了.老方法直接google.百度然后看到一堆有关String 字符串常量池 ...
- Java字符串常量池
JVM为了减少字符串对象的重复创建,维护了一个特殊的内存,这段内存被称为字符串常量池. Java中字符串对象的创建有两种形式:一种是字面量形式,String str = "a":一 ...
- Java String 常量池理解
String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以下三个问题,去理解字符串常量池: 字 ...
- java字符串常量池——字符串==比较的一个误区
转自:https://blog.csdn.net/wxz980927155/article/details/81712342 起因 再一次js的json对象的比较中,发现相同内容的json对象使用 ...
- 关于java字符串常量池
今天发现一个好玩的东西 public static void main(String[] args) { String str1 = new StringBuilder(" ...
随机推荐
- 使用mongoshake进行oplog同步读取,解决乱码问题
mongoshake 是个开源的用户mongo数据迁移和同步的工具,支持往各种目标源头写数据 具体:https://github.com/alibaba/MongoShake 有业务场景想把oplog ...
- 自制导纳信号发生器 [原创cnblogs.com/helesheng]
最近正在研制一种通过测量人体导纳,估算体内血液变化率,进而评估心血管系统泵血功能的医疗仪器.为测量人体导纳,我们设计了一套巧妙的激励信号幅度反馈电路,该电路由于涉及商业机密就不在这里讨论了.这里主要分 ...
- javascript的ES6学习总结(第三部分)
1.ES6中的面向对象的类 1.1.定义类 在ES5中,我们写一个类,通常是这么写的 function Person(name,age){ this.name = name; this.age = a ...
- MESSAGE_TYPE_X dump in RSM_DATASTATE_CHECK -6-
DTP抽数时系统Dump 参考sapnote:2398760 - MESSAGE_TYPE_X dump in RSM_DATASTATE_CHECK -1- to -12- RSM_DATASTAT ...
- Android 开机充电图标和充电动画
首先驱动需要先获取到2个power supply kernel\msm-3.18\drivers\usb\phy\phy-msm-usb.c motg->usb_psy.name = " ...
- leetcode菜鸡斗智斗勇系列(3)--- Jewels and Stones珠宝和钻石
1.原题: https://leetcode.com/problems/jewels-and-stones/ You're given strings J representing the types ...
- webpack生成的css文件background-image url图片无法加载
之前在使用webpack3构建基于less预处理的项目时,在对指定的元素使用background-image: url(xxx)来设置背景图片时,本地开发是ok的,但是在项目编译产出后背景图片就找不到 ...
- openssl 证书请求和签名命令req基本分析
一 基本概念: OpenSSL 是一个开源项目,其组成主要包括一下三个组件: openssl:多用途的命令行工具 libcrypto:加密算法库 libssl:加密模块应用库,实现了ssl及tls o ...
- JS中遍历对象属性的四种方法
Object.keys().Object.values().Object.entries().for...in.Map (1)Object.keys(): let ex1 = {c1: 'white' ...
- 老版本nginx存在安全漏洞,不停服务热升级
1.场景描述 安全部通知:nginx存在"整数溢出漏洞",经测试2017年4月21日之后的版本无问题,将openresty升级到最新版本,Nginx升级到1.13.2之后的版本. ...