数据类型以及面试讲解
数据类型
强数据类型
要求变量的使用要严格符合规定,所有变量都必须先定义之后才能使用
优点:安全性高 缺点:速度慢
弱类型语言
可以不符合规定,不出事就可以
Java的数据类型分为两大类
-
基本类型(primitive type)
-
引用类型(reference type)
基本数据类型:数值类型、Boolean类型。
数值类型:整数类型、浮点类型、字符类型。
整数类型:
byte占1个字节范围:-128~127
short占2个字节范围:-32768~32767
int占4个字节范围:-2147473648~2147483647
long占8个字节范围:-9223372036854775808~9223372036854775807
浮点类型:
float占4个字节
double占8个字节
字符类型:char占2个字节
类型 说明符 | 比特数(字节数) | 有效数字 | 数的范围 |
---|---|---|---|
float | 32(4) | 6~7 | 10-37~1038 |
double | 64(8) | 15~16 | 10-307~10308 |
long double | 128(16) | 18~19 | 10-4931~104932 |
Boolean类型:boolean占1位,其值只有true和false两个
位表示:计算机 内部数据 储存的最小单位
字节:计算机 数据处理 的基本单位,习惯上用B表示
1字节(byte) = 8位(bit)
引用数据类型:类、接口、数组
数据类型扩展
整数扩展
每个进制的表示方式都不同(开头):二进制0b、十进制、八进制0、十六进制0x
例如:
int i = 10;
int i2 = 010; //八进制0开头
int i3 = 0x10; //十六进制0x开头 0~9 A~F F就是16
System.out.println(i);
System.out.println(i2);
System.out.println(i3);
//输出结果是
//10
//8
//16
浮点数扩展
float字长是有限、离散、结果舍入误差、一个大约值,所以它接近但不等于
变量类型不同,float是单精度型浮点数据,double是双精度型浮点数据;在内存中所占用的空间不一样,float占用4个字节(32位)内存空间,可以提供7位有效数字;double占用8个字节(64位)内存空间,可以提供16位有效数字。
因此,少去用浮点数进行比较,如果需要比较或者计算,就是用java写好的类BigDecimal 最好完全避免使用浮点数进行比较
//BigDecimal 数学工具类
//float 有限 离散 舍入误差 大约 接近但不等于
//double
float f = 0.1f; //0.1
double d = 1.0/10; //0.1
System.out.println(f==d); //false ==表示是否等于
System.out.println(f);
System.out.println(d);
float d1 = 2333312433333333333f;
float d2 = d1 + 1;
System.out.println(d1==d2); //true
//输出结果是
//false 注:虽然两个数都是0.1,但是在这里f不等于d
//0.1
//0.1
//true
字符扩展
强制转换可以将字符转换为数字
所有的字符本质还是数字
编码 Unicode表:(97 = a 65 = A) 2字节 0-65536 Excel 2的16次方 = 65536
从U000开始表示,一直到UFFFF
char c1 = 'A';
char c2 = '中';
System.out.println(c1);
System.out.println((int)c1); //强制转换
System.out.println(c2);
System.out.println((int)c2); //强制转换
//强制转换可以将字符转换为数字
//所有的字符本质还是数字
//编码 Unicode表:(97 = a 65 = A) 2字节 0-65536
//Excel 2的16次方 = 65536
//从U000开始表示,一直到UFFFF
char c3 = '\u0061'; // \u表示给它转义
System.out.println(c3); //a
//输出结果:
//A
//65
//中
//20013
//a
转义字符
\t 表示 制表符
\n表示 换行符
布尔值扩展
flag==true 与 flag 的功能一样,最好使用 flag ,这样写的代码简洁易读。
boolean flag = true;
if(flag==true){ } //新手
if (flag){ } //老手 简化代码功能跟上一行一样
//Less is More! 代码要精简易读
String不能使用==比较的原因
对象要从内存上分析
String sa = new String("hello world");
String sb = new String("hello world");
System.out.println(sa==sb);
String sc = "hello world";
String sd = "hello world";
System.out.println(sc==sd);
//对象 从内存分析
//输出结果
//false
//true
String既可以作为一个对象来使用,又可以作为一个基本类型来使用。这里指的作为一个基本类型
来使用只是指使用方法上的,比如String s = "Hello",它的使用方法如同基本类型int一样,比如
int i = 1;,而作为一个对象来使用,则是指通过new关键字来创建一个新对象,比如String s =
new String("Hello")。但是它的内部动作其实还是创建了一个对象。
Java里对象之间的比较有两种概念,这里拿String对象来说:一种是用 "==" 来比较,这种比较
是针对两个String类型的变量的引用,也就是说如果两个String类型的变量,它们所引用同一个
String对象(即指向同一块内存堆),则 "==" 比较的结果是true。另一种是用Object对象的
equals()方法来比较,String对象继承自Object,并且对equals()方法进行了重写。两个String对
象通过equals()方法来进行比较时,其实就是对String对象所封装的字符串内容进行比较,也就是说
如果两个String对象所封装的字符串内容相同(包括大小写相同),则equals()方法将返回true。