Java中的八种基本数据类型详解

目录
  • 一、八种基本数据类型常识
    • 基本常识表
  • 详解二、直接量与类型转换
    • 2.1、直接量
    • 2.2、类型转换
      • 1.自动转换:低类型的向高类型的转换
      • 2.强制转换:高类型的向底类型转换,但可能会数据溢出或者精度丢失
  • 三、对应包装类及使用
    • 3.1、基本介绍
    • 3.2、常用方法一:静态方法 valueOf()
    • 3.3、常用方法二:静态方法parseXXX(String str)
    • 3.4、常用方法二:非静态方法XXXValue()
    • 3.5、自动拆箱与装箱
    • 3.6、关于valueOf()方法源码研究
  • 四、相关面试题
    • 4.1、类型转换
    • 4.2、+=的情况
    • 4.3、自动装箱
    • 4.4、char类型存储汉字

一、八种基本数据类型常识

基本常识表

对于上图有以下几点需要注意:

  • java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double、boolean、char;
  • java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);
  • 整数的默认类型为int,浮点数的默认类型为double;
  • 八种基本数据类型的包装类:除了char的是Character、int类型的是Integer,其他都是首字母大写
  • 关于值的范围问题,需要注意char类型是无符号的,不能为负,所以是0开始的;

详解二、直接量与类型转换

2.1、直接量

  • 整数型的直接量默认为int类型
  • 浮点型的直接量默认为double类型
@Test
	public void d() {
		int a=100;//这个100就是直接量
		a=a+100;//但是这个a+100不是直接量
		double b=3.14;
	}

2.2、类型转换

1.自动转换:低类型的向高类型的转换

如下图:顺着箭头的方向是可以自动转换的;

2.强制转换:高类型的向底类型转换,但可能会数据溢出或者精度丢失

以上现象在实际中可以出现这三种问题:

  • 定义变量时出现的类型转换
@Test
	public void e(){
		long a=200;//200是直接量,默认为int类型这里是自动转换为弄类型

		/*long b=100000000000;*/
		//100000000000是个整数直接量,默认应该为int类型,但是超出了int类型的取值范围

		long c=1000000000000L;
		//在整数直接量后面将了一个L,表示该直接量不再默认为int类型,为long类型,所以没错

		/*float d=34.3;*/
		//浮点型直接量默认为double,double类型大,所以不能直接转换为float

		float e=34.3f;
		//在浮点数直接量后面加上一个f,表示该直接量不再默认为double,为float类型
	}

以上为几种正常的情况,但是有一种特殊的情况,就是int型直接量可以直接赋给byte、short、char类型变量,只要不超出变量类型的取值范围

@Test
	public void f() {
		byte a=100;
		short b=200;
		char c=100;//注意char类型是一种特殊的int类型,可以不用写成单引号括起来的

		/*byte d=128;直接量128超出了byte类型的取值范围*/

		/*char e=-1;直接量-1不在char类型的取值范围内*/

	}
  • 数据运算时的类型转换

(1)运算时,运算结果会向较大的类型转换

@Test
	public void g() {
		int a=3;
		double b=4;
		System.out.println(a+b);//输出7.0

		float c=3.2f;
		/*c=c+3.14; 编译错误,运算之后变为double类型*/
	}

(2)特殊的:byte、short、char三种数据类型参与运算时,先一律转化为int类型;

	@Test
	public void h() {
		byte a=3;
		byte b=4;
		/*byte c=a+b;
		 * 编译错误,此处由于byte类型参与运算时,先直接转换为int类型,
		 * 所以最后的结果也是int类型,但是得出的结果不能叫做int类型的直接量,所以编译错误
		 * */
		int d=a+b;
	}
  • 强制转换

高等级转为低等级的时候,必须强制转换,但实际工作中不推荐使用强制转换,可能会失精度或数据溢出;

