java基础面试题带答案

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表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值