第一次外包面试

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(全路径名)  包名+类名,常用这个

原文地址:https://www.cnblogs.com/benbenzoule/p/13819868.html