Java 基础 基础数据类型与包装器类型

基础数据类型

java 中包含哪些基础数据类型,默认值分别是多少?

基础数据类型 byte short int long double float char boolean
默认值 0 0 0 0l 0.0 0.0f null false

基础数据在 JVM 中的存储模型

Java 中的基础模型因为其长度可知、生命周期(存活时间)可知,为了追求速度,基础数据都是存放在栈中的。另外栈有一个特点,就是栈中的数据可以共享。

例如:

// int a = 3;
// int b = 3;

经过查证,上面的说法是不准确的。

基本数据类型的存储分为三种情况:

  1. 基本数据类型的局部变量
  2. 基本数据类型的成员变量
  3. 基本数据类型的常量

基本数据类型的局部变量

定义基本数据类型的局部变量以及数据都是直接存储在内存中的栈上,也就“虚拟机栈”,数据本身的值就是存储在栈空间里面。

这么说好像有点模糊,举个例子吧。

public class baseDemo {

    public static void main(String[] args) {

       int weight = 50;
int hight = 50;
int age = 18;
Person per = new Person(); } }

这段代码中所有的基本类型都是局部变量,我们从第一个开始看

int weight = 50;
// 这段代码可以分解为
int weight; // 定义局部变量
weight = 50; // 为局部变量赋值

首先在栈帧的局部变量中创建一个局部变量 weight,然后在栈中寻找有没有字面量为 50 的,如果有就直接指向,就当前代码来看,显然是没有,那么 JVM 会在栈中创建一个字面量为 50 的空间,并将 weight 变量指向这个地址。因此我们可以得知:

我们创建的基本数据类型的局部变量,变量名以及字面值都是存放在栈中的。而且是真实的内容。

然后我们接着往下看:

int hight = 50;
// 这段代码可以分解为
int hight; // 定义局部变量
hight = 50; // 为局部变量赋值

这里也是一样的,创建局部变量 hight,从栈中寻找有没有字面量为 50 的内容,刚好我们之前创建 weight 的时候已经创建过字面量为 50 的内容,所以hight直接指向这个地址。由此可见:

栈中的数据在当前线程下是共享的

基本数据类型的数据本身是不会改变的,当局部变量重新赋值时,并不是在内存中改变字面量内容,而是重新在栈中寻找已存在的相同的数据,若栈中不存在,则重新开辟内存存新数据,并且把要重新赋值的局部变量的引用指向新数据所在地址。

基本数据类型的成员变量

成员变量,也就是在类中声明的变量。例如:

public class Person {

    private int age;
private String name;
private int sex;
private long idCard; }
// 通用方法
Person per = new Person();

age、name、sex、idCard被存储到了堆中为per对象开辟的一块空间中。因此可知:基本数据类型的成员变量名和值都存储于堆中,其生命周期和对象的是一致的。

基本数据类型的常量

JVM 中方法区用来存储一些共享数据,因此基本数据类型的静态变量名以及值存储于方法区的运行时常量池中,静态变量随类加载而加载,随类消失而消失

基础数据类型的自动转换

基础类型的自动转换规则包括自动、强制、提升三种

自动类型转换是指:数字范围小的数据类型可以自动转换成数据范围大的类型

int a = 100;
long b = a;

具体可以残照下面这张图:

实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题。

在自动转换的过程中也需要考虑溢出问题,例如:

int a = Integer.MAX_VALUE;
int b = 2;
long c = a + b;
System.out.println(c); // out -2147483647

在这种情况下编译器不会报错,但是打印出来的结果是负数(溢出)。因为jvm 中对其进行计算的时候,是先计算两个 int 的和,再将其自动转换为 long,但是在计算过程中,a和 b的和已经大于 int 的最大值,也就是说在自动转换之前结果已经是负数了,所以转换成 long 之后依然是负数。

另外,向下转换的时候可以直接将 int 的常量直接赋予给char、short、byte,只要常量的数字小于这些基础类型的最大上限,所以可以自动转换

short d = 3;
char e = 4;
byte f = 1;

下图中的 g 报错了,是因为int 的常量超过了 byte 的最大限度。

short d = 3;
char e = 4;
byte f = 1;
byte g = 128;

包装器类型

包装器类型与基础数据类型对应关系

包装器类型 byte char short int long double float boolean
基础数据类型 Byte Character Short Integer Long Double Float Boolean

自动装/拆箱何时触发

这里情况比较多,所以我们直接在代码中体现吧

// 自动装箱
Integer num1 = 1;
Integer num2 = 2;
Integer num3 = 3;
// num1 + num2 触发自动拆箱,然后因为要和 Integer 类型的num3 进行 equals 比较,所以又触发自动装箱
// Integer.equals 返回的是 boolean,但是我们是使用 Boolean 类型接收的,这里又触发了自动装箱
Boolean flag = num3.equals(num1 + num2);

