第一次外包面试
1,单例设计模式都有几种
单例对象在内存中静态共享区存储
第一种:懒汉模式 线程不安全
第二种:懒汉模式 线程安全 加一个同步锁
第三种:饿汉模式 类装载的时候就实例化
第四种:静态内部类 一个构造方法,一个静态内部类来new一个单例对象,然后公开对外一个方法来获取单例对象
第五种:枚举
第六种:双重校验锁 使用关键词volatile,然后获取的方法加锁,如果未加载,锁住类之后再判断一次,如果还未加载,就进行加载
public class SingletonDemo7 {
private volatile static SingletonDemo7 singletonDemo7;
private SingletonDemo7(){}
public static SingletonDemo7 getSingletonDemo7(){
if (singletonDemo7 == null) {
synchronized (SingletonDemo7.class) {
if (singletonDemo7 == null) {
singletonDemo7 = new SingletonDemo7();
}
}
}
return singletonDemo7;
}
}
2,如何删除百万行的数据
delete每次删除一行,同时将该行的删除操作作为事务记录在日志中以便进行回滚操作 操作后不会减少表和索引所占用的空间 DML data maintain Language
truncate执行速度快,删除是不能恢复的,执行后,表 和索引所占用的空间会恢复到初始大小 但是有外键约束的表不能使用,DDL data define language
3,创建多线程的方法
继承thread类,实现runnable接口,实现callable接口,通过线程池
线程独有的程序计数器,本都方法栈,虚拟机栈,共享的是堆(存放新创建的对象),方法区(存放已被加载的),直接内存
直接调用run方法的话会把run方法当作thread的一个普通方法调用
4,创建线程池的方法
构造方法实现,使用execrtor不允许使用(fixed,single,cached) 本质都是threadpoolexecutor的构造方法(核心线程数,最大线程数,等待时间,时间单位,队列)。使用线程池的话 就是池化思想,可以线程复用,控制最大并发数量,管理线程
5,hashMap,
线程不安全,效率高,支持null键值,初始化16,给定的话扩充到2次方大小,底层数据结构是红黑树
6,HashSet
底层是基于hashMap来实现的,检查重复的时候是hashcode和重写的equals方法来进行判断
7 concurrentHashMap
基于分段锁,后面采用基于cas和同步锁,比较并交换,只要hash不冲突,就不会发生并发,极大的提高了效率
外包面试完了之后有二面
反射:框架设计的灵魂 通过反射,类对我们是完全透明的,想获取任何自己想要的东西
定义:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对应任意一个对象,都能够调用它的任意一个方法和属性,动态获取的信息以及动态调用对象的方法就是Java语言的反射机制,得到class对象后就可以反向获取这个对象的各种信息,jvm会在本地磁盘中找到这个.class对象,然后加载,加载之后,内存中就有jvm自动创建的一个class对象,他是不能被继承的,
类的实例表示Java应用程序中的类和接口,Class对象是加载类的时候由Java虚拟机和通过调用类加载器中的defineClass对象自动构造的,没有公共构造方法
使用:通过Class对象来获取成员变量,构造方法,成员方法
new一个对象.getClass() 有对象了还要反射干什么
任何数据类型.class,需要导入太多的包
Class.forname(全路径名) 包名+类名,常用这个