Java基本数据类型知识总结

Java基本数据类型一览表

原生类型 占位数 是否有符号位 最小值 最大值 默认值 包装类 备注
boolean 1 —— —— false Boolean boolean类型是孤独的皇后,她无法和其他类型转换
byte 8 -2^7=-128=Byte.MIN_VALUE 2^7-1=127=Byte.MAX_VALUE 0 Byte IO流中经常使用
char 16 ‘\u0000’=0=Character.MIN_VALUE ‘\uFFFF’=2^15*2-1=65535=Character.MAX_VALUE ‘\u0000’ Character
short 16 -2^15=Short.MIN_VALUE 2^15-1=Short.MAX_VALUE 0 Short 历史遗留类型,不再被使用
int 32 -2^31=Integer.MIN_VALUE 2^31-1=Integer.MAX_VALUE 0 Integer
long 64 -2^63=Long.MIN_VALUE 2^63-1=Long.MAX_VALUE 0 Long 在int无法存储的情况下使用
float 32 1.4E-45f=Float.MIN_VALUE 3.4028235E38=Float.MAX_VALUE 0.0f Float 在对内存要求高对精度要求不高时使用
double 64 4.9E-324=Double.MIN_VALUE 1.7976931348623157E308==Double.MAX_VALUE 0.0d Double

表说明:

1.nEm表示n*10的m次方,nE-m表示n*10的m次方分之一。

2.Java核心技术卷一是说:“Java没有任何无符号类型”是错的,事实上boolean和char确实是无符号类型。

3.Java核心技术卷一上标明了float类型的取值范围是±3.40282347E38明显写错了。

字符相关知识

代码单元就是char类型的数值范围,0-65535都是代码单元。

代码点就是超出65535的代码单元,这时由于char类型的最大值限制,导致char无法表示一个大于65535的字符。

为解决这个问题,开发JavaAPI的攻城狮就将大于65535的字符统一用两个代码单元(0-65535)表示,并且规定,这两个代码单元是好基友,是一个整体,我们就叫它们代码点好了!

为了将所有字符都有统一的名字,API的攻城狮也是蛮拼的,攻城狮们干脆再规定,0-65535的代码单元也可以叫代码点!

以下为代码单元和代码点的操作代码:

char[] c = Character.toChars(65536);
String str = new String(c);
System.out.println("我是一个代码点,不信你看: " + str.codePointCount(0, str.length()));// 1
System.out.println("我是这个代码点数值为:" + str.codePointAt(0));
System.out.println("我是两个代码单元,不信你看: " + str.length());
System.out.println("我是第一个代码单元:" + (int) str.charAt(0));
System.out.println("我是第一个代码单元:" + (int) str.charAt(1));
String test = "A" + str + "B";
for (int i = 0; i < test.length(); i++) {
    System.out.println("遍历字符串的代码单元是这样干的:" + (int) test.charAt(i));
}
for (int i = 0; i < test.length(); i++) {
    int codePoint = test.codePointAt(i);
    System.out.println("遍历字符串的代码点是这样干的:" + codePoint);
    if (Character.isSupplementaryCodePoint(codePoint)) {
        i++;
    }
}

为什么不建议使用char?

String c1=””;//数学上的整数集符号,这个符号无法用char表示,因为它超出65535了,所以只能采用是两个char(代码单元)表示。

String str=c1+”A”;

char c2=str.chartAt(1);

结果c2不是你想要的’A’,而是的后半个字符(代码单元)。

代码单元代码点相关的详细资料请查看:

Java中的代码点和代码单元

Java如何存储负数

1.如何存储负数

Java是采用”2的补码”(简称补码)存储负数的。

如8位的数字00000001表示正数1,11111111示负数1。

2.补码

补码是基于有符号位的(基于置符号位的),正数的补码等于数字本身(这句话要这样理解:并不是正数的补码等于本身,而是正数不需要计算它的补码,正数计算的补码是给负数用的,所以规定正数的补码等于本身)。

3.”2的补码”

“2的补码”是将一个数的反码+1。

4.反码

反码就是将数字的二进制位全部取反,0变成1,1变成0,正数的反码等于数字本身(这句话要这样理解:并不是正数的反码等于本身,而是正数不需要计算它的反码,正数计算的反码是给负数用的,所以规定正数的反码等于本身)。

如00000001的反码就是11111110。

5.”1的补码”

“1的补码”不用细究它,因为”1的补码”的结果和反码一致,只是它采用的不是”二进制位全部取反“的操作方式。我们不用管它是怎么算的,直接将它理解成反码就对了。

6.置符号位

数字置符号位是二进制中表示正负的方法,一个数字的最高位就是符号位,如果符号位为0表示正,如果符号位为1表示负。

