Java基础
1.JAVA中的几种基本数据类型是什么,各自占用多少bit。
byte(8),char(16),short(16),int(32),long(64),float(32),double(64),boolean(1)
2.String类能被继承吗,为什么。
不能, final类型,不能被继承
3.String,Stringbuffer,StringBuilder的区别。
String: 通过+来拼接字符串,+操作后会生成新的对象
StringBuffer: append方法拼接,线程安全,效率低
StringBuilder: append方法拼接,非线程安全,效率高
4.ArrayList和LinkedList有什么区别。
ArrayList: 底层为数组,从末尾新增和删除效率比LinkedList高(Systen.arraycopy方法优化元素移动)
LinkedList:底层为链表,从头部新增或删除效率比前者高
5.讲讲类的实例化顺序,比如父类静态数据,构造函数,子类静态数据,构造函数,当new的时候,他们的执行顺序
父类的static方法--》子类的static方法--》父类的构造函数---》子类的构造函数
6. 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们
内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
HashMap,TreeMap,ConcurrentHashMap
HashMap非线程安全
内部原理:底层为Entry数组,通过计算key的hashcode%(size-1)来确定槽位,默认容量为16
7. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何
设计。??
1) 分段锁改为行锁
取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。
2) 冲突后的单链表若长度超过8,则改为红黑树
代价: put性能稍差一些,get性能大幅提升
8. 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的。
TreeMap,维护一个红黑树来保证有序
9. 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口
么。
1)类单继承,接口多继承,多实现
2)抽象类可包含方法的实现,常用于模板方法
10 继承和聚合的区别在哪。
继承是父类和子类的关系
依赖是一个类的方法使用到另一个类的对象,入参依赖另一个类(偶然的,弱耦合)
关联体现的是两个类、或者类与接口之间语义级别的一种强依赖关系。包含聚合与组合
聚合是整体和部分的关系,独立分离(家庭与孩子)
组合是整体和部分的关系,不可分离 (人与鼻子,眼睛)
11 IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
bio,nio,aio
bio: 同步阻塞
nio: 同步非阻塞/同步阻塞
aio: 异步非阻塞
同步与异步: 一件事情的完成需要依赖另一件事情
阻塞与非阻塞: CPU是否停下来等待一个慢的操作完成
12 反射的原理,反射创建类实例的三种方式是什么。
原理: 运行时动态获取对象信息或调用对象的方法
Class.forName(xx)
类名.class
实例.getClass()
13 反射中,Class.forName和ClassLoader区别。
14 描述动态代理的几种实现方式,分别说出相应的优缺点。
JDK的Proxy
CGLib的使用Javassist
15 动态代理与cglib实现的区别。
java反射实现
asm 运行时修改字节码(汇编指令),通过动态创建子类的方式,无法代理final类
javassist也是运行时改变字节码,不需要了解汇编指令,通过接口实现的方式
16 为什么CGlib方式可以对接口实现代理。
运行时修改字节码,通过动态创建子类的方式,无法代理final类
17 final的用途。
类: 不能继承
方法: 不能覆盖
字段: 不能修改,值不变,引入不变
18 写出三种单例模式实现。
懒汉加载
饿汉加载
double check
19 如何在父类中为子类自动完成所有的hashcode和equals实现?这么做有何优劣。
某些时候不满足需求
20 请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设
计中的作用。
封装性,尽量暴露方法,屏蔽属性
继承性:父类与子类之间方法的复用
21 深拷贝和浅拷贝区别。
针对对象是否复制,浅复制只是引用,深复制会生成新的对象
22 数组和链表数据结构描述,各自的时间复杂度。
23 error和exception的区别,CheckedException,RuntimeException的区别。
error为系统错误, 虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。
exception为代码异常
CheckedException为编译时异常
RuntimeException为运行时异常
24 请列出5个运行时异常。
空指针,数组越界,类找不到ClassNotFoundException,/0 ArithmeticException,类型转换ClassCastException
25 在自己的代码中,如果创建一个java.lang.String类,这个类是否可以被类加载器加
载?为什么。
不会。 已经被bootstapClassLoader加载jvm中了,加载之前双亲委托,parent类加载器已经加载过的类,不会被加载
26 说一说你对java.lang.Object对象中hashCode和equals方法的理解。在什么场景下需
要重新实现这两个方法。
对象需要存储在Map中,且作为key的时候
27 在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。
类型的参数化,就是可以把类型像方法的参数那样传递。
作用: 泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。
28 有没有可能2个不相等的对象有相同的hashcode。
可能
29 Java中的HashSet内部是如何工作的。
HashMap的key
// value为空Object对象
private transient HashMap<E,Object> map;
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
30 什么是序列化,怎么序列化,为什么序列化,反序列化会遇到什么问题,如何解决。
对象转为字节流,用于存储或者网络传输,需要实现Serializable接口,需要指定序列化id,否则反序列化报错
java自身的序列化方式效率较低,而dubbo默认采用hessian2的序列化方式 ,可扩展kyro,fst
31 java8的新特性。
lamda表达式