java基础知识(一)数据类型(下)
前面介绍了java的8种基本数据类型,包括boolean, byte, char, short, int, long, float, double。同时,java也提供了这些类型的封装类,分别为Boolean, Byte, Character, Short, Integer, Long, Float, Double。这些封装类被放在了java.lang包下。
这是数据在内存中的存放情况,局部变量、封装类的引用会存放在栈内存中,成员变量、引用类型的实例(值)会存放在堆内存中。
1、为什么需要基本类型的封装类?
通过查看资料及个人分析,封装类与基本类型的区别及优势主要可归结为以下4点:
1)int是面向机器底层的数值类型,是Primitive类型的数据类型,一般只用在数值计算中,而Integer是int的Warpper类,是面向对象的即OOP的对象类型,是用在Java的其它要使用对象的地方,比如Map的Key与Value,List与Set的Element若要保存数值信息都要把int包装成Integer对象使用。int 一般做为数值参数就够了,integer 一般做类型转换的时候用的较多。
2)基本数据类型都有默认值,无法表达空的情况。Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。
3)int 是基本类型,Integer是引用类型。封装类需要涉及到对象的实例化和回收,效率相比基本数据类型要低。封装类实现了很多对基本数据类型的操作的工具方法及整数的最大值最小值常量等,易用性要比基本数据类型要好。
4)存储位置不同,封装类的对象的引用放在栈里面,对象的实例放在堆里面。而基本数据类型是成员变量的时候放在堆里面,是局部变量的时候放在栈里面(方法栈)。
2、java的自动装箱、拆箱
从Java 5开始,引入了自动装箱/拆箱机制,使得基本数据类型和其封装类间实现方便快捷的转换
装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。
如:Integer a = 100; //这是自动装箱 (编译器调用的是static Integer的valueOf(int i)方法)
拆箱:和装箱相反,将引用类型的对象简化成值类型的数据
如:int b = new Integer(100); //这是自动拆箱(编译器调用的是Integer intValue()方法)
装箱机制存在一个小陷阱需要注意一下
public static void main(String arg[]){
Integer i1 = 123;
Integer i2 = 123;
System.out.println("i1 equal i2 : " + (i1.equals(i2)));
System.out.println("i1 == i2 : " + (i1 == i2));
}
在执行上述代码之后,我们会发现以下神奇结果:
i1 equal i2 : true
i1 == i2 : true
查看源码很快发现问题所在,源码如下(其中low=-128,high=127)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
原来是java在自动装箱时将值在-128~127之间的数值放在了cache中,通过自动装箱的引用都指向这个固定的cache地址,而不是分配新的存储空间(这种现象在Byte、Short、Integer、Long、Character这些封装类中均是这样,有兴趣的看看源码就可知道)。
相信小伙伴们在看了上面的代码之后都开始怀疑人生了,觉得自己之前对“==”和“equal”的理解是不是错了,接下来给出正常逻辑结果的代码
public static void main(String arg[]){
Integer i1 = 128;
Integer i2 = 128;
System.out.println("i1==i2 : " + (i1 == i2));
System.out.println("i1 equal i2 : " + i1.equals(i2)); Integer i3 = new Integer(1);
Integer i4 = new Integer(1);
System.out.println("i3==i4 : " + (i3 == i4));
System.out.println("i3 equal i4 : " + i3.equals(i4));
}
运行结果
i1==i2 : false
i1 equal i2 : true
i3==i4 : false
i3 equal i4 : true
哈哈,世界还是美好的,相信现在心情美丽多了。
从上面代码及运行结果可以看出,当自动装箱的值不在-128~127之间时,java虚拟机会为该对象分配新的存储空间,即new一个新的对象。
3、封装类的方法
1)构造方法:每个封装类都会提供一个带基本数据类型的构造方法
如Boolean(boolean value)、Byte(byte value)、Character(char value)等,用于将对应的基本数据类型手动分装。
2)拆装方法
如booleanValue()、byteValue()、charValue等,将引用类型转为对应的基本数据类型。
如parseFloat(String s)、parseByte(String s)等,将String类型转为对应的基本数据类型,parseFloat("3.14")转化为float类型。
3)封装方法(分为两类)
如valueOf(boolean value)、valueOf(byte value)、valueOf(char value)等,将对基本数据类型转换为对应的封装类。
如valueOf(String s) 将String类型转为对应的封装类型,Float.valueOf("3.14")会将字符串“3.14”转化为Float类型。
4)字符串化方法
如toString()、toString(Float value)等,将封装类型转化为Stirng类型。
5)比较方法
如compareTo()用于比较两个值大小,equals()比较两个值是否相等。
上面是基本数据类型封装类的一些公共方法,也是在日常工作中经常用到的方法。各个封装类还有自己独有的一些方法,有时间可以自己研究研究。
java基础知识(一)数据类型(下)的更多相关文章
- JAVA基础知识之数据类型
JAVA的数据类型知识点主要包括基本数据类型,包装类,字符串类(String,StringBuffer, StringBuilder区别和用法),数组,数据类型转换等等,暂时只想到这么多,后面会再补充 ...
- (6)java基础知识-基本数据类型、数据类型转换
一.基本数据类型 基本的数据类型一共有四类八种 1.整型 byte: 1字节 取值范围 -128~127 short: 2字节 取值范围 -32768~32767 int: 4字节 取 ...
- Java基础知识——windows系统下安装JDK
(作者声明:文章引用了其他作者的文章,但因为笔记内容时间过久,已经忘记从哪里摘录下来的了.若无意间侵犯到原作者您的权利,对不起!您可以联系我,我这边会马上进行修改,谢谢!) 1.首先我们需要下载jav ...
- 01-Java基础知识:数据类型与变量、标识符、运算符、表达式
Java基础知识:数据类型与变量.标识符.运算符.表达式 一.数据类型 Java定义了基本数据类型.引用数据类型.自定义类型. 八种基本数据类型:byte (1). short (2). int ( ...
- Java基础知识(壹)
写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- java 基础知识三 java变量
java 基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- Java 基础知识总结
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.数据类型: 数据类型:1>.基本数据类型:1).数值型: 1}.整型类型(byte 8位 (by ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
随机推荐
- 全面剖析 <input> 标签 ------ HTML\HTML5
<input>标签因其形式多样.功能强大,当之无愧成为了WEB前端开发人员最钟爱的元素之一.下面就来对<input>做一个全面的剖析: 标签定义: <input> ...
- 微信接口-获取用户openid基本信息
一.协助获取微信用户openid功能 https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri= ...
- Linux下部署docker记录(1)-Volume使用
之前部署了Linux下部署docker记录(0)-基础环境安装,接下来看看Docker Volume的使用. Docker volume使用1)一个数据卷是一个特别指定的目录,该目录利用容器的UFS文 ...
- flex引起height:100%失效
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- WebApi2跨域问题
一.跨域问题产生的原因:同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能. 现在所有支持JavaScript 的浏览器都会使用这个策略. 所谓同源是指,域 ...
- node基础11:接受参数
1.接收参数 在Node中接受GET/POST请求的参数不像PHP那样,在PHP中直接有全局变量$_GET,$_POST来接受url,或者请求体重的参数. 在node中接受GET参数使用url.par ...
- IE 6 全球分布图 - 中国一枝独秀
随着 Windows 8.1 预览版的发布,IE11也与大家见面了,不久后 IE 11 还将登陆 Windows 7 平台.但是,时至今日,在世界的某个地方,仍然有大量的用户在使用老态龙钟的 IE 6 ...
- 吉特仓库管理系统-.NET打印问题总结
在仓储系统的是使用过程中避免不了的是打印单据,仓库系统中包含很多单据:入库单,出库单,盘点单,调拨单,签收单等等,而且还附带着很多的条码标签的打印.本文在此记录一下一个简单的打印问题处理方式.处理问题 ...
- pagerank
http://jung.sourceforge.net/ https://github.com/louridas/pagerank/blob/aeb9b17ada1f925bb525961574f6d ...
- HTTP原型
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...