目录

  • 8 种基本数据类型
  • Java中引用数据类型有哪些,它们与基本数据类型有什么区别?
    • 使用对比
  • Java中的自动装箱与拆箱
  • 为什么要有包装类型?
  • a=a+b与a+=b有什么区别吗?
  • 能将 int 强制转换为 byte 类型的变量吗?
  • null类型

8 种基本数据类型

类型名称 字节、位数 最小值 最大值 默认值 例子
byte 1字节,8位 -128(-2^7) 127(2^7-1) 0 byte a = 100,byte b = -50
short 2字节,16位 -32768(-2^15) 32767(2^15 - 1) 0 short s = 1000, short r = -20000
int 4字节,32位 -2,147,483,648(-2^31) 2,147,483,647(2^31 - 1) 0 int a = 100000, int b = -200000
long 8字节,64位 -9,223,372,036,854,775,808(-2^63) 9,223,372,036,854,775,807(2^63 -1) 0L L long a = 100000L, Long b = -200000L
duble 8字节,64位 4.9E-324 1.7976931348623157E308 0.0d double d1 = 123.4
float 4字节,32位 1.4E-45 3.4028235E38 0.0f float f1 = 234.5f
char 2字节,16位 \u0000(即为0) \uffff(即为65,535) 可以储存任何字符 char letter = ‘A’;
boolean 返回true和 false两个值 这种类型只作为一种标志来记录 true/false 情况; 只有两个取值:true 和 false; false boolean one = true

Java中引用数据类型有哪些,它们与基本数据类型有什么区别?

引用数据类型分3种:类,接口,数组;

简单来说,只要不是基本数据类型.都是引用数据类型。 那他们有什么不同呢?
1、从概念方面来说
1,基本数据类型:变量名指向具体的数值
2,引用数据类型:变量名不是指向具体的数值,而是指向存数据的内存地址,.也及时hash值

2、从内存的构建方面来说(内存中,有堆内存和栈内存两者)
1,基本数据类型:被创建时,在栈内存中会被划分出一定的内存,并将数值存储在该内存中.
2,引用数据类型:被创建时,首先会在栈内存中分配一块空间,然后在堆内存中也会分配一块具体的空间用来
存储数据的具体信息,即hash值,然后由栈中引用指向堆中的对象地址.
举个例子

//基本数据类型作为方法参数被调用
public class Main {public static void main(String[] args) {//基本数据类型 int i = 1;int j = 1;double d = 1.2;//引用数据类型 String str = "Hello";String str1 = "Hello";}
}


由上图可知,基本数据类型中会存在两个相同的1,而引用型类型就不会存在相同的数据。
假如"hello"的引用地址是xxxxx1,声明str变量并其赋值"hello"实际上就是让str变量引用了"hello"的内存地址,这个内存地址就存储在堆内存中,是不会改变的,当再次声明变量str1也是赋值为"hello"时,此时就会在堆内存中查询是否有"hello"这个地址,如果堆内存中已经存在这个地址了,就不会再次创建了,而是让str1变量也指向xxxxx1这个地址,如果没有的话,就会重新创建一个地址给str1变量。

使用对比

1,基本数据类型:判断数据是否相等,用==和!=判断。
2,引用数据类型:判断数据是否相等,用equals()方法,==和!=是比较数值的。而equals()方法是比较内存
地址的。

补充:数据类型选择的原则

如果要表示整数就使用int,表示小数就使用double;
如果要描述日期时间数字或者表示文件(或内存)大小用long;
如果要实现内容传递或者编码转换使用byte;
如果要实现逻辑的控制,可以使用booleam;
如果要使用中文,使用char避免中文乱码;
如果按照保存范围:byte < int < long < double;

Java中的自动装箱与拆箱

什么是自动装箱拆箱?
从下面的代码中就可以看到装箱和拆箱的过程

//自动装箱
Integer total = 99;
//自定拆箱
int totalprim = total;

装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。

在Java SE5之前,自动装箱要这样写:Integer i = new Integer( 10``);

对于Java的自动装箱和拆箱,我们看看源码编译后的class文件,其实装箱调用包装类的valueOf方法,拆箱调用的是Integer.Value方法,下面就是变编译后的代码:

在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

public class Main {public static void main(String[] args) {Double i1 = 100.0;Double i2 = 100.0;Double i3 = 200.0;Double i4 = 200.0;System.out.println(i1 == i2);System.out.println(i3 == i4);}
}

输出结果为:

false
false

原因很简单,在某个范围内的整型数值的个数是有限的,而浮点数却不是。

为什么要有包装类型?

为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型)因为容器都是装object的,这是就需要这些基本类型的包装器类了。