@Test
	public void j() {
		int a=128;
		byte b=(byte)a;
		System.out.println(b);//输出-128,出现了数据溢出

		double c=1.23;
		int d=(int)c;
		System.out.println(d);//输出1,精度丢失
	}

补充说明:不是只有强制转换的时候会出现数据,例如下面这种情况

@Test
	public void k() {
		int a=10000000;
		int b=10000000;
		int c=a*b;
		System.out.println(c);//输出276447232,得到的结果超出了int类型的范围,数据溢出
	}

三、对应包装类及使用

3.1、基本介绍

java是一门面向对象的语言,但是8中基本数据类型不具备面向对象的特征,所以实际使用中很不便所以为java八种基本数据类型提供了对应的包装类。

基本数据类型 对应包装类 包装类的父类
byte java.lang.Byte java.lang.Number
short java.lang.Short java.lang.Number
int java.lang.Integer java.lang.Number
long java.lang.Long java.lang.Number
float java.lang.Float java.lang.Number
double java.lang.Double java.lang.Number
boolean java.lang.Boolean java.lang.Object
char java.lang.Character java.lang.Object
  • 对应包装类比较特殊的就是int对应的Integer和char对应的Character;
  • 对应包装类的直接父类:前6个由于是数,直接父类为Number,而后两个的直接父类就是Object类;

3.2、常用方法一:静态方法 valueOf()

  • 参数为基本数据类型,返回包装类对象;
  • 参数为String字符串(Character类没有以String为 参数的该方法),返回包装类对象;
@Test
	public void a() {
	/*1.参数为基本数据类型
	 * 作用:将基本数据类型转换为对应包装类 * */
		Integer i=Integer.valueOf(10);
		System.out.println(i);//输出10

	/*2.参数为String字符串时,
	 * 作用:返回指定字符串值的包装类对象
	 * 	*/
		Integer a=Integer.valueOf("100");
		System.out.println(a);//输出100

		Integer b=Integer.valueOf("100a")为
		System.out.println(b);//运行错误,字符串的值不少一个int类型的

	}

3.3、常用方法二:静态方法parseXXX(String str)

  • Character类没有该方法;
  • 作用:将字符串装换为对应的基本数据类型(注意此处和上面的valueOf方法返回值的不同);
@Test
	public void b() {
		/*作用:将给定字符串装换为对应的基本数据类型
		 * 前提是该字符串必须正确描述该基本数据类型表示的值*/
		int a=Integer.parseInt("100");
		System.out.println(a);//输出100

		int b=Integer.parseInt("100a");
		System.out.println(b);//运行错误,字符串的值不为int类型

	}

3.4、常用方法二:非静态方法XXXValue()

  1. 因为是非静态方法,所以不能像上面两个方法用类名调用了;
  2. 数字类的包装类(八种包装类中父类是Number的的六个类)才有该方法;
  3. 作用:将当前包装类对象转换为对应的基本数据类型;
@Test
	public void c() {
		/*作用:将包装类对象转换为对应的基本数据类型*/

		Integer a=Integer.valueOf(100);//将基本数据类型转换为包装类对象
		int b=a.intValue();//将包装类对象转换为对应的基本数据类型
		System.out.println(b);//输出100

		Double c=Double.valueOf(2.33);
		double d=c.doubleValue();
		System.out.println(d);
	}

3.5、自动拆箱与装箱

简介:jdk1.5之后的新特性。该特性是编译器认可的,是在编译器自动将基本数据类型和包装类相互转换,节省了麻烦。

  • 自动拆箱 包装类——>基本数据类型 (原理是调用了xxxValue方法)
  • 自动装箱 基本数据类型——>包装类 (原理是调用了valueOf方法)
@Test
	public void d() {
		/*自动装箱:valueOf*/
		Integer i=123;//原理是 Integer i=Integer.valueOf(123);

		/*自动拆箱*/
		int i1=i+1;//原理是	int i1=i.intValue()+1;

		Integer a=123;
		Integer b=123;
		Integer c=a+b;
		/*原理为Integer c=Integer.valueOf(a.intValue()+b.intValue());*/
	}

