Java面试之Java基础上册(含答案)

  1. JAVA中的几种基本数据类型是什么,各自占用多少字节。
    int 32bit short 16bit
    long 64bit byte 8bit
    char 16bit float 32bit
    double 64bit boolean 1bit

============================================================

  1. String类能被继承吗,为什么?
    public final class String

    implements java.io.Serializable, Comparable, CharSequence

String 被final修饰了,所有不能被继承。

1.final修饰的对象不能被修改;

2.final修饰的类不能被继承;

3.final修饰的方法不能被重写;

============================================================

  1. String,Stringbuffer,StringBuilder的区别。
    1.可变与不可变

String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

private final char value[];

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

char[] value;

2.是否多线程安全

String中的对象是不可变的,也就可以理解为常量,显然线程安全。

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。看如下源码

最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

============================================================

4 . ArrayList和LinkedList有什么区别。
ArrayList和Vector使用了数组的实现,

LinkedList使用了循环双向链表数据结构。 场景使用不同

对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。

============================================================

  1. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
    类的实例化顺序:先静态再父子

父类静态数据->子类静态数据->父类字段->子类字段->父类构造函数->子类构造函数

============================================================

  1. Map区别
    用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。

最常用的Map实现类有:HashMap,ConcurrentHashMap(jdk1.8),LinkedHashMap,TreeMap,HashTable;

其中最频繁的是HashMap和ConcurrentHashMap,他们的主要区别是HashMap是非线程安全的。ConcurrentHashMap是线程安全的。

并发下可以使用ConcurrentHashMap和HashTable,他们的主要区别是:

1.ConcurrentHashMap的hash计算公式:(key.hascode()^ (key.hascode()>>> 16)) & 0x7FFFFFFF

HashTable的hash计算公式:key.hascode()& 0x7FFFFFFF

2.HashTable存储方式都是链表+数组,数组里面放的是当前hash的第一个数据,链表里面放的是hash冲突的数据

ConcurrentHashMap是数组+链表+红黑树

3.默认容量都是16,负载因子是0.75。就是当hashmap填充了75%的busket是就会扩容,最小的可能性是(16*0.75),一般为原内存的2倍

4 .线程安全的保证:HashTable是在每个操作方法上面加了synchronized来达到线程安全,ConcurrentHashMap线程是使用CAS(compore and swap)来保证线程安全的

============================================================

  1. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
    jdk8 放弃了分段锁而是用了Node锁,减低锁的粒度,提高性能,并使用CAS操作来确保Node的一些操作的原子性,取代了锁。

但是ConcurrentHashMap的一些操作使用了synchronized锁,而不是ReentrantLock,虽然说jdk8的synchronized的性能进行了优化,但是我觉得还是使用ReentrantLock锁能更多的提高性能

============================================================

  1. 有没顺序的 Map 实现类,如果有,他们是怎么保证有序的 。 顺序的 Map 实现类:LinkedHashMap,TreeMap
    LinkedHashMap 是基于元素进入集合的顺序或者被访问的先后顺序排序,TreeMap 则是基于元素的固有顺序 (由 Comparator 或者 Comparable 确定)。

============================================================

  1. 抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。抽象类和接口的区别:
    1.抽象类可以有自己的实现方法,接口在jdk8以后也可以有自己的实现方法(default)

2.抽象类的抽象方法是由非抽象类的子类实现,接口的抽象方法有接口的实现类实现

3.接口不能有私有的方法跟对象,抽象类可以有自己的私有的方法跟对象

类不可以继承多个类,接口可以继承多个接口,类可以实现多个接口

============================================================

  1. 继承和聚合的区别在哪。
    继承:指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;

聚合:聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

============================================================

  1. 讲讲你理解的nio。他和bio的区别是啥,谈谈reactor模型。
    BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
    NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

reactor模型:反应器模式(事件驱动模式):当一个主体发生改变时,所有的属体都得到通知,类似于观察者模式。

============================================================

  1. 反射的原理,反射创建类实例的三种方式是什么。
    反射的原理:如果知道一个类的名称/或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)找出来。

反射创建类实例的三种方式:

1.Class.forName(“com.A”);

2.new A().getClass();

3.A.class;

============================================================

  1. 反射中,Class.forName和ClassLoader区别。
    class.forName()除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
    classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

============================================================

  1. 描述动态代理的几种实现方式,分别说出相应的优缺点。

动态代理有两种实现方式,分别是:jdk动态代理和cglib动态代理

jdk动态代理的前提是目标类必须实现一个接口,代理对象跟目标类实现一个接口,从而避过虚拟机的校验。

cglib动态代理是继承并重写目标类,所以目标类和方法不能被声明成final。

============================================================

  1. 动态代理与cglib实现的区别。
    动态代理有两种实现方式,分别是:jdk动态代理和cglib动态代理

jdk动态代理的前提是目标类必须实现一个接口,代理对象跟目标类实现一个接口,从而避过虚拟机的校验。

cglib动态代理是继承并重写目标类,所以目标类和方法不能被声明成final。

小编分类整理了许多java进阶学习材料和BAT面试题,需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值