程序本质上是对数据的处理(逻辑运算),因此任何语言都需先解决如何表征【数据】这个核心概念。数据作为抽象的概念,天然的包含2个方面属性:
(资料图片)
类型
:类型决定了数据只能和同类型的数据进行运算才有意义,不同类型的数据必须进行类型转换数值
:是数据的数学意义上的大小或内容。同时数据保存在内存或磁盘中,总是占用一定的存储空间,因此一个数据在程序中是由类型
、数值
和存储空间
表示的。
Java 是一种强类型语言,每个变量在声明时必须指定其数据类型。根据参数传递时的赋值方式,Java 中的数据类型分2类:
参数传递时总是以值拷贝的形式,赋值给接收变量。
本质是对数学意义上的纯数值类数据的抽象,因此又叫值类型
.
注意:基本数据类型在语言层面是不可分割的基本单元,但硬件层面并非是不可分割的,因为内存的读写是以内存行(64位)为基本单位的,占用2个或2个以上内存行的数据在高并发下是不安全的。
即参数传递时是以拷贝引用地址的方式传递给接收变量,而非复制整个"数据"本体。
除了基本数据类型外的、其他结构化的数据类型,如字符串类型String、或自定义的类(如Person),本质上是对现实世界结构化、关系化数据的抽象,因为一个对象(如人)总是具备多个特征属性的,每个属性都是一个基本数据类型。
为什么不是拷贝值?
这类类型的变量本质上是一段存储空间的起始地址,因为结构化数据的存储空间的大小是由所有属性叠加的,且是可变的,不能或很难实现原子性的拷贝,且空间代价很大,因此参数传递时并不是机械的拷贝所有属性、所有空间,而是仅复制拷贝起始地址就行了,其他字段可以据此基地址和字段顺序进行偏移计算所得。
基本类型:变量名指向具体的数值,参数传递会拷贝值的副本,原值不受影响
引用类型:变量名指向存数据对象的内存地址,参数传递是复制内存段的起始地址,最终指向同一内存段。
相等语义基本类型:使用时需要赋具体值,使用 == 号判断值是否相等。
引用类型:== 是判断引用地址是否相同;通常应重写 equals 方法实现自定义的逻辑,如同一学生会存在多个缓存中,重写equals,根据学号no是否相等判断是否是同一学生。
Java 语言共提供了4 类、8 种基本类型
是对数学中整数的表达,按照数值范围和存储空间大小顺序:byte < short < int < long
是对数学中的小数的表达,即有浮动小数点的数,
float
- 32 位,直接赋值时必须在数字后加上 f 或 F,指示编译器这是一个float型浮点数
double
- 64 位,赋值时一般在数字后加 d 或 D,指示编译器这是一个double型浮点数
是对Unicode编码的表达,Unicode编码是对全世界所有主要语言中各类字符、符号的编码,是将文档转存成计算机的二进制序列进行保存的理论基础。
char
- 16 位,存储 Unicode 码,用单引号赋值。
可计算的
java 提供字符型,可以更方便的表述字符,同时支持基于编码的数值计算,因此char类型的值本质还是数值,可以参与数值计算。
是对逻辑运算值的表达,即真True
和假False
。
boolean
- 只有 true 和 false 两个取值。
非数值
boolean 类型是非数值类型的,因此和其他基本数据类型不能参与计算。
即在满足需求的前提下,优先使用更小的类型,可以节省大量的内存,提升程序的性能。Java每个大类都提高了多个大小不一的类型,即是灵活的需要,更是内存优化的需要。
正如方法论中所说,不同类型的数据不能直接混合计算,必须转换同一种类型。
Java 中,数据类型转换有两种方式:自动转换
和 强制转换
在符合下面的规则下,Java编译器会安全的、隐式的进行转换,降低用户手动转换的压力。
自动膨胀原则即在精度不一致的混合场景下,Java编译器会隐式的将精度较小的类型转换成精度稍大的类型后才进行计算,由小转大,数据精度并不会丢失,因此是安全的。
膨胀的顺序是:byte -> short/char -> int -> long -> float -> double
由下面的例子可以看出,Java编译器不仅自动优化了变量类型,减少了内存,而且自动隐式的将 byte 转换成了 float,整个表达式的最终结果已是float类型
再使用精度较小的int型变量接收时就会提示出错。
在不符合自动转换条件时或者根据用户的需要,可以使用符号()对数据类型做强制的转换。
注意!!!:从精度大到精度小的强制转换,因为存储空间也会缩小一半,因此存在数据出错的不确定性问题,用户自身需要自我承担这样的风险。
可以看到虽然编译阶段是正常的,没有提示错误,但是运行时的结果却是一个不确定的数据,而不是预期的。
为了基本数据类型可以与引用类型互相转换,以利用彼此的特性,Java 为每一种基本数据类型提供了相应的包装(封装)类。
Java基本数据类型的包装类以value字段保留其对应的数值,如Integer#value,可以通过构造器或者valueof方法生成新的包装对象实例。
享元模式(即缓存池模式)因为在堆中创建新的对象是相对比较重的操作,同时基本数据类型的自动装箱又是程序中最常见的情况之一,因此为为避免重复创建这些常用的对象,Jdk实现的基本类型包装类基本都会采用缓存池的设计,即享元模式,数量由jvm参数XX:AutoBoxCacheMax指定。
饥饿池化
- 包装类在首次加载时会对指定小范围内的数值进行饥饿式池化,如java.lang.Integer.IntegerCache.high指定
懒加载池化
- 对每个首次使用的其他数值进行懒加载池化和替换
享元模式是非常重要的设计模式一直,对内存优化和系统系统方面都是非常友好的。
即将基本数据类型转换为对应封装类的引用类型,目的是获得对应封装类的各类方法的能力。例如:int 转 Integer,编译器是通过调用包装类的 valueOf 方法实现的。
自动装箱(auto boxing)
当基本数据类型赋值给对应包装类的引用类型时,Java会自动的将基本数值类型通过其包装类的valueOf,在堆上创建其对应的包装类对象。
是将封装类的引用类型转换为基本数据类型,例如:Integer 转 int,目的是可以参与常规的数学运算。本质是编译器通过调用包装类的 xxxValue 方法实现的。(xxx 代表对应的基本数据类型)
自动拆箱(auto unboxing)
当包装类与基本数据类型混合运算时,Java会调用该包装类的xxxValue获得对应的值类型的值,然后才参与表达式的计算。
最后整理了一个完整的脑图。
程序本质上是对数据的处理(逻辑运算),因此任何语言都需先解决如何表征【数据】这个核心概念。数据作...
1、巴西联邦共和国国旗是长方形,旗地为绿色,中间是一个黄色的菱形,菱形的角点与旗边的距离均相等。2...
联赛杯决赛,曼联2-0纽卡夺冠,前曼联后卫加里-内维尔接受天空体育采访。内维尔:“每个球员都在尽自己...
欧文:人们说亨德森和米尔纳太老,但他们是目前利物浦最好的中场,亨德森,利物浦,巴西足球,英国足球,波兰...
1、乳液是一种液态霜类护肤品,因为看起来纯白如牛奶,所以叫乳液。2、乳液具有良好的润肤作用,也有保...
格隆汇2月26日丨上海建科(603153 SH)公布,为便于A股投资者了解发行人的有关情况和本次发行的相关安排,发行人与
委员:建议公立幼儿园扩容成托幼一体今天的热度非常高,现在也是在热搜榜上了,那么具体的委员:建议公立...
1、阿拉斯加帝王蟹(学名:Paralithodescamtschatica):平均重量为10千克,平均长度为220毫米
解答:1、打开浏览器,输入游戏名称,然后我们点击搜索,进入游戏的网页,点击进入,进入界面后选择游戏...
在宁泉、桥水卖出“爆款”以后,本周又有一家百亿私募慎知资产在渠道持续热销,一周时间募集资金将近20...
1、《中华谚语故事》是2009年11月由京华出版社出版的图书,作者是不提撰人。2、该书作者讲述了中华民间...
1、《易水楼往事》是连载于晋江文学城的网络小说。2、作者是咖肥要努力。文章到此就分享结束,希望对大...
1、顾人麒,性别男,1988年5月2日出生上海。2、毕业于上海市邦德学院,中国内地男歌手。文章到此就分享...
黄山区气象局发布大雾黄色预警【III级 较重】【2023-02-26】
本文转自:白银日报【聚焦铜城杯·2022-2023赛季全国冬季两项锦标赛冠军赛】白银文创产品为全国冬季两项...
1、京崎t1981系列手机,这一款手机在机身的周围镶嵌了20多颗小水晶,这款手机搭配上了这20多颗小水晶。2...
邹城:樱桃花开春意盎然
原因是尽管ttl是设给每条消息的。但是本质上,所有延时消息都还在一个队列里,对它过期时间的检测也是从...
1、《小时代》是作家郭敬明创作的系列长篇小说,共包含《小时代1 0折纸时代》《小时代2 0虚铜时代》和...
校长打call|高考倒计时百天!南京大学校长吕建发出最强邀约,期待你们成为“南大人”
人民银行:稳固对实体经济的可持续支持力度充实中央银行的准备金和资本实施审慎的资产损失拨备制度人民...
1、《为什么是我变成了吸血鬼》是晋江文学城连载的现代小说。2、作者是姬蛋皇。3、已完结。文章到此就分...
1、事实婚姻的男女应无配偶,有配偶则成为事实重婚。2、事实婚姻的当事人具有婚姻的目的和共同生活的形...
1、对于1 5、2 5、4、6、10mm2的导线可将其截面积数乘以5倍。2、对于16、25mm2的导线可将其截面积数乘以
1、乔纳森·迪肯逊州立公园位于美国佛罗里达州的马丁县,成立于1950年,占地面积11500英亩。2、名字源于1696
X 关闭
X 关闭