Integer 的 equals源码

 /**
* Compares this object to the specified object. The result is
* {@code true} if and only if the argument is not
* {@code null} and is an {@code Integer} object that
* contains the same {@code int} value as this object.
*
* @param obj the object to compare with.
* @return {@code true} if the objects are the same;
* {@code false} otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

包装器类型在 JVM 内存中的存储模型

包装器类型的对象存储在堆中,引用存储在栈中,通过栈来操作对象。但是部分是直接从存放在常量池中的比如 Integer 的 -128 ~ 127

基础数据类型和包装器类型的适用场景

  1. 基础数据类型适合用于方法内部的局部变量,随着方法的调用创建在栈中,随着方法一起被回收销毁。
  2. 包装器有一个基础数据类型没有的优点,就是默认值是 null,可以通过是否为 null 直观的判断这个数据是不是被赋值过。比如:使用 Mybatis 从数据库中获取数据的时候,如果这个是 int类型,但是其实这条数据这个字段是空,就会出问题。
  3. 基本类型与对象类型最大的不同点在于,基本类型基于数值,对象类型基于引用

Java 基础复习 基础数据类型与包装器类型的更多相关文章

  1. Java中基本数据类型和包装器类型的关系

    在程序设计中经常用到一系列的数据类型,在Java中也一样包含八中数据类型,这八种数据类型又各自对应一种包装器类型.如下表: 基本类型 包装器类型 boolean Boolean char Charac ...

  2. Java基础之基本数据类型的包装类型

    Java的基本数据类型的包装数据类型有多种: int Integer,short Short,boolean Boolean,float Float,double Double等等. Java包装类数 ...

  3. Java基础(八)对象包装器与自动装箱

    1.对象包装器 有时候,需要将int这样的基本类型转换为对象.所有的基本类型都有一个与之对应的类.通常,这些类被称为包装器(wrapper). 这些对象包装类分别是:Integer.Long.Floa ...

  4. C# 基础复习 一 数据类型

    数据类型分为:值类型和引用类型 值类型:byte.short/char.int.long.float.double.decimal.enum.struct 引用类型:string.object.int ...

  5. ndk学习之C语言基础复习----基本数据类型、数组

    关于NDK这个分类在N年前就已经创建了,但是一直木有系统的记录其学习过程,当然也没真正学会NDK的技术真谛,所以一直也是自己的一个遗憾,而如今对于Android程序员的要求也是越来越高,对于NDK也是 ...

  6. python基础复习-1-2 数据类型-str、list、tuple、dict

    数据类型 数字 引号: 123 数值 '123' 字符串 整数:ini long 范围:(-2**31 - 2**31) num = 123 长整型 long (L) num = 123L 浮点型:f ...

  7. Java基础的基础,花1h看这一篇就够了!

    ------------恢复内容开始------------ Java笔记 ​ 一直以来,总想着Java会点基础就可以写后端程序了,但越到后来越发现Java基础的重要性.更不必说在面试时,Java基础 ...

  8. java面试| 精选基础题(2)

    关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...

  9. Java基本数据类型与包装类型(转)

    基本数据类型的包装类 为什么需要包装类? Java并不是纯面向对象的语言.Java语言是一个面向对象的语言,但是Java的基本数据类型却不是面向对象的.但是我们在实际使用中经常需要将基本数据转化成对象 ...

随机推荐

  1. 华为云MySQL金融版正式商用,高可靠的金融级数据库来了

    摘要:全新三节点架构,基于深度优化的MGR组复制技术,提供金融级的数据一致性. 日前,华为云数据库MySQL 金融版正式商业化发布,MySQL金融版采用MGR技术,基于Paxos协议,采用一主两备三节 ...

  2. TCP 的三次握手,四次挥手和重要的细节—干货满满,建议细读

    最近把个人博客搭建好了,链接在这里:tobe的呓语,文章会先在博客和公众号更新~ 大家多多收藏啊 上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇 ...

  3. POJ1743 Musical Theme (后缀数组 & 后缀自动机)最大不重叠相似子串

    A musical melody is represented as a sequence of N (1<=N<=20000)notes that are integers in the ...

  4. 矩阵解压,网络流UESTC-1962天才钱vs学霸周2

    天才钱vs学霸周2 Time Limit: 500 MS     Memory Limit: 128 MB Submit Status 由于上次的游戏中学霸周输了,因此学霸周想出个问题为难天才钱,问题 ...

  5. 测底稳定NIOS开发之一:将nios产生的编程文件转换成jic (连载)

    将nios产生的编程文件转换成jic 前言: 基于某种原因,自从开始fpga开发和nios项目开发中,均为正常使用EDS IDE自带的flash programmer 进行成功的下载固化epcs程序. ...

  6. 后端程序猿标配之linux命令

    超清图片,可放大查看. 来源:https://www.cnblogs.com/ryanlamp/p/7511883.html

  7. hdu 1054 Strategic Game (简单树形DP)

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. Python复习第01天---元类底层原理

    1.通过元类限制类的名字首字母大写 if not class_name.istitle(): raise TypeError('类的名字首字母需要大写') 2. 控制类中必须要有注释 if not c ...

  9. java8-详解Lamda表达式

    一回顾与说明     通过之前发布的"Java8Lamda和Stream原理引入"一文章中你已经了解了为什么会有Lamda表达式的由来,Lamda表达式的基本语法等:Lamda表达 ...

  10. python:json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes问题解决

    有如下一个文件,内容如下 { "test1": "/root/test/test1.template", "test2": "/r ...