1、JAVA中的几种基本数据类型是什么,各自占用多少字节。
int 4byte
short 2byte
long 8byte
byte 1byte
char 2byte
float 4byte
double 8byte
boolean 1bit
2、String类能被继承吗,为什么。
不能,因为String类被final修饰的,final修饰的类是不可以被继承的
3、String,StringBuffer,StringBuilder的区别。
可变与不可变
String不可变,StringBuffer,StringBuilder可变
是否多线程安全
String,StringBuffer安全,StringBuilder不安全
执行速度
StringBuilder --> StringBuffer --> String
4、ArrayList和LinkedList有什么区别。
ArrayList基于数组实现,访问快,操作慢,线程不安全,有序,允许重复;
LinkedList基于链表实现,操作快,访问慢,线程不安全,允许重复,有序;
5、讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
父类静态变量、
父类静态代码块、
子类静态变量、
子类静态代码块、
父类非静态变量(父类实例成员变量)、
父类构造函数、
子类非静态变量(子类实例成员变量)、
子类构造函数。
6、用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
HashMap、LinkedHashMap、Hashtable
HashMap无序、线程不安全;LinkedHashMap有序、线程不安全;Hashtable无序、线程安全
并发使用ConcurrentHashMap,为什么不用Hashtable,这就关系到Synchronized和Volatile的比较了
存储方式:哈希表是由数组+链表组成的,一个长度为16的数组中,每个元素存储的是一个链表的头节点。那么这些元素是按照什么样的规则存储到数组中呢,一般情况下是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。
默认容量:HashMap初始长度是16,loadFactor是0.75,也就是说当长度为16*0.75=12的时候,数组开始扩容(2倍),并且之前的元素要重新计算每个元素在数组中的位置
7、JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
https://blog.csdn.net/lcr_happy/article/details/95241832
8、有没有有顺序的Map实现类,如果有,他们是怎么保证有序的
HashMap无序;LinkedHashMap有序
HashMap是按照table+entry结构顺序存放的,而不是插入顺序;LinkedHashMap是利用了额外的链表来保证插入顺序是有序的
9、抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
抽象类:用abstract修饰,抽象类和普通类差不多,只是不能够实例化,方法不能private
接口:用interface修饰,只能public方法
类不能继承多个类
接口不能继承多个接口
类可以实现多个接口
10、继承和聚合的区别在哪。
继承:指的是一个类继承另外的一个类的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识。
聚合:聚合体现的是整体与部分、拥有的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期;比如计算机与CPU、公司与员工的关系等;
11、IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
JAVA BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程并处理,如果这个连接不做任何事情会造成不必要的开销,当然可以通过线程池机制改善
JAVA NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理
JAVA AIO(NIO2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理
Reactor:Reactor 是反应堆的意思,Reactor 模型是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式。
https://cloud.tencent.com/developer/article/1360553
12、反射的原理,反射创建类实例的三种方式是什么。
运行时获取类信息
Class class1 = Foo.class;
Class class2 = foo1.getClass();
Class class3 = Class.forName("com.imooc.reflect.Foo");
13、反射中,Class.forName和ClassLoader区别 。
在java中Class.forName()和ClassLoader都可以对类进行加载。ClassLoader就是遵循双亲委派模型最终调用启动类加载器的类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到JVM中。Class.forName()方法实际上也是调用的CLassLoader来实现的。
相同:都可以用来对类进行加载
不同:class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块,还会执行给静态变量赋值的静态方法
classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。
14、描述动态代理的几种实现方式,分别说出相应的优缺点。
jdk动态代理和cglib动态代理
https://blog.csdn.net/yhl_jxy/article/details/80635012
15、动态代理与cglib实现的区别。
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
如何强制使用CGLIB实现AOP?
1)添加CGLIB库(aspectjrt-xxx.jar、aspectjweaver-xxx.jar、cglib-nodep-xxx.jar)
2)在Spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
JDK动态代理和CGLIB字节码生成的区别?
(1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类
(2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法,因为是继承,所以该类或方法最好不要声明成final
16、为什么CGlib方式可以对接口实现代理。
JDK动态代理的原理是根据定义好的规则,用传入的接口创建一个新类,这就是为什么采用动态代理时为什么只能用接口引用指向代理,而不能用传入的类引用执行动态类。
CGLib采用的是用创建一个继承实现类的子类,用asm库动态修改子类的代码来实现的,所以可以用传入的类引用执行代理类
17、final的用途。
被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变
18、写出三种单例模式实现
懒汉式和饿汉式
19、如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。
TODO
20、请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。
public:Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包(package)访问。
private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
protect: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护形”。被其修饰的类、属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
default:即不加任何访问修饰符,通常称为“默认访问模式“。该模式下,只允许在同一个包中进行访问。
21、深拷贝和浅拷贝区别。
深拷贝:引用对象的值等信息,复制一份一样的。
浅拷贝:只复制引用,另一处修改,你当下的对象也会修改。
源码地址:
22、数组和链表数据结构描述,各自的时间复杂度。
https://blog.csdn.net/riemann_/article/details/87564524
23、error exception的区别和CheckedException RuntimeException的区别。
https://blog.csdn.net/riemann_/article/details/87522352
24、请列出5个运行时异常。
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
NoSuchElementException
UnknownElementException
25、在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加载?为什么。
可以加载,不过由于jvm的双亲委派模型,系统默认都会加载lang包下的String,如果想加载自己的String,必须自定义类加载器,继承java.lang.ClassLoader并重写父类的loadClass和findClass方法
26、说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需要重新实现这两个方法。
hashCode是一个对象的hash值,equals是两个对象的对比,默认是hashCode对比,但是再业务情况下,需要重写equals来做比较,只是也需要重写hashCode,因为在java中,equals和hashcode是有设计要求的,equals相等,则hashcode一定相等,反之则不然。set中做比较是先hashCode在equals
27、在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。
泛型主要针对向下转型时所带来的安全隐患,其核心组成是在声明类或接口时,不设置参数或属性的类型。
28、这样的a.hashcode() 有什么用,与a.equals(b)有什么关系。
获取a的hashcode值
equals就会比较hashcode是否相同
29、有没有可能2个不相等的对象有相同的hashcode。
https://zhidao.baidu.com/question/182427266865035924.html
30、Java中的HashSet内部是如何工作的
hashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以HashSet中所有 key 的都有一个默认 value。类似于HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。
31、什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
可能会反序列化失败,serialVersionUID字段一定要对应或者写1L
32、java8的新特性。
https://www.cnblogs.com/duanxz/p/5397231.html