7.直观表示法

直观便于理解的表示二进制负数的形式是置符号位,不需要采用补码。

如8位的数字00000001表示正数1,10000001示负数1。

8.为什么采用补码表示负数

之所以采用补码表示负数,而不是直接采用直观便于理解的置符号位,是因为在计算机中直观表示在做负数运算是不能得到正确的结果,而补码却可以做到。

如:

数00000001(数字1的直观表示法)

+10000001(数字-1的直观表示法)

=10000010(数字-2的直观表示法)

很明显1+(-1)=0而不是-2啊!!!

而采用补码方式却可以得到正确的结果:

数00000001(数字1的补码表示法)

+11111111(数字-1的补码表示法)

注意此时只有8位,超过8位会溢出,所以:

=00000000(数字0的补码表示法)

基本类型转换

1.boolean与其他任何类型都不兼容。

2.小类型向大类型转换时,如果小类型不是char类型,那么就执行无符号扩展,如果小类型是char那么永远执行无符号扩展。

有符号扩展:

byte b=”00000001”;

short s=b;//此时s的值为0000000000000001

byte b=”11111111”;//11111111是byte类型-1的补码形式

short s=b;//此时s的值为1111111111111111,1111111111111111是short类型-1的补码形式。

无符号扩展:

char c=”1111111111111111”;

int i=c;//此时i的值为00000000000000001111111111111111。

char c=”0000000000000001”;

int i=c;//此时i的值为00000000000000000000000000000001。

3.大类型向小类型转换时需要强制转换。

浮点类型相关知识

1.浮点类型的存储范围很大

float虽然和int占位一样,但float能存储的值比int大太多,可以参见Integer.MAX_VALUE和Float.MAX_VALUE,不但如此,float比long都大很多,另外double又比float更大。 所以,long存放不了的数字可以存放在float,float放不下的数字可以放入double中。

2.浮点类型无法完全精确表示小数

float和double在计算时都不是完全精确的,float能精确到6位或7位小数,double能精确到15位小数。

超出范围的小数会被四舍五入。

例如:

System.out.println(1.0f/0.3f);
System.out.println(2.0f/0.3f);
System.out.println(1.0d/0.3d);
System.out.println(2.0d/0.3d);
打印:
3.3333333
6.6666665
3.3333333333333335
6.666666666666667

3.二进制无法精确表示一些可以在10进制精确表示的小数

二进制无法精确表示十进制中的一些数,就像十进制无法精确表示1/3一样,二进制无法精确表示0.1等等各种小数。

(以下是复制的)

二进制表示小数的时候只能够表示能够用1/(2^n)的和的任意组合。

例如:

0.5能够表示,因为它可以表示成为1/2。

0.75也能够表示,因为它可以表示成为1/2+1/(2^2)。

0.875也能够表示,因为它可以表示成为1/2+1/(2^2)+1/(2^3)。

0.1不能够精确表示,因为它不能够表示成为1/(2^n)的和的形式。

4.浮点类型在计算时容易出现偏差

原因有两点:

1.因为浮点类型的精度都是固定的,超出范围的精度会被四舍五入。

2.因为二进制无法精确表示十进制中的一些数,所以你会看到很奇怪的结果,如:

System.out.println(1.0-0.93);
System.out.println(1.0-0.7);
System.out.println(1.1-1.0);
打印:
0.06999999999999995//计算机无法表达0.07
0.30000000000000004//计算机无法表达0.3
0.10000000000000009//计算机无法表达0.1

要想使用完全精确的计算请使用BigDecimal,并且是BigDecimal(String val)这个构造方法。

5.不要使用==判断两个浮点数的大小

对于浮点类型之间的大小判断,不应该使用==,而只能使用>、<、>=、<=,愿意上面第4点已经说了。

示例:

float f1=1.345f;
float f2=1.123f;
System.out.println(f1+f2-f2==f1);//打印false

了解浮点数详细信息请查看:你的小数点去哪了

小数在计算机中的存储形式

二进制浮点数和十进制浮点数相互转换

十进制转二进制:

整数部分,看图:

小数部分,看图:

二进制转十进制:

二进制转十进制比较简单,将二进制的所有面值乘以2的“字面值对应的权系”次方相加,语言不太好表达,看公式:

n1*(2^m2)+n2*(2^m2)+n3*(2^m3)+…

例如:

1101.01=1*2(2^3) +1*2(2^2)+0*(2^1)+1*(2^0)+0*(2^-1)+1*(2^-2)=8+4+0+1+0+0.25=13.25。

时间: 2024-10-15 07:42:25

Java基本数据类型知识总结的相关文章

JAVA 的基础知识

