首页 > 编程语言 >Java 基本数据类型 - 四类八种

Java 基本数据类型 - 四类八种

时间:2023-06-22 20:33:50浏览次数:37  
标签:Java -- 数据类型 八种 char int 类型 转换 byte

感谢:https://zhuanlan.zhihu.com/p/25439066

八种基本数据类型

img

分成四个大类

1、整型

byte 、short 、int 、long

2、浮点型

float 、 double

3、字符型

char

4、布尔型

boolean

数据类型详细介绍

整型(byte、short、int、long)

虽然byte、short、int、long 数据类型都是表示整数的,但是它们的取值范围可不一样。

byte 的取值范围:-128~127(-2的7次方到2的7次方-1)
short 的取值范围:-32768~32767(-2的15次方到2的15次方-1)
int 的取值范围:-2147483648~2147483647(-2的31次方到2的31次方-1)
long 的取值范围:-9223372036854774808~9223372036854774807(-2的63次方到2的63次方-1)

由上可以看出 byte、short 的取值范围比较小,而long的取值范围最大的,所以占用的空间也是最多的。int 取值范围基本上可以满足我们的日常计算需求了,所以也是我们使用的最多的一个整型类型。

浮点型(float、double)

float 和 double 都是表示浮点型的数据类型,它们之间的区别在于精确度的不同。

float(单精度浮点型)取值范围:3.402823e+38~1.401298e-45(e+38 表示乘以10的38次方,而e-45 表示乘以10的负45次方)
double(双精度浮点型)取值范围:1.797693e+308~4.9000000e-324(同上)

double 类型比float 类型存储范围更大,精度更高。

带小数点的字面量默认属于double类型,所以声明一个float类型的变量时,都要在数字后面加上 "F" 或 "f"。

在Java中,对浮点型数据使用基本的加减乘除运算符,计算的数据可能不是完全精确的,有时候可能出现小数点后几位浮动。对于金融行业或者和钱有关的业务来说,这是不可接受的,当出现与金钱数值相关的场景,建议使用BigDecimal 进行运算。

字符型(char)

char 有以下的初始化方式:

// 可以是汉字,因为是Unicode编码
char ch = 'a'; 
// 可以是十进制数、八进制数、十六进制数等等。
char ch = 1010; 
// 可以用字符编码来初始化,如:'\0' 表示结束符,它的ascll码是0,这句话的意思和 ch = 0 是一个意思。
char ch = '\0'; 

Java是用 unicode 来表示字符,“中” 这个中文字符在 unicode 就是两个字节。

unicode / gbk / gb2312 是两个字节,utf-8 是3个字节。

对于字符串(String),可以通过 String.getBytes(encoding) 方法,获取指定编码类型的byte数组。

布尔型(boolean)

boolean 型只有两个取值 true 和 false

它的默认值是 false

对于布尔型占用的空间,得看JVM对于它的具体实现,有些JVM底层其实是使用0和1来表示true和false,那么就是4字节。

基本类型之间的转换

img

在Java中,将一种类型的值赋值给另一种类型是很常见的。boolean 类型与其他7种类型的数据都不能进行转换,char 类型不支持自动转换成它,只支持强制转换,除了这两种类型有些特殊以外,其他6种数据类型,它们之间都可以进行相互转换,只是可能会存在精度损失。

转换分两种,自动转换和强制转换

自动转换:隐式的,对程序员无感知

强制转换:显式的,需指定目标类型

将6种数据类型按取值范围的大小顺序排列一下:

double > float > long > int > short > byte

取值范围从小转换到大,是可以直接转换的,而从大转成小,或转成 char 类型,则必须使用强制转换。

自动转换

自动转换时会进行扩宽(widening conversion)。

因为较大的类型(如int)要保存较小的类型(如byte),取值范围是足够的,不需要强制转换。

在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他类型的自动转换不会出现精度损失。

》int--> float

》long--> float

》long--> double

》float --> double

除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。

强制转换

如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换。

这也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。

强制转换的格式和实例如下:

(target-type) value;

// 实例
long lo = 99;
int i = (int) lo;

