Java 基本数据类型+引用数据类型详解

一.数据类型

java是强类型语言,指的是一旦一个常量或变量声明出来,它的类型就确定了,以后都不会变成其它类型,声明的时候是整型,以后都是整型
(ps:javascript是弱类型)
var i =10;s
i = "hello";
var d =new Date();

int i =10;
i ="hello";//XXXXXX


java的数据类型包括哪些呢?
int a = 6;
Scanner input = new Scanner(System.in);


基本数据类型只有8个:byte、short、int、long、float、double、char、boolean

注意: String不是基本数据类型!!!是引用类型
引用数据类型有无限个

二.数学进制

(1)十进制

日常生活中使用的进制都是十进制,因为古人数数只能用10个手指头,满10进1
基数有10个,0到9,满10进1

7332 = 7 * 10(3) + 3*10(2) + 3*10(1) + 2*10(0)

(2)二进制

1 二进制是谁发明?如何发明的
18世纪德国数理哲学大师莱布尼兹发现
部分灵感来源于中国古代哲学,如易经
二进制转成10进制
11111 = 1*2(0) + 1*2(1) + 1*2(2) + 1*2(3) + 1*2(4) = 1 +2 + 4 + 8+ 16 = 21
0001 = 1
0010 = 2
1010 = a 10
1011 = b 11
1100 = c 12
1101 = d 13
1110 = e 14
1110 = f 15

2 二进制表示
基数:只有1和0,逢二进一

3 二进制加法
   1011 0001
+ 0110 1001
 ---------------
1 0001 1010


十进制和二进制转换: 用短除法
89 = 》1011001
89 = 64+16+8+1 = 1011001

100 0101 =》 69
----------------------------
78 = 》64 + 8 4+2 = 0100 1110

0101 1001 = 》64 +16 + 8+1 = 》89

(3)八进制

基数:0,1,2,3,4,5,6,7
逢八进1
343721
8 = 2(3) = 》一个八进数 == 3个二进制数
二进制和八进制转换
1 101 = > 1*2(4-1) + 1*2(3-1) + 0 + 1 => 13(十进制) => 15(八进制)

24(八进制) = 》10 100(二进制)
---------------------------------

01 110 101 = 》165(八进制)
3721 = 011 111 010 001

(4)十六进制

十六制
0 1 2 3 4 5 6 7 8 9 A B C D E F

16 = 2(4)
一个十六制的数 等于 四个二进制的数

---------------------------------
FF = 1111 1111
C83D = 1100 1000 0011 1101

三.整数型

(1)byte

byte称之为一个字节,一个字节等于二进制的8位。
-128 ~ 127
-2(7)~ 2(7)-1

 


在计算机中,任何数据都是以二进制存储的,对于整型来说,正数存的是它的二进制原码,负数存储的是它的绝对值的二进制补码

负数的补码 = 先绝对值,再取反 再加1
例1:


-128
绝对值
128
二进制
1000 0000
取反:
0111 1111
加1
1000 0000(补码)



例2:


-9
绝对值
9
二进制
0000 1001
取反
1111 0110
加1
1111 0111


例3:

 


34 = 32+2 = 0010 0010

-34 = 1101 1110

-69=1011 1011

 

(2)short

short 短整型
short 16位的整型
范围:-2(15) ~ 2(15)-1
范围 -32768 ~ 32767
----------------------

0111 1111 1111 1111
1000 0000 0000 0000

(3)int

1 范围大小
int - 整型 32位
int age = 12;
int count=0;

范围:-2(31) ~ 2(31)-1

2 默认类型
平常见到整型常量,它默认都是int类型
System.out.println(100);
a = b+3;

3 整型的在代码中的表示方式
查询帮助文档把8进制或16进制以对应的进制输出。


1)int i = 89;
2) int i = 034;//打头的0表示这个数是一个八进制数
int b = 034;
System.out.println(Integer.toOctalString(b));
3)int i = 0xC4F;//0x 表示这个数是一个十六进制数
4)int i = 101011101;//是十进制,非二进制


4 获取int 最大值和最小值
Integer.MAX_VALUE;
Integer.MIN_VALUE;

 (4)long

1 范围

long - 长整型 64位
-2(63) ~ 2(63)-1

2 时间的毫秒数经常long表示
当前时间距离1970-1-1 0:0:0点的毫秒数
System.currentTimeMillis()

3 长整型的常量如何表示
我们要表示一个长整型,需要在数值的后面加上L
128 //int整型
128L //长整型
128l;//不要写l,看起来像1

 

 四.浮点型

(1)float

1 范围
float - 单精度浮点,32位
但是虽然是32位,但存储方式跟整型完全不同

 