自动装箱: new Integer(6); ,底层调用: Integer.valueOf(6)
自动拆箱: int i = new Integer(6); ,底层调用 i.intValue(); 方法实现。

Integer i = 6;
Integer j = 6;
System.out.println(i==j);

答案在下面这段代码中找:

public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);
}

二者的区别:

  1. 声明方式不同:基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;

  2. 存储方式及位置不同:基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;

  3. 初始值不同:基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;

  4. 使用方式不同:基本类型直接赋值直接使用就好,而包装类型在集合如Collection、Map时会使用到。

a=a+b与a+=b有什么区别吗?

+= 操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换.如:

byte a = 127;
byte b = 127;
b = a + b;
// 报编译错误:cannot convert from int to byte
b += a;

以下代码是否有错,有的话怎么改?

short s1= 1;
s1 = s1 + 1;

有错误.short类型在进行运算时会自动提升为int类型,也就是说 s1+1 的运算结果是int类型,而s1是short类型,此时编译器会报错.
正确写法:

short s1= 1;
s1 += 1;

+= 操作符会对右边的表达式结果强转匹配左边的数据类型,所以没错.

能将 int 强制转换为 byte 类型的变量吗?

我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化,int 类型
的高 24 位将会被丢弃,因为byte 类型的范围是从 -128 到 127

null类型

java语言中有两种类型,一种是基本类型,还有一种是引用类型。还有一个特殊的null类型即表达式null的类型,它没有名字。
因为null类型没有名字,所以不可能声明为null类型的变量或者转换为null类型。

null引用是null类型表达式唯一可能的值。
null引用可以转换为任意引用类型。
可以认为null仅仅是一个可以称为任何引用类型的特殊符号。

1) 首先,null是java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别他们然后报错。
2) 就像每种原始类型都有默认值一样,int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。

3) null可以赋值给引用变量,不能将null赋值给基本类型变量,如int、double、float、boolean。

可以看到,直接将null赋值给基本类型会出现编译错误。但将null赋值给包装类object,然后将object赋给各自的基本类型,编译不会报错,但运行会空指针,这是自动拆箱导致的。

4) 任何含有null值的包装类在java拆箱生成基本数据类型时候都会抛出一个空指针异常。

5) 如果使用了带有null值的引用类型的变量,instanceof操作会返回false
6) 可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态类型绑定,不会抛空指针异常>
7)可以将null传递给方法使用,这时方法可以接收任何引用类型,如 public void print(Object obj)可以这样调用print(null).编译可以通过,但结果就取决去你的方法了。这个例子中的print方法,不会抛出空指针异常,只是退出,业务逻辑允许的话,推荐使用null安全的方法。
8) 可以使用== 或者 != 操作来比较null值,但是不能使用其他算法或者逻辑操作,如大于、小于。与SQL不同,java中的null==null会返回true;

