Java知识思维导图
一、数据类型
int 在Java中属于基本数据类型
1.基本数据类型
1. int类型
长度:4字节,32位
2.byte类型
长度:1字节,8位
3.short类型
长度:2字节,16位
4.long类型
长度:8字节,64位
5.float类型
长度:8字节,64位
6.double类型
长度:8字节,64位
7.char类型
长度:2字节,16位
8.boolean类型
长度:1字节,8位或者4字节,32位
2. 类型转换
1.自动类型转换
2.强制类型转换
3.具有继承关系的类之间的自动类型转换与强制类型转换
3.包装器
1.装箱
2.拆箱
3.128陷阱
这个问题源于自动装箱时的,Integer.valueOf()函数的源码,详情可以看我之前写的博客
4.基本数据类型与包装类之间的对应关系
4.易忘的操作符
1.“=”赋值运算符
Student student = new Student();
理解:
1.新建一个Student类型对象,将其赋值给student;
2.声明student变量将其指向新建的Student对象
2.按位操作符
3.三元运算符
语法:布尔表达式?value0,value1
若表达式为真,返回value0
若表达式为假,返回value1
public static void main(String[] args){
System.out.println(1 == 2 ? "我是对的" : "你是对的");
}
输出结果为 我是对的
4.与,或,异或
- & 与运算: 遇 0 则为 0, 全1 则为 1
- | 或运算: 遇 1 则为 1, 全 0 则为 0
- ^ 异或运算: 相异为1
5.引用数据类型
1.不可变类型
1. String
一旦对字符串操作,就会产生一个新的String对象
- Java为什么使用不可变字符
- 好处:可以共享
Java如何保证String的不可变?
- final修饰String类,保证String类无法被继承
- final修饰Char数组,保证该数组的地址无法被修改,该数组一旦被赋值就无法改变
- String类中没有任何一个修改Char数组的方法,保证String类中的Char数组无法被修改
2.提升字符串拼接效率的两个类
1.StringBuffer
- 保证线程安全
- 原因:方法加了锁(synchronized)
- 2.StringBuilder
- 不能保证线程安全
- 2.StringBuilder
- 原因:方法加了锁(synchronized)
2.可变类型
我们创建的大部分类
6.Object(Java所有类的基类)
equals()和“==”的区别
1.基本类型只有“==”
- 2.对象使用equals()
- 若未重写equals方法,则会调用Object的equals方法也就是“==”
- 若重写了equals方法,就会按照重写的规则进行比较
- 若想把某个类的对象作为hashmap的key需要注意什么
- 为什么在重写equals方法时要重写hashcode方法
- 什么情况下要重写hashcode方法
- 1.equals()对象的作用,是确定两个对象是否相等
- 2.在HashMap和HashSet中对象的位置,是通过HashCode值确定的,所以两个对象如果相同的话他们应该出现在HashMap和HashSet的相同位置,而如果不重写HashCode,则不能保证其出现的位置相同,导致逻辑上出现矛盾,也就不能证明两个对象是相等的,所以需要重写HashCode方法
二、关键字
1.final关键字
修饰类 | 该类无法被继承 |
修饰方法 | 该方法无法被重写 |
修饰域(代码块) | 这个域无法被赋值 |
2.static
static(静态的),被static修饰的归类(class)所有 ,
所有的该类创建的对象,共享着一份数据(静态方法,静态变量,静态代码块)
静态方法通过 类名.方法()的形式来调用
3.访问权限修饰符
修饰类 | 修饰方法 | 修饰域 | |
public | 公共类 | ||
private | 私有类,常见于内部类 | 该方法只能在本类中使用,不会在其他类中访问 | 该方法只能在本类中使用,不会在其他类中访问 |
protected | 子类可以访问,继承,同包下的类可以访问 | 子类可以访问,继承,同包下的类可以访问 | |
default | 只有同包的可以访问 | 只有同包的可以访问 |
若子类和父类不在同一个包中,子类可访问父类的protected成员,不能访问父类对象的
三、面向对象
1.封装
最简单的可以体现在:get(),set()方法,用来访问私有变量
可以用来隔离非法数据
2.继承
父类的public都被子类继承,private不会被继承
好处
提高了代码的复用性,和维护性
弊端
继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类也不得不跟着变化,削弱了子类的独立性
3.多态
多态是指当父类引用引用的对象不一样的时候表现出的行为是不一样的
例子:
接口和各个实现类
抽象类和各个子类
List a = new ArrayList()
List a = new LinkList()
void method(List A);
调用的时候可以是
method(ArrayList A);或者是method(LinkList A);
这里与动态绑定相关,因为虽然形参类型为List,不过只有到真正调用运行程序的时候才能真正知道,具体的是LinkList类型,还是ArrayList类型
多态的条件
- 必须在继承体系下
- 子类必须要对父类中的方法进行重写
- 通过父类的引用指向子类对象,调用重写的方法
四、main方法
是java程序的唯一入口
五、输入输出
六、抽象类和接口
1.联系和区别
2.abstract关键字
3.现在接口里面也可以有默认方法了,default修饰
七、反射
获得一个类
所有的构造函数
所有的域
所有成员变量
所有的方法
对于方法可以执行
对于变量可以赋值
暴力反射
在各个框架中的应用
八、代理
静态代理
动态代理
jdk动态代理
cglib动态代理
在各个框架中的应用,主要是在aop中,mybatis(使用xml,中的sql语句调用数据库)中
九、异常体系
1.Error
例如内存溢出
2.Exception
1.RutimeException
空指针:例如Service上没加注解 dao上没加@Autowired
运行时异常的解决方案:先判断,再使用,所有的runtimeException都是,可以通过代码来处理的,所以在代码运行中,一旦遇到了runtimeException,那么肯定是我们的程序考虑不到位
例如:判断除数是否为零,对于数组大小为10的数组下标是否越界
2.IOException
例如:读取、写入时某个文件不存在,这种异常取决于环境,不是我们通关简单的提前判断就可以解决的,举个例子,假如在你判断文件是否存在的时候文件是存在的,可是下一瞬间,你或者其他人将文件删除了,那么提前判断自然就没用了
所以对于IoException我们要使用try-catch给它包起来,或者通过throws关键字把异常抛出去
3.通过继承产生的自定义异常类
十、泛型
java中的泛型是假的,落实到我们的类之后,就会变成Object数组
但是泛型具有编程上的意义,它可以决定我们允许哪些类型进来,有一个强制的限定但是你是无法获得T、E类型的class,只能借助传递进来的变量.getclass()
十一、集合
1.List
1.ArrayList()底层是数组实现
2.LinkList()底层是链表实现
2.Set
存的是不重复的元素的集合
TreeSet
HashSet
3.Map
HashMap
TreeMap
LinkedHashmap
借助LinkedHashmap实现LRU(最近最少使用)
4.线程安全的相关集合