3.6、关于valueOf()方法源码研究

通过按住Ctrl键,鼠标点击该方法即可查看源码,以Integer类的valueOf(int i)的源码为例

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
  • 关于源码的理解:Integer类的valueOf(int i)方法首先会判断i是否在-128~127之间,如果在的话,就返回的对象是Integer类中静态数组cache中的对象,如果不是在这之间,就会重写创建一个新的对象。

通过查看其它类的该方法的源码之后,可以得到该表:

包装类 valueOf(X i)返回对象的原则
Byte 直接取,数组范围为(-128,127),且byte值的范围也是(-128,127)
Short (-128,127)之间在数组中取,否则new
Integer (-128,127)之间在数组中取,否则new
Long (-128,127)之间在数组中取,否则new
Float 直接new
Double 直接new
Boolean 直接返回,不new
Character 0-127之间从数组中取,否则new

四、相关面试题

4.1、类型转换

注意一些喜欢忽视的类型转换

public static void main(String[] args) {
		int a=10;
		double b=3.4;
		System.out.println(a>b?a:b);
		System.out.println(a);
	}
/*输出:10.0   10
解析:这里是一个很容易让人不注意的类型转化,这里a与b参与了运算,
所以类型向类型大的方向转化,10就变成了10.0,但是a本身是没有变化的*/

4.2、+=的情况

public static void main(String[] args) {
		short a=1;	//第一行
		 a=a+1;		//第二行
		 a+=1;		//第三行
}
/*第几行的代码会出错?
答案:第二行会出错,由于a+1变为了int类型,而int类型不能直接赋值给short类型
但是+=这种情况是特殊的,所以不会出错;
*/

4.3、自动装箱

包装类和基本数据类型比较时,只要值相等就相等

public static void main(String[] args) {
		Integer a1=127;
		Integer a2=127;
		int a3=127;
		Integer b1=128;
		Integer b2=128;
		int b3=128;
		System.out.println(a1==a2);
		System.out.println(a1==a3);
		System.out.println(b1==b2);
		System.out.println(b1==b3);
}
/*输出:true true false true
解析:自动装箱时采用valueOf方法,由于127在静态数组的范围内,所以不是new的,
而128的两个引用是指向new出现对象的,所以第一个是true,第三个是false。
而包装类和基本数据类型比较时,只要数值是相等的,就相等
*/

4.4、char类型存储汉字

char类型能不能存储一个汉字?为什么?

解析:能,char类型采用的是Unicode编码,Unicode编码包含汉字,所以char类型自然是可以存储一个汉字的

4.5、浮点数精度问题

public static void main(String[] args) {
		System.out.println(0.1*3==0.3);
		System.out.println(0.1*4);
}
/*输出:false 0.4
解析:有些浮点数不能准确的表示出来,与整数相乘之后出精度丢失,常见为小数位含3的
*/