Java有哪些数据类型相关推荐

  1. Java数据类型及变量作业_day02、Java变量与数据类型

    02_Java变量与数据类型 第二章 变量与数据类型 变量 变量的概述 变量是指内存中的一个存储区域,该区域要有自己的名称(变量名).类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值 ...

  2. java 基本的数据类型_Java的基本数据类型介绍

    1. Java的数据类型 Java的数据类型包括基本数据类型和引用数据类型.其中基本数据类型就是我们通常所说的4类8种数据类型,如下图所示,4类即整数类型.浮点数类型.字符型和布尔型,8种即byte. ...

  3. Java基础:Java变量、数据类型、运算符(2)

    1. 标识符和关键字 1.1 标识符 标识符是用来标识类名.对象名.变量名.方法名.类型名.数组名.文件名的有效序列. Java规定,标识符由字母.数字.下划线"_".美元符号&q ...

  4. Java的基础数据类型

    Java的基础数据类型 Java包括了两大数据类型,内置数据类型.引用数据类型. 基本数据类型 即内置数据类型,Java语言提供了八种基本类型,其中包括六种数字类型(四个整数型,两个浮点型),一种字符 ...

  5. java 左右两边数据类型不一样_Java笔记-day004-[运算符]

    java中的数据类型 两种\无数种 基本数据类型\引用数据类型 基本数据类型的分类[四类八种] 布尔类型 boolean true\false 字符类型 char 不区分中英文统一两个字节16个位 取 ...

  6. java中什么是类型_什么是Java中基本数据类型?

    Java中除了二进制文件和使用文本文件外还有基于Data的数据操作,这里的Data指的是Java的基本数据类型和String.基本数据类型包括byte.int.char.long.float.doub ...

  7. 浅谈Java中的数据类型以及面向对象

    在汇编语言中,没有类型的划分,只有数据跟指令,当然这也是从程序的角度去理解,对CPU来说,一切都是数据. 1:数据类型的概念 啥子叫类型?它是抽象的,是对具有相同特征跟行为的对象的描述.万物皆对象,对 ...

  8. Java中的数据类型及相互转换方法

    本文主要讲解两个部分: 一.Java中的数据类型有哪些? 二.数字类型和字符串类型相互转换的方法? 一.Java中的数据类型有哪些: Java中的数据类型有:基本数据类型和引用数据类型: 基本数据类型 ...

  9. boolean类型默认值_「软帝学院」Java的基本数据类型

    Java的基本数据类型 Java的两大数据类型: · 内置数据类型 · 引用数据类型 内置数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型 ...

  10. Java的原始数据类型一共就8个

    Java的原始数据类型一共就8个,分别是:byte.short.int.long.boolean.char.float.double.注意这些是大小写敏感的,而Boolean是boolean的封装类( ...

最新文章

  1. oracle千万级分页优化,oracle千万级数据分页存储过程优化
  2. confirm弹框修改按钮确认取消为是否
  3. python3字符串拼接_Python3基础 str + 字符串变量拼接
  4. 分布与并行计算—生命游戏(Java)
  5. Target “xxx” links to target “Boost::filesystem“ but the target was not found
  6. python svn库_python实现svn新老库迁移
  7. oracle hcm 发展,甲骨文发布Oracle HCM Cloud云服务 呈现三大亮点
  8. 领英宣布开源数据挖掘软件WhereHows
  9. 未能成功连接停车场服务器,停车场管理系统常见问题解答
  10. 计算机语言窗口如何归位,右下角时间语言电脑图标跑到左边去了如何还原
  11. python采集keep运动数据
  12. centos 7 下 硬盘GPT格式转换
  13. CSP-S(提高组)游记
  14. 8255A红绿灯c语言程序,汇编语言的交通灯程序
  15. 注水、占坑、瞎掰:起底机器学习学术圈的那些“伪科学”(附链接)
  16. webpack4对比webpack5
  17. Android 返回桌面的操作
  18. cisco3560及二层交换机配置vlan及常用命令
  19. 基础(待续)-弹群协同作战
  20. 启发国内学子学习少儿机器人编程教育

热门文章

  1. 01.爱芳地产项目小程序全栈项目经验(已上线)
  2. html中怎么设置页面的弧度,如何用css实现弧度圆角?三角形以及圆形
  3. 正确才是硬道理?No,KISS!
  4. Mongodb创建用户角色
  5. 概率函数,概率分布函数,概率密度函数
  6. Flutter中的路由实现方式
  7. 2020互联网数据分析师教程视频 统计学分析与数据实战 r语言数据分析实战 python数据分析实战 excel自动化报表分析实战 excel数据分析处理实战
  8. 让这些电影治愈你(转)
  9. master -> master (non-fast-forward)
  10. 暴力求解之中转站问题