面试整理

一。java创建对象的几种方式

  1.通过new关键字创建对象,这个过程一定是需要调用构造函数

  2.通过反射Class.forName(classFullPathName).newInstance()创建对象,一定要调用默认的无参构造函数

  3.采用clone:

  4.通过序列化机制

二。写个单例模式public class Singleton {

    private static Singleton instance;
private Singleton(){}//保证一个类仅有一个实例(将构造方法私有化)
public static Singleton getInstance(){//并提供一个访问它的全局访问点
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
三。final,finalize,和finally的不同之处
  final是一个修饰符,可以修饰变量,方法,类;修饰变量,意味着变量的值在初始化后不能被改变;修饰方法,意味着该方法不能被覆盖(重写);修饰类,意味着该类不能被继承
finalize是Object的一个方法,在垃圾收集器执行的时候调用被回收的对象的此方法,供垃圾收集器的其他资源回收,例如关闭文件等
  finally是异常处理语句结构的一部分,表示总是执行
四。java8种基本数据类型:byte,short,int,long,float,double,boolean,char
五。jvm 加载原理
  源代码(.java)被java编译器(javac)编译过的.class文件(可能是以jar、war、jsp等形式), 经过类加载器加载 、 验证、准备、解析、初始化之后, 才可以被使用。基本的过程如下:
 
  • 加载: 首先,通过一个类的全类名来获取此类的二进制字节流。其次,将类中所代表的静态存储结构转换为运行时数据结构, 最后,生成一个代表加载的类的java.lang.Class对象, 作为方法区这个类的所有数据的访问入口。加载完成之后, 虚拟机外部的二进制静态数据结构就转换成了虚拟机所需要的结构存储在方法区中(至于如何转换, 则由具体虚拟机自己定义实现), 而所生成的Class对象, 则存放在方法区中, 用来作为程序访问方法区中数据的外部接口。
  • 验证:其目的就是保证加载进来的.class文件不会危害到虚拟机本身, 且内容符合当前虚拟机规范要求。主要验证的内容大致有:文件格式、元数据验证、字节码验证、符号引用验证。其中文件格式验证, 主要确保符合class文件格式规范(如文本后缀为.class的文件将验证不通过), 以及主次版本号, 验证是否当前JVM可以处理等。元数据验证,主要验证编译后的字节码描述信息是否符合java语法规范。字节码验证, 其最为复杂, 主要通过控制流和数据流确定语义是否合法、符合逻辑。符号引用验证,可以看做是除自身以外(常量池中各种引用符号)的信息匹配校验,如通过持有的引用能否找到对应的实例。
  • 准备:正式为类变量分配内存,并设置类变量的初始值。这些变量都会在方法区中进行分配。
  • 解析:将常量池内的符号引用替换为直接引用的过程。主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄等。
  • 初始化:加载的最后阶段, 程序真正运行的开始。

六。简述spring ioc,aop,di:

  1.IoC:控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入    (Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。

  2.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(主要用于事物日志)

  3.依赖注入(Dependency Injection)是Spring框架的核心之一。

七。HashMap 和HashTable的区别

  1.HashMap是支持null键和null值的,而HashTable在遇到null时,会抛出NullPointerException异常

  2.HashMap是非线程安全的,HashTable 是线程安全的(如今被淘汰了,可以用ConcurrentHashMap代替)

八。Mybatis实现原理

九。事物的作用

事务就是对一系列的数据库操作进行统一的提交或回滚操作,避免因为意外或错误操作出现数据问题。

十。乐观所与悲观锁

悲观锁

悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。

Java synchronized 就属于悲观锁的一种实现,每次线程要修改数据时都先获得锁,保证同一时刻只有一个线程能操作数据,其他线程则会被block。

乐观锁

乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

十一。Collection 和 Collections的区别

Collection是集合类的上级接口,子接口主要有Set 和List、Map、Vector。 

Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

十二。Vector,ArrayList, LinkedList的区别

1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。

2、List中的元素有序、允许有重复的元素,Set中的元素无序、不允许有重复元素。

3、Vector线程同步,ArrayList、LinkedList线程不同步。

4、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。

5、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。

原文地址:https://www.cnblogs.com/mayanze/p/8503996.html