到此这篇关于Java八种基本数据类型的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 初识Java一些常见的数据类型

    目录 1.Java是什么 2.为什么总有人说Java是最好的语言 3.一个简单的main函数 4.运行Java程序 5.Java书写 注意问题 6.数据类型与运算符 6.1变量和类型 6.2 整型变量(重点) 6.3长整型变量 6.4双精度浮点型变量 6.5单精度浮点型变量 6.6字符类型变量 6.7字节类型变量 6.8短整型变量 1.Java是什么 Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义,不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个

  • Java详解数据类型的定义与使用

    目录 标识符和关键字 标识符 什么是标识符 标识符的定义规则 关键字 常量和变量 常量 变量 变量的声明格式 变量的声明 基本数据类型 整数类型 浮点类型 浮点类型常量 浮点类型变量 字符类型 字符型 字符串型 布尔类型 基本数据类型的转换 自动类型转换 强制类型转换 标识符和关键字 标识符 读音 biao zhi fu 什么是标识符 包.类.变量.方法…等等,只要是起名的地方,那个名字就是标识符 标识符的定义规则 四个可以:可以是数字.字母.下划线(_).美元符号($),我们一般起名尽量使用英

  • Java基础-Java基本数据类型

    目录 1 前言 2 布尔类型 3 字符类型 4 值类型 4.1 byte 4.2 short 4.3 int 4.4 long 4.5 float 4.6 double 5 码农来洞见 5.1 类型转换 5.2 存储空间 1 前言 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过定义不同类型的变量,可以在内存中储存整数.小数或者字符. Java支持八种基本数据类型,包括一种布

  • Java基本数据类型族谱与易错点梳理解析

    目录 1.八大基本数据类型族谱 2.八大类型细节解析 1.byte 2.short 3.int 4.long 5.char 6.float 7.double 8.boolean 3.小剧场解答 问答小剧场 以下会产生信息丢失的类型转换是( ) A.float a=10; B.int a =(int)8846.0; C.byte a=10:int b=-a D.double d=100 可直接跳转至结尾看答案加解析 1.八大基本数据类型族谱 Java的八大基本数据类型包括——byte.char.s

  • java中基本数据类型与Object的关系说明

    目录 基本数据类型与Object的关系 这里举一个例子 Object.基本数据类型的包装类 Object类 基本数据类型 基本数据类型与Object的关系 我知道大家是不是都听说过Object是所有类型的基类,但是这句话其实并不是正确的,因为java中基本数据类型跟Object是没有任何关系的. 这里举一个例子 这里在进行调用swap方法时,是不能直接将int类型传给swap(Object obj)方法的,因为Object其实跟基本数据类型没有一点关系,这个时候a就发现我们类型不匹配, 所以就自

  • 聊聊java中引用数据类型有哪些

    目录 java中引用数据类型有哪些 下面说说java中引用数据类型: 一.类Class引用 二.接口interface引用 三.数组引用 数组的定义 数组的初始化 初始化数组的两种方式: 为什么Java里有基本数据类型和引用数据类型? java中引用数据类型有哪些 Java中有俩种数据类型,其中主要有8中基本数据类型和引用数据类型,除了8中基本数据类型以外都是引用数据类型,8中基本数据类型分别是byte,short,int,long,char,boolean,float,double,具体如下:

  • Java中常用数据类型的输入输出详解

    目录 1.Char型 1.1  输入格式: 1.2  举例说明 2.int型 1.1  简单的int格式输入: 1.2  举例说明 2.1带空格的int格式输入 : 2.2  举例说明 3.1  复杂int格式的输入 3.2  举例说明 3.double型 4.多次输入 1.1  输入格式 1.2  举例说明 5.数组 1.1  数组输入格式: 2.1  数组转换成字符串 6.字符串 1.1  字符串转换成整型,浮点型(以整型为例) 1.2  整型,浮点型转换成字符串 2.1  字符串转换成字符

  • Java中的复合数据类型

    目录 1.Java字符串 2.Java中的包装类 3.Java容器 ArrayList HashSet HashMap 4.工具类 Stack Queue 1.Java字符串 在 Java 中字符串被作为 String 类型的对象处理. String 类位于 java.lang 包中,默认情况下该包自动导入. String对象创建后不会被修改,当我们修改某个字符串对象实际上是将原引用指向了新创建的内存空间.并且相同的字符串常量Java不会分配两个内存空间,而是将两个引用指向相同的空间. publ

  • Java中的八种基本数据类型详解

    目录 一.八种基本数据类型常识 基本常识表 详解二.直接量与类型转换 2.1.直接量 2.2.类型转换 1.自动转换:低类型的向高类型的转换 2.强制转换:高类型的向底类型转换,但可能会数据溢出或者精度丢失 三.对应包装类及使用 3.1.基本介绍 3.2.常用方法一:静态方法 valueOf() 3.3.常用方法二:静态方法parseXXX(String str) 3.4.常用方法二:非静态方法XXXValue() 3.5.自动拆箱与装箱 3.6.关于valueOf()方法源码研究 四.相关面试

  • Java中的8大基本数据类型详解

    前言:做一下笔记. 1.Java基本数据类型图 2.Java基本数据类型 整数类型:byte,1字节,8位,最大存储数据量是255,存放的数据范围是-128~127之间. 整数类型:short,2字节,16位,最大数据存储量是65536,数据范围是-32768~32767之间. 整数类型:int,4字节,32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1. 整数类型:long,8字节,64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方

  • 详解Java中的八种单例创建方式

    目录 定义 使用场景 单例模式八种方式 饿汉式(静态常量) 饿汉式(静态代码块) 懒汉式(线程不安全) 懒汉式(同步方法) 懒汉式(同步代码块) 双重检查锁方式 静态内部类方式 枚举方式 总结 定义 单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法) 使用场景 对于一些需要频繁创建销毁的对象 重量级的对象 经常使用到的对象 工具类对象 数据源 session 单例模式八种方式 饿汉式(静态常量) 代码 /**

  • Java编程中的4种代码块详解

    在Java编程中,代码块就是指用"{}"括起来的代码.下面看一下这四种代码块. 1.普通代码块 就是指类中方法的方法体. public void xxx(){ //code } 2.构造块 下面用"{}"括起来的代码片段,构造块在创建对象时会被调用,每次创建对象时都会被调用,并且优先于类构造函数(包括有参和无参的)执行. 构造块中定义的变量是局部变量. public class Client { {//构造代码块 System.out.println("执

  • Java中==符号与equals()的使用详解(测试两个变量是否相等)

    Java 程序中测试两个变量是否相等有两种方式:一种是利用 == 运算符,另一种是利用equals()方法. 当使用 == 来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true. 但是对于两个引用类型变量,只有它们指向同一个对象时, == 判断才会返回true. == 不可用于比较类型上没有父子关系的两个对象. 很多书上说equals()方法是判断两个对象的值相等.这种说法不准确.实际上equals()方法是O

  • Java中内存异常StackOverflowError与OutOfMemoryError详解

     Java中内存异常StackOverflowError与OutOfMemoryError详解 使用Java开发,经常回遇到内存异常的情况,而StackOverflowError和OutOfMemoryError便是最常遇见的错误. 首先,看看这两种错误的解释: 如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常. 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常. 这里把异常分为两种情况,但是存在一些相互重

  • java中Executor,ExecutorService,ThreadPoolExecutor详解

    java中Executor,ExecutorService,ThreadPoolExecutor详解 1.Excutor 源码非常简单,只有一个execute(Runnable command)回调接口 public interface Executor { /** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thre

  • java 中JDBC连接数据库代码和步骤详解及实例代码

    java 中JDBC连接数据库代码和步骤详解 JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤:  1.加载JDBC驱动程序:  在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String  className)实现. 例如: try{ //加载MySql的驱动类 Class.forName("com.mysql.jdbc.Driver") ; }catch(Class

  • java 中模式匹配算法-KMP算法实例详解

    java 中模式匹配算法-KMP算法实例详解 朴素模式匹配算法的最大问题就是太低效了.于是三位前辈发表了一种KMP算法,其中三个字母分别是这三个人名的首字母大写. 简单的说,KMP算法的对于主串的当前位置不回溯.也就是说,如果主串某次比较时,当前下标为i,i之前的字符和子串对应的字符匹配,那么不要再像朴素算法那样将主串的下标回溯,比如主串为"abcababcabcabcabcabc",子串为"abcabx".第一次匹配的时候,主串1,2,3,4,5字符都和子串相应的

  • 基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("876",8).toString() 二进制转十进制 Integer.valueOf(&qu

随机推荐