4-12面试
2021-04-12 22:08:10 1 举报
AI智能生成
4-12面试
作者其他创作
大纲/内容
Mysql
InnoDB
事务
定义:对数据库的一列操作,要么全部执行,要么全部失败,这一系列操作就是事务
特性
原子性
子主题
一致性
隔离性
持久性
锁
索引
Java基础
语法基础
数据类型
基本数据类型
引用数据类型
类类型
接口类型
数组类型
比较两个对象
方法一:实现Comparable接口,实现compareTo方法
方法二:实现Comparator接口,实现compare方法
设计模式
代理模式
概念:一个对象要执行某个方法,不是自己执行,而是通过代理类的对象执行
优点:做到了不改变代码的前提下为这个委托类的方法添加新的功能,也就是切面编程
静态代理
概念:在程序运行前就已经确定了代理类和被代理类的管理
举例:一个Persion接口有一个上交班费的方法,然后有两个实现类,分别是Student类和代理类,Student类实现了上交班费的方法,代理类也实现了这个方法,但是在代理类的上交班费的方法中,实际上调用了Student对象的上交班费的方法,这样就可以用代理类对象去执行Student类的上交班费的方法,不需要Student类的对象自己执行。
动态代理
概念:在程序运行时动态确定代理类和被代理类的关系,这里依靠反射
优点:相对与静态代理,不需要为每个需要被代理的方法都去写代理方法,如果这些需要被代理的方法需要增加的功能都一样,就可以统一添加,不需要挨个添加
单例模式
概念:一个类在程序执行期间,在内存中只存在一个对象
优点:避免了反复创建对象,减少了系统开销,提高资源利用率
饿汉式:类加载的时候就已经创建好对象,不需要等待方法调用才创建。属于线程安全
懒汉式:只有在第一次方法调用时才会创建对象。线程不安全,在多线程环境下,有可能两个线程都是第一次调用方法,然后创建了两个对象
锁住整个getInstance方法
双重校验:两次判断对象是否存在
静态内部类:再静态内部类中创建被声明为final的对象
工厂模式
概念:使用一个工厂类,可以得到一个接口的多个实现类对象,不需要直接用实现类来创建
优点:使用一个工厂,可以得到一个接口的实现类对象,降低了接口和实现类之间的耦合度,只需要调用工厂中对应的方法,就可以获得对应的实现类
举例子:餐厅是一个接口,有3个实现类,鸡鸭鱼,如果不用工厂模式的化,就是鸡鸭鱼3个实现类独自去new对象,使用了工厂模式之后,只需要在工厂类中添加相应的方法返回对应的对象就可以做到使用一个工厂生成多种实现类
反射机制
作用:提供一种更为灵活的对象创建的方式,是框架的灵魂
原理:class文件加载到内存之后,生成一个Class对象,用这个Class对象创建出原来的Java对象,这个过程就是反射
反射的用途:反射机制+IO流可以实现用配置文件创建对象,不需要重新编译项目
反射的用法
首先要做的是得到类的Class对象,得到Class对象之后可以做很多事情
3种方式得到Class对象
Class.forName();
getClass();
Object.class;
首先要做的是得到类的Class对象,得到Class对象之后可以做很多事情
3种方式得到Class对象
Class.forName();
getClass();
Object.class;
创建实例
得到方法对象
得到字段对象
得到构造器对象
集合
Collection
List
1.特点:有序可重复
有序指的是遍历的顺序和插入的顺序一样,
可重复指的是可以存放两个相同的对象
有序指的是遍历的顺序和插入的顺序一样,
可重复指的是可以存放两个相同的对象
实现类
1.ArrayList
1.底层数据结构是数组
2.线程不安全
3.动态扩容
初始容量是10,当容量不够时将长度增长到原来的1.5倍
默认初始
初始容量是10,当容量不够时将长度增长到原来的1.5倍
默认初始
2.LinkedList
和ArrayList一样,区别在于LinkedList底层数据结构是双向链表,不需要进行扩容
和ArrayList一样,区别在于LinkedList底层数据结构是双向链表,不需要进行扩容
3.vector方法
和ArrayList一样,区别在于Vector是线程安全
和ArrayList一样,区别在于Vector是线程安全
Set
特点:无序不可重复
实现类
1.HashSet
底层是HashMap,new一个HashSet,会在底层new一个HashMap
然后将值放在HashMap的key位置
底层是HashMap,new一个HashSet,会在底层new一个HashMap
然后将值放在HashMap的key位置
2.TreeSet
与HashSet不同的是,TreeSet是可排序的,在插入对象时进行排序
与HashSet不同的是,TreeSet是可排序的,在插入对象时进行排序
Map
实现类
HashMap
1.底层的数据结构:数组+链表+红黑树
2.HashMap与HashTable的区别
HashMap是非线程安全的,HashTable是线程安全的,所以HashMap的速度比HashTable快
HashMap的key可以是null,HashTable则不行
HashMap是非线程安全的,HashTable是线程安全的,所以HashMap的速度比HashTable快
HashMap的key可以是null,HashTable则不行
3.hashcode冲突时怎么办
冲突的话就会把新添加的对象放到同一个链表的后面
冲突的话就会把新添加的对象放到同一个链表的后面
ConcurrentHashMap
多线程
并发编程
原子性:多个操作要么全部成功,要么全部失败
可见性:一个线程对数据的修改,其他线程可以立马看到
有序性:一个线程内部的所有操作的执行顺序,和代码顺序一致
线程的生命周期
new初始状态
当线程被创建,还没有调用start方法时,处于此状态
当线程被创建,还没有调用start方法时,处于此状态
ready就绪状态-runnable中的ready状态
就绪状态是线程所有资源都得到之后,等待CPU时间片
就绪状态是线程所有资源都得到之后,等待CPU时间片
running运行状态-runnable中的running状态
就绪状态的线程得到cpu时间片后的执行状态
就绪状态的线程得到cpu时间片后的执行状态
blocked阻塞状态
线程因为某种原因放弃CPU时间片,进入阻塞状态
线程因为某种原因放弃CPU时间片,进入阻塞状态
等待阻塞:
当某个对象调用wait方法时,作用在这个对象上的当前线程都会被阻塞,并且释放锁
只有当这个对象调用notify唤醒这个线程时,这个线程才会进入锁池种抢占锁
当某个对象调用wait方法时,作用在这个对象上的当前线程都会被阻塞,并且释放锁
只有当这个对象调用notify唤醒这个线程时,这个线程才会进入锁池种抢占锁
同步阻塞:线程在运行的过程中,锁被其他线程抢占,则会放弃CPU时间片,进入锁池中
其他阻塞:例如线程调用sleep、yield方法,会放弃CPU时间片,但不会放弃锁
IO阻塞是也会释放CPU时间片,同时释放锁
IO阻塞是也会释放CPU时间片,同时释放锁
waiting等待状态的线程,必须等到被唤醒之后才能获取时间片,如果一致不被唤醒,会无限期等待
time_waiting超时等待,处于这个状态的线程,如果长时间没有被唤醒,会自动唤醒
terminated终止状态,当线程的run方法执行结束或者main函数执行结束,线程也就终止
线程池
关键字
synchronized
修饰类,静态方法是类锁
修饰成员方法、非静态代码块时,是对象锁
Lock与synchronized的区别
synchronized是Java关键字,修饰方法、类、代码块
synchronized生成的锁自动释放,线程得不到锁会一直等待、是可重入、不可中断、非公平锁
synchronized生成的锁自动释放,线程得不到锁会一直等待、是可重入、不可中断、非公平锁
Lock是一个接口,需要程序员手动释放锁,线程得不到锁不会一直等待,可重入,可中断,可公平也可不公平
volatile
修饰变量
指令重排的概念
指令重排是值编译器编译优化时,对不存在数据依赖的指令进行重新排序
保证可见性:当线程对volatile修饰的对象进行写操作时,JMM会强行将线程栈中的数据刷新到主内存中
保证有序性:volatile修饰的变量不能够进行指令重排
锁
对象锁:一个对象一把锁
类锁:所有对象一把锁
CAS:比较替换
内存地址值、旧的预期值、要修改的值
线程1要对一个变量进行一个读写操作,首先从内存中读出值,假设是A,然后线程1进行了一系列的操作之后得到了结果B,想要将B写到变量中,但是呢由于线程1在执行操作的过程时间太长,变量的值已经被线程2修改成了C,此时线程1看到变量的值不是A,也就不能将B写进变量中
JVM
类加载系统
双亲委派机制
概念:当一个类加载器收到加载请求时,把请求传给父类加载器,父类加载器加载不到才由子类加载器加载
优点
避免类的重复加载
安全:用户自定义的类和jdk自带的类相同时,加载的是jdk自带的类
作用:将编译器生成的class文件加载到内存中
类加载的过程
第一阶段:加载指的是将class文件加载到内存中,并为这个文件创建一个Class对象
第二阶段:链接
验证:保证class文件中的内容符合JVM的语法要求
准备:在方法区中为类变量分配空间
解析
第三阶段:初始化:初始化是对变量的赋值
类加载时机:
new一个对象
访问静态成员
反射
一个类的子类,导致父类加载
虚拟机启动时,即main方法执行时会加载main方法所在的类
运行时数据区
方法区
存放静态变量
堆
虚拟机栈
本地方法栈
程序计数器
Java内存模型JMM
作用:定义了Java虚拟机在计算机内存中的工作方式
Java线程通信采用共享内存的方式
线程共享的数据存储在主内存中,每个线程保存一个副本
每个线程都有自己的线程栈
执行引擎系统
本地接口JNI
0 条评论
下一页