1.Java数据类型划分
8大基本数据类型:
数值型:
整型:byte(1字节) 浮点型:float(4字节) 字符型: char:2字节,默认值为'\u0000' 布尔型: 在Java中,0和1不能代表真假 引用数据类型: 数组,类,接口都属于引用数据类型 class关键字声明的全是类 注:所有的数据类型的默认值必须在类中定义变量才可以,局部变量不存在默认值,必须赋值后再使用 在任意方法中不能定义静态变量static,静态变量必须定义在类中 2.常量和变量 常量:一旦定义后无法修改的值称为常量 字面常量:直接写出来的值都称为字面常量 eg:10;//int类型字面量 普通常量: 在Java中定义一个普通常量使用final关键字 final修饰的变量就成为了常量,一旦赋值后无法修改 常量的命名规范:单词使用纯大写字母表示,多个单词之间使用_分隔 Java中的数值型不存在无符号数,所有数值类型默认带符号 变量的具体定义 语法:数据类型 标识符的名称=初始值; 当数据类型的变量保存不下某个数值时,就会发生溢出问题 此时A存储的是整型的最大值,当A+1超出了整形的保存范围,编译器进位后只保存前32位,看到的效果就变成了整型的最小值 当字面量数值超出了整型的范围时,编译报错 关于整型字面量的进制问题 0b开头表示2进制整型字面量 0开头表示8进制整型字面量 0x开头表示16进制整型字面量 长整型变量 声明长整型变量 要表示一个长整型变量需要在整数部分后面加上l或者L(推荐L) byte类型 1字节,[-128,127] 一般byte是网络传输和文件IO流的基本单位,因此当进行网络编程,IO流使用的都是byte类型 总结:一般场景下使用int,int放不下用long,byte常用于网络编程和文件IO流的操作 浮点型变量 1.双精度浮点型 double 8字节 浮点型字面量默认是double类型的 关于小数的精度问题 解决办法 2.float 单精度浮点数,4字节,只看小数点后6位是准确值 声明float类型的字面量,在小数后面加f或者F 字符型 char 2字节 (无论什么语言的字符,无论什么操作系统,统统两字节保存,使用Unicode编码) 布尔类型变量 表示真假,一般搭配分支语句(if)使用 表示真就是true,表示假就是false,不存在01的转换 类型转换 1.隐式提升(小类型->大类型) 1.1赋值 1.2进行数学运算 小类型和大类型共同参与运算,首先要将小类型提升为大类型之后再进行运算 大类型没有参与运算,只是最终存储值而已,参与运算的数值类型不会提升 2.显示提升(大类型->小类型) 两个数据类型有关系才能转换,转换可能报错 强制类型转换可能会导致丢失精度 毫无关系的类型之间不能发生类型转换 int与byte的互相转换 注:CPU在内存中进行数据读写时,默认都是按照4字节来读写数据的,为了硬件上实现方便,byte,short,char这种低于4字节的类型,最终读写参与运算时会提升为int类型再进行计算 byte->int自动提升 将整型字面量赋值给byte类型时,若整型字面量的数值在byte范围之内,可以直接赋值,超出byte保存范围需要强制类型转换 当把一个int变量赋值给byte时,无论这个变量的值在不在byte的保存范围之内,都需要强转 被final修饰的变量,除了值定义后不可更改,存储在计算机内部时,类型也不能转换 char和int的相互转换问题 char->int 按照编码规则自动转换 int->char int 数值必须在char的范围内(2^15)的数字才能有对应的字符对应 String和int的相互转换 int->String 直接“+” Java中任意类型只要和字符对象+,统统都转为字符串类型而后进行字符串的拼接操作 任意类型->String 使用String提供的valueOf方法 String->int 调用Integer.parselnt(str) 前提是这个str字符串变量必须是由纯数字组成的,不能包含其他数据 float和long的互相转换 float转换为二进制,大概是2^128数量级的数字 float->long属于小类型到大类型的隐式提升 运算符 算术运算符:+ - * / % 增量运算符 +=,-=,/=,*=,%=,++,-- 后置++,先取值后++ 前置++,先运算再取值 关系运算符 计算结果为布尔值,要么是true,要么是false ==,<,>,!=,<=,>= 当需要多次进行关系运算符的计算,不能连着写,需要搭配逻辑运算符一起计算 逻辑运算符 参与运算的表达式都必须是布尔表达式,表达的结果都必须是布尔值,不能是其他类型 &&逻辑与 ||逻辑或 !取反 &&:表达式1&&表达式2 只有当表达式1和表达式2都返回true时,最终结果才为true 只要有一个表达式返回false,整个计算结束,直接返回false,剩下的条件就不再判断了(短路操作) ||:表达式1||表达式2 当表达式都为false时,才返回false,只要有一个true,直接返回true(短路操作) 逻辑取反!操作的是布尔表达式,真变为假,假变为真 位运算符 &两个二进制位都为1,返回1 |两个二进制位都为0,返回0 ^两个二进制位不相同返回1,否则返回0(在工程中做查找出现1次的数字) ~取绝对值,加符号,-1 移位运算 >>:右移 <<:左移 >>>:无符号右移 三目运算符 返回值=布尔表达式1?表达式2:表达式3 当布尔表达式值为true时,取值2,否则取3 运算符的优先级:不需要记忆,需要优先计算的加括号
真为true,假为false,默认值为false //int字面量 10为整型字面量 无法修改
int a=10;
//double字面量 10.1为浮点数字面量,无法修改
double b=10.1;
//a和b是变量,可以修改
a=20;
b=20.2;
System.out.println(a);
System.out.println(b);
//c被final修饰,是常量 无法修改
final int c=3;
System.out.println(c);
//变量定义,a就是整型变量
int a=10;
//b就是浮点数变量
double b=10.1;
//c就是字符型变量
char c='a';
//声明和赋值分开
int a;
int A;
double b;
int a;
int A;
a=Integer.MIN_VALUE;
A=Integer.MAX_VALUE;
System.out.println(a-1);
System.out.println(A+1);
int a=10;
int b=010;
int c=0b10;
int d=0x10;
//声明一个长整型变量
long a=10;
//直接写出来的整型字面量都是int型
//声明一个长整型变量,在整数后面加l或L
long b=40000000000L;
double a=10.1;
int b=1;
int c=2;
System.out.println(b/c);//会忽略小数部分
//更换数据类型
double d=1.0;
double e=2.0;
System.out.println(d/e);
double x=1.1;
double y=1.1;
System.out.println(x*y);//可能出现一些错误数据
//解决办法1:double类型只看小数点后12位,float类型只看小数点后6位
//解决办法2:使用JDK提供的BigDecimal类
BigDecimal b1= BigDecimal.valueOf(1.1);
BigDecimal b2=BigDecimal.valueOf(1.1);
System.out.println(b1.add(b2));
System.out.println(b2.subtract(b1));
System.out.println(b1.multiply(b2));
System.out.println(b1.divide(b2));
char c1='a';
char c2='A';
char c3='李';
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
//赋值
int a=10;
long b=100;
long c=a;
//转换前
int d=1;
int e=2;
double f=d/e;
System.out.println(f);
//转换后
int g=1;
double h=2;
double i=g/h;
System.out.println(i);
//丢失精度
double c=1.5;
int d=1;
d=(int)c;
System.out.println(d);
//数据溢出
long e=Integer.MAX_VALUE+1L;
int f;
f=(int)e;
System.out.println(f);
boolean x=true;
int y=1;
//转换会报错
//y=(int)x;
byte i=10;
byte j=2;
int k=i+j;
System.out.println(k);
byte a=125;
byte b=(byte)128;
int c=10;
byte d=(byte)c;
final byte x=10;
final byte y=20;
byte z=x+y;
char a='a';
char b='A';
char c='李';
int num1=a;
int num2=b;
int num3=c;
//字母大小写互相变换
char i='a';
char j=(char)(i-32);
System.out.println(j);
//优化前
String c="计算结果"+a+b;
System.out.println(c);
//优化后
String str1="计算结果"+(a+b);
System.out.println(str1);
//任意类型转换为字符串
String str2=String.valueOf(10);
String str3=String.valueOf(10.1);
String str4=String.valueOf(true);
System.out.println(str2);
System.out.println(str3);
System.out.println(str4);
//将字符串转为int
String str5="12345";
int i=Integer.parseInt(str5);
System.out.println(i+1);
System.out.println(str5+1);
long a=10;
float b=a;
System.out.println(b);
int a=10;
int b=20;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);
System.out.println(b%a);
a+=1;//a=a+1 3
System.out.println(a);
a-=2;//a=a-2 1
System.out.println(a);
a*=3;//a=a*3 3
System.out.println(a);
a/=1;//a=a/1 3
System.out.println(a);
a%=2; //a=a%2 1
System.out.println(a);
System.out.println(a++);//1
System.out.println(++a);//3
int a=10,b=20;
System.out.println(a==b);
System.out.println(a!=b);
System.out.println(ab);
int a=10,b=20;
System.out.println(a==10&&b==20);
System.out.println(a<5&&b>10);
System.out.println(a>5&&a<15);
System.out.println(a<5&&a/0==0);
System.out.println(a==10||b<5);
System.out.println(a>20||b<5);
System.out.println(a<14||b/0==0);
System.out.println(!(a==10));
int a=10,b=20;
System.out.println(a&b);
System.out.println(a|b);
System.out.println(a^b);
System.out.println(~a);
//取两个数的平均值
int i=a+(b-a)>>1;
System.out.println(i);
int max=a>b?a:b;
System.out.println(max);
double c=true?1:2.0;
System.out.println(c);