JAVA core面试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34645958/article/details/80785739

1.自动装箱和自动拆箱?

自动装箱:把基本数据类型转化为对应的包装类型。实际上是在编译的时候调用Integer.valueof()来装箱,底层Integer i=1

自动拆箱:把包装类型转化为基本数据类型。实际上是在编译调用 i.intValue()方法

 装箱和拆箱的作用:(1)把基本类包装成一个类,可以使这个类有更多可以调用的方法(Integer.valueof (1)  Integer.parseInt(str))

                                          (2)是java向面向对象语言的靠近(真正的面向对象,是没有基本数据类型的)

                                          (3)泛型中,基本数据类型不可以做泛型的参数

2.类实例化的顺序?

父类静态变量-父类静态代码块-子类静态变量-子类静态代码块

父类非静态代码块-父类构造函数-子类非静态代码块-子类构造函数

3.子类会继承父类的构造方法吗?

    不会继承,子类只会在实例化的时候隐式的调用父类的构造方法。当父类中没有同类型构造方法时,会报错

3.java序列化的作用?底部实现原理?

序列化作用:(1)实现数据持久化(2)远程通信之间不能直接传输java对象,所以需要先序列化转化为字节流才能进行传输

实现原理:(1)输出序列化的头部信息,包括标识序列化协议的以及协议的版本

                 (2)按照子类到父类的顺序,递归的输出类的描述信息(元数据,类属性信息顺序写入序列化流中)

                 (3)按照父类到子类的顺序,递归的输出对象的实际数据的值

4.synchronized底层原理?它是公平锁吗?

jvm内部维护着多个队列,首先所有请求锁的线程被放在竞争队列Contention List中,然后把有资格称为候选资源的线程迁移到EntryList中,并指定EntryList中某个线程为OnDeck线程(一般是最先进去的那个线程),Ondeck线程获取锁资源后会变成Owner线程。当锁被释放时,Contention中的部分线程迁移到EntryList中。如果Owner线程被wait方法阻塞,则转移到waitSet队列中,直到被唤醒,则重新进入EntryList

synchronized是非公平锁,因为它在进入ContentionList前会先尝试自旋获取锁,获取不到时才进入contentionList,这对于 已经在竞争队列中的锁是不公平的

5.面向对象的三大特性和五大基本原则?什么是高内聚,低耦合?

三大特性:

1.封装:将客观的事物封装成抽象的类,并且可以把数据和方法让可信的类进行操作,对不可信的类进行隐藏

2.继承:通过继承在现有类的基础上实现对这些类功能的扩展

3.多态:父类引用指向子类对象,通过该引用调用的方法在编译时不确定,而是在程序运行期间才能确定。它存在的前提是(1)有继承关系(2)子类重写父类的方法(3)父类引用指向子类对象

五大基本原则:

1.单一职责原则:一个类功能要单一,不要包罗万象

2.替换原则:子类能替换父类,出现在父类能出现的任何地方(也就是说尽量不要重写父类的方法,避免破坏整体的继承)

3.开放封闭原则:对扩展开放,对修改关闭(实现:用抽象构建框架,用实现类进行扩展)

4.依赖原则:依赖于抽象编程,不要依赖具体编程

5.接口分离原则:模块之间要通过抽象接口隔离开

高内聚,低耦合:在模块划分时,要遵循“一个模块,一个功能”的原则,尽可能使模块达到内聚功能

                           低耦合,模块之间尽可能少出现关联的关系

6.重写equals方法为什么要重写hashcode方法?

euqals方法和hashcode 方法有两个约定:

(1)如果两个对象的equals方法返回true,则它们的hashcode方法返回值相同

(2)hashcode返回值相同,equals方法返回值不一定相同

存在这个约定的主要作用我认为是提高效率,java集合中的hashset和hashmap在添加或查找元素时会先调用hashcode方法,如果值不相同,则一定不是同一个对象,如果值相同,再调用equals方法,如果相同才能说明是同一个对象.这样可以避免equals方法逐个比较,影响效率

7.String StringBuffer StringBuilder 区别?

(1)String是final修饰的不可变的字符数组,StringBuffer和StringBuilder是可变的字符数组(new Sringbuffer("qq").append("aa"))

(2) StringBuffer和StringBuilder拼接字符串的效率较高,因为不用频繁的创建对象

(3)StringBuilder是线程不安全的,效率较高;StringBuffer是线程安全的,效率较低

8.讲一下java中的集合?

java中的集合分为value  和  key-value两种

存储value的分为List和Set:

   (1)list是有序的,可以重复的

   (2)set是无序的,不可以重复的.根据equals和hashcode判断是不是同一个对象

存储key-value的为map

9.ArrayList和LinkList的区别?

(1)ArrayList底层使用数组,查找快,增删慢

     LinkedList底层使用链表,增删快,查找慢(链表内存不连续,每个节点保存了上一个和下一个节点地址,所以需要从头查)

10.hashmap和hashtable的区别?

(1)hashmap线程不安全的,效率高.hashtable是线程安全的,效率低

(2)hashmap可用null作为key和value,hashtable不可以

综合两者的优点的-concurentHashmap

11.谈谈ConcurrentHashmap?

Concurrenthashmap是由segement数组结构和HashEntry数组组成.

Segement是一种可重入锁ReentrantLock,在Concurrenthashmap里扮演锁的角色.hashEntry用于存储键值对,是一种链表结构

每个segment守护着一个HashEntry数组里的元素

12.什么是可重入锁?什么是不可重入锁?

可重入锁:任意线程获取到该锁后,再次获取该锁而不会被该锁阻塞(synchronized ReentLock)

不可重入锁:当前线程获取锁后,想要再拿到这把锁,必须释放当前所持有的锁

13.java中如何创建线程池?

java通过Executors提供四个静态方法创建四种线程池:

   newCacheThreadPool:创建一个可缓存线程池,可灵活回收线程,不够可新建线程

  newFixedThreadPool:创建一个定长线程池,可控制最大并发数,超过的线程会在队列中等待

  newScheduledThreadPool:创建一个定长线程池,支持定时及周期性的执行任务

  newSingleThreadExecutor:创建一个单线程化的线程池

猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80785739