2 float表示法
必须在数值后面加F
float f = 2.89F;

(2)double

1 范围
双精度浮点 64位
表示的范围要比long类型(也是64)要大,主要是跟它的存储的方式

 


2 double的表示
1)默认情况下,所有的小数常量都是double
double d = 7.89;
System.out.println(3.14);
2) 明确表示,在数值后面加上D
double d = 7.89D;

3 科学计数法
3617859.212343 = 》3.617859212343E6
double d = 3.617859212343E6;

4 float和double精确性
有一些数是不能精确表示
2.0-1.1 = 0.9;//可是不是
结论是,尽量避免比较2个浮点数是否相等!!!!!
System.out.println(2.0-1.1==0.9);
如果真的要得到一个精确的表示,或者要比较2个小数的大小,怎么办??请用BigDecimal类
BigDecimal t = new BigDecimal("2.0");//参数以字符串形式表示
BigDecimal y = new BigDecimal("1.1");
BigDecimal r = t.subtract(y);
System.out.println(r);

 

五.字符型

1 char
存储字符的,范围是16位
char也可以当作短整型看,但是char是无符号整型
所以能表示范围是0~65535
换句话,我们的字符最多能表示65536个字符,其中中文占了大概40000多个 0-127 是早期计算机能够键入的128个字符,称作ascii码
内存中只能存二进制的数,所以任何的数据都要转成二进制,字符也不例外。
我们没办法在内存中直接存一个'中',所以会将'中'对应一个整型数值,然后再把这个数值的二进制存进内存
'中'到底对应什么数值?这由各国或者标准组织制定的编码决定。
假设中国的国标码gb2312把'中' ==》23432,然后国际上的utf-8把‘中’==》20013,如果存进内存存的是gb2312,从内存中读出来使用utf-8,这就会导致乱码

 

 

2 char是如何表示
char c = 'A'; //最基本的表示法
char c = 65;//用整型数值表示
char c = '\u0041';//采用16进制的unicode码

 


3 转义
在计算里,很多字符是当中程序的特殊用途,或者有一些字符通过键盘是输入不了的,此时就需要用一些普通字母加上\,结合在一起表示一种特殊的字符
例如回车\r ,换行用\n, 制表符\t

六.布尔型

1 范围
由jvm本身决定,jdk规范标准没有对就boolean值严格规定要由多少位来保存。
官方的jdk,民间的openJDK,IBM JDK对boolean存储位数可能都不一样

2 boolean的取值
要么true,要么false
boolean b1 =true;
boolean b2 = false;
boolean b3 = TRUE;//错误
boolean b4 = FALSE;//错误
boolean b5 = 1;//错误
boolean b6 = 0;//错误

3 布尔值
经常用在条件判断,循环控制
案例:1.过马路
2.领钱

七.字符串型String

1 String 字符串类型,是由0到多个char连在一起组成的一串字符 它是一个引用数据类型

2 String表示
需要用""将一串字符引起

3 定义字符串
String s = "HelloWorld";
String s1 = "";//表示空字符串
String s2 = " ";//表示字符串里面有一个空格
String s3 = "Hello\nWorld";

八.Scanner

1 Scanner
可以动态接收用户输入的数据:
案例:用户名和密码的输入。

扫描器,从jdk1.5提供
用来扫描输入流中的字符串内容

2 构建一个终端扫描器
Scanner scan = new Scanner(System.in);
ps:System.out -- 终端输出流
System.in -- 终端输入流

 


3 使用Scanner
nextInt();//读取一个整型数据
nextBoolean();//读取一个boolean值数据
nextLong();
nextShort();
nextFloat();
nextDouble();
nextByte();

next();//读取一个字符串型 abc
nextLine();//读取一整行字符串 abc def

abc def
hij klm

 

 

九.类型提升和强转

1 什么是类型提升和强转
自动类型转换:小的数据类型可以自动(隐式)提升为大的数据类型,例如int -> long
强制类型转换: 小数据类型的变量存取大数据类型的值,例如 long l=8L; int i=l;此时编译会报错。但是开发者可以用明确指令告诉编译器,所有责任由开发者承担。这就是强转

2 示例
//自动类型转换
//类型要兼容,小变大
int i = 89;
System.out.println(i);
double d = i;//自动转换为double
System.out.println(d);

//强制类型转换
//类型要兼容,大变小,注意精度可能会丢失
double d2 = 90.78d;
System.out.println(d2);
int i2 = (int)d2;//有程序员承担责任后,强行转换为int
System.out.println(i2);
3 自动提升方向

 

 

 

 


原文地址:https://www.cnblogs.com/Transkai/p/10345519.html