一 对昨天的知识复习,如JDK  JVM  JRE等等的进行系统的回顾. 二  JAVA的数据类型 1.基本数据类型(如int/char /byte/ short 等这样的数值类型) 2.引用类型 * API中的类,比如String.File *自定义的类,如PersonalAccount,CreditAccount * 数组,如int[],String[] 三  基本数据类型的取值范围.类型转换.理解应用如下图: 1[ 8种基本数据类型/位数]:(byte/8 ) (short/16) (in

JAVA OO入门知识

说到JAVA 语言  就要从JAVA 的起源开始 1.起始于GREEN项目 2.集C,C++,LISP,于一体 Java OO被称为面向对象语言  意思是以对象作为基本程序结构单位的程序设计语言.用于描述以对象为核心的程序结构.其次,面向对象是基于类. 面向对象的三项基本特征包括 1.封装 意思是将各个独立的功能设计成独立的可重复使用的方法单元.方便对于程序的修改,减少代码的冗余. 2.继承 发生在两个对象之间,继承对象可以使用被继承对象的一些属性 3.多态 不同的场合做出不同的响应 有着不同的

面试总结(一)——Java基础相关知识

面试总结(一)--Java基础相关知识 最近在面试,所以总结下面试容易问到的知识点,用来备份查看用. 若需转载,请注明出处. 1.面向对象的特点: 1.将复杂的事情简单化 2.面向对象将以前过程中的执行者,变成了指挥者 3.面向对象思想是符合人们思考习惯的思想 2.面向对象特征: 1.封装:隐藏对象的属性和实现的细节,仅对外提供公共访问方式 好处:将变化隔离,便于使用,提高复用和安全性. 原则:将不需要对外提供的内容隐藏起来,隐藏属性,提供公共方法对其访问. 2.继承:提高代码复用性,继承是多态

退休老码农提醒你!学习Java,这些知识要牢记,能让你少走弯路!

现在的java在编程界基础已经根深蒂固了,随之带来的影响就是有大量的岗位,大量的工作方向,虽然现在很多的新兴语言势头都非常的猛烈,但是这并不影响java依然体量最大的编程语言,而且丝毫也看不出这门语言有任何衰减的趋势,依然有大量的从业人员在java开源领域贡献着大量的代码,在新兴的领域java切入进来也是毫不费力.创一个小群,供大家学习交流聊天如果有对学java方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家对学java能够持之以恒java爱好群,如果你想要

Java 基本数据类型

基本数据类型 所占用空间大小 byte b; 1字节 short s; 2字节 int i; 4字节 long l; 8字节 char c; 2字节(C语言中是1字节) float f; 4字节 double d; 8字节 boolean bool; false/true 1字节 基本数据类型注意事项: 1.未带有字符后缀标识的整数默认为int类型: 未带有字符后缀标识的浮点数默认为double类型. 2.如果一个整数的值超出了int类型能够表示的范围,则必须增加后缀“L”(不区分大小写,建议用

Java中数据类型及其之间的转换

Java中数据类型及其之间的转换 基本的数据类型 基本类型有以下四种: 1)int长度数据类型有:byte(8bits).short(16bits).int(32bits).long(64bits). 2)float长度数据类型有:单精度(32bits float).双精度(64bits double),JAVA中将小数默认为double类型,若要定义float需在数据后面用f声明: 3)boolean类型变量的取值有:ture.false 4)char数据类型有:unicode字符,16位 对

JAVA的数据类型

JAVA的数据类型:基本类型: 四类:整型:byte(1字节) ,short(2字节), int(4字节), long(8字节) (整数类型) 浮点型: float(4字节)  ,double(8字节) (小数类型) 字符型: char(2字节) 布尔型: boolean(不确定) 引用类型: 类:class 接口:interface

深入理解Java之数据类型

一.概述 我们通过编程解决一个具体问题时,首先要做的工作是用各种“数据结构”表示问题中的实体对象,而后才能着手研究描述具体业务逻辑的算法.这也正印证了”程序 = 数据结构 + 算法“.而这里的数据结构,便对应着各种数据类型. 数据类型指的是一组值以及相关的一组操作.Java中有两大类数据类型:一类是原始(primitive)数据类型,包括boolean.int.double等等:还有一类是引用类型,也就是类(class),包括Java类库提供给我们的类和我们自己使用关键字class定义的类.Ja

Java基本数据类型与位运算

Java基本数据类型与位运算 >>赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明确的,已命名的变量.也就是说,必须有一个物理空间可以存储等号右边的值.分类 基本数据类型 与 类数据类型 的不同1. 对基本数据类型的赋值是很简单的.基本数据存储了实际的数值,而并非指向一个对象的引用,所以在为其赋值的时候,是直接将一个地方的内容复制到了另一个地方.2. 但是在为