一 ,单例模式设计
1,饿汉式:直接创建实例化对象,不管你是否需要这个对象都会创建
- 构造器私有化
- 自行创建,并且用静态变量保存
- 向外提供这个这个实例—public
用final进行修饰
public class Singleton1{
public static final Singleton1 INSTANCE = new Singleton1(); 一个静态的常量对象
private Singleton1(){
}
}
枚举写法:表示该类型的对象是有限的几个,我们可以限定为一个,就成了单例
public class Singleton2(){
INSTANCE //常量对象
}
静态代码块式:
不必要掌握
2,懒汉式:延迟创建实例对象
构造器私有化
- 用一个静态变量保存这个唯一的实例
提供一个静态方法,获取这个实例对象
public class Singleton {
private static Singleton instance;
private Singleton(){
}
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton(); //线程不安全,只适用于单线程
}
return instance;
}
静态内部类式:
public class Singleton{
private Singleton(){
}
private static class Inner{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return Inner.INSTANCE
}
}
二,类的初始化和实例化
哪些方法不能被重写:
final
- 静态方法
- private等子类中不可见的方法
程序执行顺序:
- 由上而下先执行父类的静态(方法/代码块)
- 由上而下执行子类的静态(方法/代码块)
- 实例化父类的构造器—super() 执行父类的构造器
- 由上而下子类的非静态(变量/代码块)
- 子类的无参构造
三,方法参数的传递机制
- 形参是基本数据类型
- 传递数据值
- 实参是引用数据类型
- 传递地址值
- 特殊的类型:String、包装类等对象不可变性
四,递归与迭代器
编程题
递归:
迭代:没搞懂
五,成员变量与局部变量
六,spring bean的作用域
七,mybatis中实体类属性名和表中字段名不一致解决方法
3种方法:
- mapper文件中写SQL语句时起别名
- mybatis-config.xml中开启驼峰命名规则
- 自定义高级映射
八,JVM垃圾回收机制
JVM垃圾回收机制,GC发生在JVM哪部分,有几种Gc,它们的算法是什么?
九,算法
冒泡排序
int arr [ ] = { 1,5,4,6,2}
int temp = 0;
for(int i=0;i<arr.length-1;i++){//五个数据比较4次(length-1)
if(arr [j]>arr[j+1]){//如果arr[j]>arr[j+1],则arr[j]和arr[j+1]交换位置
temp = arr[j];
arr[j] =arr[j+1];
arr[j+1]=temp;
}
for(int i=0;i<arr.length;i++){
sout(arr[i]);
}
十,接口和抽象类的区别
接口都是抽象方法,抽象类可以有抽象方法和非抽象方法,接口和抽象类都可以被继承,但是接口可以多继承抽象类不行,接口还能多实现;两者都不能被实例化,
十一,编写多线程的几种实现方式
- 继承Thread类
- 实现Runnable接口
- Java5后:实现Callable接口
继承Thread类:线程开启不一定立即执行,由CPU调度。
静态代理:Thread类实现了Runnable接口,用的就是静态代理
Lamda表达式:
- 先定义一个接口:
- 写一个实现类去实现接口方法:
- lambda表达式:
线程同步:
死锁:
指两个或两个以上的进程在执行过程中,由于竞争资源或彼此通信二照成阻塞现象,无外力不可解;
数据库
索引:
使查询数据效率快
- 聚集索引(主键索引):
- 非聚集索引:
- 联合索引:
mycat:数据库中间件
读写分离、主从复制、数据分片
十二、json与对象互相转换
对象—->json:String json=JSON.toJSONString(user);
ObjectMapper MAPPER = new ObjectMapper();
String string = MAPPER.writeValueAsString(data);
json——>对象: T t = MAPPER.readValue(jsonData, beanType);
十三、AOP
切面:就是切点和连接点以及通知所在的那个类为一个切面。
切点:是连接点的集合。
连接点:连接点的最小单位为一个方法,
通知:切入连接点的时机和内容。
十四,Java中a=a+b 与 a+=b区别 以及和类型转换的关系
首先说一下执行效率问题
就单纯的执行这两条语句,不考虑编译器的优化的话,a=a+b的执行效率是低于a+=b的,因为它多进行了一步中间变量的操作,而且会多占用一个变量的空间。而Java编译器默认对其进行了优化,优化之后两条语句都当做 a+=b来执行了,所以实际上是没有任何却别的。
其次说一下有关类型转换的区别。
当使用a=a+b的时候,会抛出”Exception in thread “main” java.lang.Error: Unresolved compilation problem: Type mismatch: cannot convert from float to int“的异常,这是可以理解的,如果不使用(int)强制类型转换的话,float 是不能直接复值给int 变量的。
十五,List,Set,Map
一、数组和集合的区别:
1.数组的大小是固定的,并且同一个数组只能是相同的数据类型,有序
2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合,无序
二、集合的三种类型:list(列表)、set(集)、map(映射)
List接口和Set接口属于Collection接口,Map接口和Collection接口并列存在(同级)。
十六,通过String类将String转换成byte[]或者byte[]转换成String
用String.getBytes()方法将字符串转换为byte数组,通过String构造函数将byte数组转换成String; String s = new String(bytes);
十七,Throw和Throws的区别
Throw:
作用在方法内,表示抛出具体异常,由方法体内的语句处理。
具体向外抛出的动作,所以它抛出的是一个异常实体类。若执行了Throw一定是抛出了某种异常。
Throws:
作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理。
主要的声明这个方法会抛出会抛出某种类型的异常,让它的使用者知道捕获异常的类型。
出现异常是一种可能性,但不一定会发生异常。
实例:
void testException(int a) throws IOException,{
try{
……
}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println(“出错了!”);
}
if(a!=b)
throw new Exception3(“自定义异常”);
}
- mybatis的分页插件原理
- 使用的rowbounds对象,对resultset结果集进行内存分页,也可以用
- 分布式和单机的优缺点
- linux的操作命令有哪些
- 包装类和基本类型的区别
- 包装类可以为null,还可以用于泛型,
- 基本类型更高效,基本类型存储在栈中,包装类存储在堆中。
- 自动装箱是通过Integer.value(),自动拆箱是通过Integer.intValue();
- Exception受检查的异常,这种异常是强制我们catch或throw的异常。你遇到这种异常必须进行catch或throw,如果不处理,编译器会报错。比如:IOException。
RuntimeException是非检查型异常,例如NumberFormatException,可以不使用try…catch进行处理,是jvm在接管。
但是如果产生异常,则异常将由JVM进行处理;
RuntimeException最好也用try…catch捕获;
RutimeException是Exception的子类,
jdk1.8新特性:
- lambda表达式,接口中默认使用default/static修饰,时间包,
什么是值传递和引用传递?
- 值传递就是对于基本类型而言,传递的是变量的一个副本,改变副本不影响原变量。
- 引用传递传递是对象的地址的一个副本,并不是原对象本身。
java为什么会出现4.0-3.6=0.40000001的现象?
- 2进制的小数无法精确的表达10进制小数,在计算时要先将10进制数转化为2进制数。