Java 常用基础知识总结
Java 数据类型
基本数据类型 / 8:
基本类型 | 包装类 | size |
---|---|---|
boolean | Boolean | 4字节,编译器使用 int 类型代替 |
byte | Byte | 1字节,有符号 |
char | Character | 2字节,无符号,可表示 Unicode 字符 |
short | Short | 2字节 |
int | Integer | 4字节 |
long | Long | 8字节 |
float | Float | 4字节 |
double | Double | 8字节 |
引用数据类型 / 2:
-
Array
-
对象:常用对象类型,String
高精度数字 / 2:
- BigInteger
- BigDecimal
Java 四个访问控制符
修饰符 | 类内部 | 本包 | 子类 | 外部包 |
---|---|---|---|---|
public | 可 | 可 | 可 | 可 |
protected | 可 | 可 | 可 | 不可 |
default | 可 | 可 | 不可 | 不可 |
private | 可 | 不可 | 不可 | 不可 |
总结:
仅对本类可见:private;
对所有类可见:public;
对本包和所有子类可见:protected;
对本包可见:默认即不加修饰符;
Java 关键字
JAVA常见关键字 - 燕林夕 - 博客园 (cnblogs.com)
static
:
1、 表示静态的、全局的,独立于对象存在,可以使用类名直接调用;
2、不能修饰局部变量。
final
:
1、修饰的类无法被继承;
2、修饰的方法不能被子类重写;
3、修饰的属性就是常量,要么立即赋值,要么在构造函数中赋值;
4、修饰的局部变量,要么立即赋值,要么随后进行赋值;
5、修饰参数,不能在方法中更改参数引用所指向的对象。
instanceof
,左边的对象是否是右边类的实例,返回 boolean 类型;
synchronized
,一个时间内只有一个线程可以执行该关键字修饰的代码块;
volatile
,易失性,使用该关键字保证变量的可见性;一个被 volatile 修饰的变量,值被修改时会立即更新到主存,其它线程读取值时会去内存中重新读取;
位运算
<<
,逻辑/算术左移 ;>>
,算术右移;>>>
,逻辑右移。
类的初始化顺序
父类(静态成员 + 静态代码块 [按照代码的书写顺序])⇒ 子类(静态成员 + 静态代码块 [按照代码的书写顺序])⇒ 父类(普通成员 + 代码块 [按照代码的书写顺序])⇒ 父类构造方法 ⇒ 子类(普通成员 + 代码块 [按照代码的书写顺序])⇒ 子类构造函数
静态成员和静态代码块在使用到类的静态属性或者方法时才会被调用;
只声明一个引用时不会被调用;
使用 class 获取类对象时也不会被调用;
Java 重载和重写
重载 Overload
:
方法名相同,参数类型、顺序、个数不同;仅仅靠返回值不同不算重载;
重写 Override
:
方法签名相同,重新实现这个方法;
Java 没有 Overwrite 的说法;
Java equals 与 ==
java 基本数据类型没有 equals 方法,只能用 == 来判断值是否相等;
java 对象有 equals 方法,使用 == 判断两个对象是否一样(即内存地址是否相同);
使用 equals 判断对象内容是否一样(内存地址可以不一样),但这个具体要看 equals 方法的实现;
举例来说:
StringBuilder 和 StringBuffer 没有重写equals 方法,源码仍然使用 == ;
String 重写了该方法,判断字符内容。
关于 equals 方法的覆盖:
1、要遵守通用约定;
2、覆盖 equals 时总要覆盖 hashCode;
Java 多态 与 泛型
多态算是一种泛化机制,将方法的参数类型设置为基类,那个该方法就可以接受基类的任何导出类;
多态:程序定义的引用变量类型由其指向的具体实例确定;运行时确定(父类引用指向子类对象,调用的方法执行子类的动作)
泛型:参数化类型,原本程序的参数类型都是具体的,现在将参数类型也定义为参数,在调用时才传入具体的类型;
Java 接口和抽象类的区别
- 一个类可以实现多个接口,但只能继承最多一个抽象类;
- 接口没有具体方法实现,但抽象类可以包含具体的方法实现;
- 接口没有字段,只能创建static final 常量,抽象类可以声明和使用字段;
- 接口中的方法都是public,抽象类中可以public、protected、private、默认;
注意 接口本身不声明为 public 的话,只能在本包中被访问; - 接口没有构造函数,抽象类有构造函数。
容器
Collection
List:
ArrayList:善于随机访问,中间插入和删除较慢;
LinkedList:较低代价实现插入和删除,提供了优化的顺序访问;
另外 LinkedList 常用作为 stack / queue / deque 的具体实现类;
Set:
HashSet: 最快的获取元素的方式;
TreeSet: 按照比较结果升序保存对象;
LinkedHashSet: 按照被添加的顺序保存对象;
Stack:
LinkedList
Queue:
ArrayDeque
LinkedList
PriorityQueue: 自己定义的类需要自己实现一个 comparator;
Map
HashMap: 最快的查找技术;
TreeMap: 按照比较结果的升序保存键;
LinkedHashMap: 按照插入顺序保存键;
超有用的容器的静态方法
Collections.shuffle(list<T>);
Collections.addAll(list<T>, E... ele);
Collections.max(Collection, Comparator<T>);
Collections.min(Collection, Comparator<T>);
Collections.reverseOrder(Comparator<T>);
Collections.sort(List<T>, Comparator<T>);
Collections.swap(List, int i, int j);
Collections.binarySearch(List, key);
Arrays.asList(E... ele);
Arrays.sort();
Arrays.binarySearch();
异常
Throwable
Error:用来表示编译时和系统错误,一般不用关心;
Exception:可以被抛出的基本类型异常,关心点;
RuntimeException:编程错误,会自动被 JVM 抛出,所以也不用关心;
throws 异常在继承中只能缩小而不能添加;
Java 触发类加载的 4 种情况
- 遇到 new、getstatic、putstatic 或 invokestatic 这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。
生成这4条指令最常见的Java代码场景是:
使用new关键字实例化对象时;
读取或者设置一个类的静态字段(被final修饰、已在编译器把结果放入常量池的静态字段除外)时;
以及调用一个类的静态方法的时候; - 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化;
- 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要触发父类的初始化;
- 当虚拟机启动时,用户需要指定一个执行的主类(包含main()方法的类),虚拟机会先初始化这个类。