数据类型与运算符
1.变量与类型
1.1类型概览
-
short:占2个字节。数据范围-32768~32767
-
int:占4个字节,和操作系统没有直接关系。数据范围:-231~231-1,即-21亿~21亿
-
long:占8个字节。数据范围:-263~263-1
-
double:占8个字节
-
float:占4个字节
注:浮点数在内存中的存储
-
char:Java使用Unicode表示字符,一个字符占2个字节
-
byte:占1个字节。数据范围:-128~127
-
boolean:与int类型不能相互转换
-
String
注:\n、\t
1.2类型转换
Java是强类型编程语言
表示范围更小的类型能隐式转换为范围更大的类型,反之不行,需要强制类型转换。互不相干的类型不能强转
1.3类型提升
不同类型的数据混合运算,范围小的会提升成范围大的。
对于short、byte这种类型,计算时会提升成4个字节的int,再运算。
2.运算符
2.1算数运算符
% 也能对 double求模
2.2关系运算符
2.3逻辑运算符
-
短路求值
&&:若左侧为flase,则不计算右侧表达式
||:若左侧为true,则不计算右侧表达式
-
& | :若两侧操作数为boolean时,表示逻辑运算符,但不支持短路求值
若两侧操作数为整数类型时,表示位运算符
2.4位运算符
按照二进制位运算
2.5移位运算符
- 左移<<:最右补0
- 右移>>:最左补符号位
- 无符号右移>>>:最左补0
2.6三目运算符
方法
方法
重载overload
体现形式:方法名字相同,参数基本类型不同或参数个数不同(两个都不同也行)。(返回值类型不考虑)
注:当方法名和参数相同时, 返回值类型不同时,不构成重载
递归
数组
基本用法
创建
//动态初始化
数据类型[] 数组名 = new 数据类型 [长度] {初始化数据};
//静态初始化
数据类型[] 数组名 = {初始化数据};
数组作为方法的参数、返回值
数组的使用
数组的拷贝:1.System.arrayCopy
2.clone
3.Array.copyOf:深拷贝
二维数组
String
字符串的创建
//法一:直接赋值
String str1 = "Hello World";
//法二:构造方法
String str2 = new String("Hello Bit");
//法三:
char[] arr = {'a','b','c'};
String str3 = new String(arr);
法一中,字符串内容即"Hello World"存在字符串常量池中,只需要存一份。
下次若使用直接赋值的方式声明String对象,先在池中寻找,若存在,则直接应用,否则开辟新的字符串对象并放入池中。
法二的内存布局
每使用一次构造方法都会开辟一块内存空间,可以使用intern() 自动入池。
字符串的比较
==:针对引用类型,比较的是对象的身份
equals:比较字符串的内容
字符串不可变
+=
好处
- 方便实现字符串对象池
- 不可变对象是线程安全的
- 不可变对象方便缓存hash code
字符串改变
- 创建新的字符串
- 反射
StringBuffer和StringBuilder
可以用来修改字符串
StringBuffer采用同步处理,是线程安全的,StringBuilder是线程不安全的
异常
异常的背景
异常的核心是EAFP,先操作,遇到问题才处理。正常流程和错误代码是分开的,更容易理解代码。
异常的用法
1.捕获异常
try{
//有可能出现异常的语句
} catch {
//出现异常后的处理行为
} finally {
//处理善后工作
}
注:1.可使用try回收资源。如在try()内创建Scanner
2.如果finally也存在return语句,会执行finally中的renturn语句
流程:
1.程序执行try中的代码
2.遇到异常,结束try中的代码,查看catch中的异常类型是否匹配,若匹配则进行catch中的代码,否则将异常传递给上一层
3.执行finally中的代码
4.异常层层上传,若传到main中也没有处理,就会有JVM处理,程序异常终止
2.方法体内抛出异常
if(y == 0) {
throw new ArithmeticException("抛出0异常");
}
3.方法头声明异常
public int divide(int x, int y) throws ArithmeticException {
}
4.自定义异常
自定义异常会继承自Exception或者RuntimeException
异常体系
- Throwable派生出两个子类,Error和Exception
- Error指Java运行时内部错误和资源耗尽错误
- Exception是常用的异常类的父类
- Exception派生出许多的异常类,可分为受查异常和非受查异常(RuntimeException),受查异常需要显示处理
泛型
机制
- 增加编译期间的类型检查
- 取消类型转换的使用
使用
ArrayList<Integer> list = new ArratList<>();
总结
泛型是为了解决某些容器、算法等代码的通用性引入,并且在编译期间做检查
泛型利用的是 Object 是所有类的祖先类、且父类引用指向子类对象的特点工作
包装类
装箱:基本类型 -> 包装类
拆箱:包装类 -> 基本类型