严格地说,byte转为char不属于(narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。

强制转换可能会损失精度,主要有两种场景

1、整数类型之间相互转换,如果整数超出目标类型范围,会对目标类型的范围取余数。

1、从浮点类型转成整数类型,会发生截尾(truncation),也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。

类型自动提升

在表达式计算过程中会发生类型转换,这些类型转换就是类型提升,类型提升规则如下:

  1. 所有 byte/short/char 的表达式都会被提升为 int
  2. 除以上类型,其他类型在表达式中,都会被提升为取值范围大的那个类型,例如有一个操作数为double,整个表达式都会被提升为double

拓展知识点

Java是面向对象语言,其概念为一切皆为对象,但基本数据类型是个例外

基本数据类型大多是面向机器底层的类型,它是 “值” 而不是一个对象,对于声明在方法中的基本类型变量,它存放于“栈”中而不是存放于“堆”中。这有很多好处,例如不需要和对象一样需要在堆中分配内存,然后搞个引用指向它。不需要GC,因为是直接在栈上分配空间,方法运行结束就出栈回收掉了。可以放心的使用最基本的运算符进行比较和计算等等。

没有什么是完美无缺的,数据类型也有缺点,例如会自动设置默认值(这是双刃剑,一些场景下会增加额外的处理逻辑),不支持泛型等。

Java希望使用一切皆为对象的理念来统一语言设计,但基本类型确实有很多优点和使用场景,鱼和熊掌我就要兼得之!所以它为每一个基本类型都提供了相应的包装类,封装了很多实用的方法,最重要的是,提供了自动装箱和自动拆箱的语法糖,让开发者可以无感知的在包装类型和基础类型之间来回切换。

  • boolean --> Boolean
  • char --> Character
  • byte --> Byte
  • short --> Short
  • int --> Integer
  • long --> Long
  • float --> Float
  • double --> Double
  • char[] --> String(字符串)

标签:Java,--,数据类型,八种,char,int,类型,转换,byte
From: https://www.cnblogs.com/javaxubo/p/17498285.html

相关文章

  • Java intern函数详解
    先看一个例子如果你会了那这篇文章你没必要看了,如果不会那请看下去,你一定会有收获:Strings=newString("hello");Stringstr1=s+"world";Stringstr3="helloworld";system.out.println(srt1==str3);Strings=newString("hello");Stringstr1=s+&q......
  • Java读取excel中日期格式结果为数字xxx天
    解释:Java读取excel中日期结果是计算1900-0-1之后到当前日期,一共有多少天,需要做一下转换处理/***用于计算1900-0-1之后的day天日期是哪天*举例:1900-0-1之后的44326天日期是2021/5/10*@return*/publicstaticStringdayToDate(intday){......
  • java.lang.ClassCastException java.util.Date cannot be cast to java.sql.Date
    报错信息:java.lang.ClassCastException:java.util.Datecannotbecasttojava.sql.Date原因是:不要这样进行转换。具体转换看这里https://www.cnblogs.com/javaxubo/p/17498174.html......
  • java中java.util.Date和java.sql.Date之间的转换
    1、util.Date和sql.Date之间的关系我们来看下java.sql.Date的源码packagejava.sql;importjava.time.Instant;importjava.time.LocalDate;publicclassDateextendsjava.util.Date{}从以上源码可以看出,sql.Date是util.Date的子类2、util.Date的构造方法以下是ja......
  • pg数据类型及数据类型转换
    数字类型:字符类型:时间日期类型:时间日期数据型支持的操符有、减、乘、除,下面举例说明:时间/日期类型常用函数:布尔类型:网络地址类型:当有存储IP地址需求的业务场时,对于PostgreSQL并不很悉的开发者可能会使用字符类型存储,实际上PostgreSQL提供用于存储IPv4......
  • JavaScript类
    1JavaScript类每个JavaScript对象都是一个属性集合,相互之间没有任何联系在JavaScript中也可以定义对象的类让每个对象都共享某些属性,这种“共享”的特性是非常有用的类的成员或实例都包含一些属性,用以存放或定义它们的状态其中有些属性定义了它们的行为(通常称为方法)。这......
  • redis数据类型和字符串操作
    redis数据类型1字符串===》做缓存,做计数器''' setkeyvalue getkey msetk1v1k2v2... mgetk1k2... setexkeyexpvalue incrbykeyincrement'''2列表===》消息队列''' rpushkeyvalue1value2... lpushkeyvalue1valu......
  • TypeScript中的数据类型
    1.js有的类型boolean类型、number类型、string类型、array类型、undefined、null2.ts多出的类型tuple类型(元组类型)、enum类型(枚举类型)、any类型(任意类型)3.特别的类型 void类型(没有任何类型)表示定义方法没有返回值 never类型:是其他类型(包括null和undefined)......
  • 56基于java的房屋租赁系统设计与实现
    本章节给大家带来一个基于java房屋租赁系统设计与实现,可适用于java租房网站java房子租用,房屋租用,租房网站,租房管理系统,房屋预约系统,预约看房,房屋资讯,在线房屋信息管理系统等。引言经过调查,目前现代人的生活节奏加快,生活压力也在逐渐的增加,网络的发展给人们带来的便利,随着网上......
  • java泛型
    泛型原理什么是泛型&为什么引入泛型publicstaticvoidmain(String[]args){ArrayListlist=newArrayList();list.add(521);//添加Integer类型元素list.add("wan");//添加String类型元素list.add(true);//添加Boolean类型元素......