数据类型&数据类型扩展&数据类型的转换
数据类型
- 强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用(安全性高 ,运行速度慢)
- 弱类型语言:(例如:javascript )不用严格的符合规定,数据类型能够被忽略的语言,一个变量能够赋不同类型的值。
-
基本类型(primitive type)
// 八大基本数据类型 // 整数 int num1 = 10; //最常用 byte num2 = 20; short num3 = 30; long num4 = 30L; //long类型要在数字后面加一个L // 小数:浮点数 float num5 = 30.1F; //float类型要在数字后面加个L double num6 = 3.14; // 字符 char name='A'; // 字符串,String不是关键字,是类 String name2 = "字符"; // 布尔值:是非 boolean flag = true; boolean flag2 = false; -
引用类型(reference type):类,接口,数组
关于字节的科普:
数据类型的扩展
public class Demo01 {
public static void main(String[] args) {
// 整数扩展: 进制 二进制0b 十进制 八进制0 十六进制0x
int i = 0b10;
int i2 = 10;
int i3 = 010;
int i4 = 0x10;
System.out.println(i); //2
System.out.println(i2); //10
System.out.println(i3); //8
System.out.println(i4); //16
// 浮点数扩展 问:银行业务如何表示钱 答:BigDecimal 数学工具类
// float 有舍入误差,接近但不等于
// 最好完全避免使用浮点进行比较
float f = 0.1f; //0.1
double d = 1.0/10; //0.1
System.out.println(f==d); // false
float d1 = 12345671234567f;
float d2 = d1 + 1;
System.out.println(d1==d2); //true
// 字符串扩展
char c1 = 'a';
char c2 = '国';
System.out.println(c1); //A
System.out.println((int)c1); //65 //强制转换
System.out.println(c2); //显示乱码 中文使用的问题
System.out.println((int)c2); // 22269 //强制转换
// 所有的字符本质还是数字
// ASCII码 编码表 例:A=65
// ASCII码 编译会从 U0000-UFFFF 表示(用16进制)
char c3 = '\u0061';
System.out.println(c3); // a 十六进制0061转换为十进制97
System.out.println((int)c3); // 97
// 转义字符
// \t 制表符(中间会有四个空格) \n 换行
// oriqinal 直接在括号里打双引号他会自动出来
String sa = new String("hello world");
String sb = new String("hello world");
System.out.println(sa==sb); //false
String sc = "hello world";
String sd = "hello world";
System.out.println(sc==sd); //true
// 从内存的角度分析 第一组是各自开辟了新的空间(引用类型) 第二组是值类型
// new就是在内存开辟了一个空间,然后这个空间有地址,new了几个就有几块空间,就有几个地址,比较的是地址所以不相等
// 相当于内存地址和内存内容的比较
// ==在基本类型中是比较内容,在引用类型中是比较栈值,而equals可以用来比较内容的,基本类型不能使用equals进行比较。热门面试题
// 布尔值扩展
boolean flag = true;
if(flag==true){}
if (flag){}
// 两种形式表达的意思是一样的
}
}
数据类型的转换
public class Demo02 {
public static void main(String[] args) {
// 对于不理解为什么要转换的原因是因为,在早期内存很珍贵,因此要严格控制所占内存的大小,所以才有byte这样的数据类型,而现在内存已经很大了,所以不需要考虑,这里转换,只是理解不同存储空间
int i = 128;
byte b = (byte)i; //内存溢出 byte最高127
// 强制转换 (类型)变量名 高--低
// 自动转换 低--高
System.out.println(i); //128
System.out.println(b); //-128
/*注意点:
1.不能对布尔值进行转换
2.转换的时候可能存在内存溢出,或者精度问题(若小数转换为证书的话,会直接舍弃,出现精度问题) */
char c = 'a';
int d = c + 1;
System.out.println(d); //98
System.out.println((char) d); //b
// 常见的问题
// 操作比较大的时候,注意溢出问题
// JDK7新特性:数字之间可以用下划线分割
int money = 10_0000_0000;
int years = 10;
int total = money * years; //1410065408 计算的时候溢出了
long total2 = money * years; //money 和 years 类型都是int 默认是int 转换之前就出现问题了
long total3 = money * ((long)years); //解决方法:先把其中一个转换为long
System.out.println(total); //1410065408
System.out.println(total2); //1410065408
System.out.println(total3); //10000000000
}
}
\