Java有哪些数据类型
目录
- 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);
}
二者的区别:
声明方式不同:基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;
存储方式及位置不同:基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;
初始值不同:基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;
使用方式不同:基本类型直接赋值直接使用就好,而包装类型在集合如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有哪些数据类型相关推荐
- Java数据类型及变量作业_day02、Java变量与数据类型
02_Java变量与数据类型 第二章 变量与数据类型 变量 变量的概述 变量是指内存中的一个存储区域,该区域要有自己的名称(变量名).类型(数据类型),该区域的数据可以在同一数据类型的范围内不断变化值 ...
- java 基本的数据类型_Java的基本数据类型介绍
1. Java的数据类型 Java的数据类型包括基本数据类型和引用数据类型.其中基本数据类型就是我们通常所说的4类8种数据类型,如下图所示,4类即整数类型.浮点数类型.字符型和布尔型,8种即byte. ...
- Java基础:Java变量、数据类型、运算符(2)
1. 标识符和关键字 1.1 标识符 标识符是用来标识类名.对象名.变量名.方法名.类型名.数组名.文件名的有效序列. Java规定,标识符由字母.数字.下划线"_".美元符号&q ...
- Java的基础数据类型
Java的基础数据类型 Java包括了两大数据类型,内置数据类型.引用数据类型. 基本数据类型 即内置数据类型,Java语言提供了八种基本类型,其中包括六种数字类型(四个整数型,两个浮点型),一种字符 ...
- java 左右两边数据类型不一样_Java笔记-day004-[运算符]
java中的数据类型 两种\无数种 基本数据类型\引用数据类型 基本数据类型的分类[四类八种] 布尔类型 boolean true\false 字符类型 char 不区分中英文统一两个字节16个位 取 ...
- java中什么是类型_什么是Java中基本数据类型?
Java中除了二进制文件和使用文本文件外还有基于Data的数据操作,这里的Data指的是Java的基本数据类型和String.基本数据类型包括byte.int.char.long.float.doub ...
- 浅谈Java中的数据类型以及面向对象
在汇编语言中,没有类型的划分,只有数据跟指令,当然这也是从程序的角度去理解,对CPU来说,一切都是数据. 1:数据类型的概念 啥子叫类型?它是抽象的,是对具有相同特征跟行为的对象的描述.万物皆对象,对 ...
- Java中的数据类型及相互转换方法
本文主要讲解两个部分: 一.Java中的数据类型有哪些? 二.数字类型和字符串类型相互转换的方法? 一.Java中的数据类型有哪些: Java中的数据类型有:基本数据类型和引用数据类型: 基本数据类型 ...
- boolean类型默认值_「软帝学院」Java的基本数据类型
Java的基本数据类型 Java的两大数据类型: · 内置数据类型 · 引用数据类型 内置数据类型 Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型 ...
- Java的原始数据类型一共就8个
Java的原始数据类型一共就8个,分别是:byte.short.int.long.boolean.char.float.double.注意这些是大小写敏感的,而Boolean是boolean的封装类( ...
最新文章
- oracle千万级分页优化,oracle千万级数据分页存储过程优化
- confirm弹框修改按钮确认取消为是否
- python3字符串拼接_Python3基础 str + 字符串变量拼接
- 分布与并行计算—生命游戏(Java)
- Target “xxx” links to target “Boost::filesystem“ but the target was not found
- python svn库_python实现svn新老库迁移
- oracle hcm 发展,甲骨文发布Oracle HCM Cloud云服务 呈现三大亮点
- 领英宣布开源数据挖掘软件WhereHows
- 未能成功连接停车场服务器,停车场管理系统常见问题解答
- 计算机语言窗口如何归位,右下角时间语言电脑图标跑到左边去了如何还原
- python采集keep运动数据
- centos 7 下 硬盘GPT格式转换
- CSP-S(提高组)游记
- 8255A红绿灯c语言程序,汇编语言的交通灯程序
- 注水、占坑、瞎掰:起底机器学习学术圈的那些“伪科学”(附链接)
- webpack4对比webpack5
- Android 返回桌面的操作
- cisco3560及二层交换机配置vlan及常用命令
- 基础(待续)-弹群协同作战
- 启发国内学子学习少儿机器人编程教育
热门文章
- 01.爱芳地产项目小程序全栈项目经验(已上线)
- html中怎么设置页面的弧度,如何用css实现弧度圆角?三角形以及圆形
- 正确才是硬道理?No,KISS!
- Mongodb创建用户角色
- 概率函数,概率分布函数,概率密度函数
- Flutter中的路由实现方式
- 2020互联网数据分析师教程视频 统计学分析与数据实战 r语言数据分析实战 python数据分析实战 excel自动化报表分析实战 excel数据分析处理实战
- 让这些电影治愈你(转)
- master -> master (non-fast-forward)
- 暴力求解之中转站问题