Java八股文 - 核心技术卷Ⅰ

在这里插入图片描述

1.接口和抽象类的区别
语法层面的区别
  • 抽象类可以提供成员方法的实现细节,而接口中只能存在抽象方法。
  • 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是编译时常量。
  • 接口中不能包含静态代码块,而抽象类可以有静态代码块。
  • 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
  • 接口中不能有构造方法,但是抽象类中,可以有构造方法。
  • 接口中可以定义默认方法并实现,但是抽象类中没有默认方法。
  • 接口是可以多继承,但是抽象类只能单继承。
设计层面的区别

抽象类是对一个事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包含属性、行为,但是接口却是对类局部(行为)进行抽象。

2.重载和重写的区别
  • 重载发生在同一个类中,方法名相同、参数列表、返回类型、权限修饰符可以不同
  • 重写发生在子类中,方法名相、参数列表、返回类型都相同,权限修饰符要大于父类方法,声明异常范围要小于父类方法,
    但是final和private修饰的方法不可重写
3.==和equals的区别
  • ==比较基本类型,比较的是值,若比较引用类型,比较的是内存地址
  • equlas是Object类的方法,本质上与==一样,但是有些类重写了equals方法,比如String的equals被重写后,比较的是内存地址,另外重写了equlas后,也必须重写hashcode() 方法
4.异常处理机制
  • (1)使用try、catch、finaly捕获异常,finaly中的代码一定会执行,捕获异常后程序会继续执行。
    常见的有异常有:
  • (2)使用throws声明该方法可能会抛出的异常类型,出现异常后,程序终止。

在这里插入图片描述

5.HashMap原理
  • 1.HashMap在Jdk1.8以后是基于数组+链表+红黑树来实现的,特点是,key不能重复,可以为null,线程不安全
  • 2.HashMap的扩容机制:
    HashMap的默认容量为16,默认的负载因子为0.75,当HashMap中元素个数超过容量乘以负载因子的个数时,就创建一个大小为前一次两倍的新数组,再将原来数组中的数据复制到新数组中。当数组长度到达64且链表长度大于8时,链表转为红黑树
  • 3.HashMap存取原理:
    (1)计算key的hash值,然后进行二次hash,根据二次hash结果找到对应的索引位置
    (2)如果这个位置有值,先进性equals比较,若结果为true则取代该元素,若结果为false,就使用高低位平移法将节点插入链表(JDK8以前使用头插法,但是头插法在并发扩容时可能会造成环形链表或数据丢失,而高低位平移发会发生数据覆盖的情况)
6.想要线程安全的HashMap怎么办?
  • (1)使用ConcurrentHashMap
  • (2)使用HashTable
  • (3)Collections.synchronizedHashMap() 方法
7.ConcurrentHashMap原如何保证的线程安全?

JDK1.7:使用分段锁,将一个Map分为了16个段,每个段都是一个小的hashmap,每次操作只对其中一个段加锁
JDK1.8:采用CAS+Synchronized保证线程安全,每次插入数据时判断在当前数组下标是否是第一次插入,是就通过CAS方式插入,然后判断f.hash是否=-1,是的话就说明其他线程正在进行扩容,当前线程也会参与扩容;删除方法用了synchronized修饰,保证并发下移除元素安全

8.HashTable与HashMap的区别
  • (1)HashTable的每个方法都用synchronized修饰,因此是线程安全的,但同时读写效率很低
  • (2)HashTable的Key不允许为null
  • (3)HashTable只对key进行一次hash,HashMap进行了两次Hash
  • (4)HashTable底层使用的数组加链表
9.ArrayList和LinkedList的区别

ArratList的底层使用动态数组,默认容量为10,当元素数量到达容量时,生成一个新的数组,大小为前一次的1.5倍,然后将原来的数组copy过来;
因为数组有索引,所以ArrayList查找数据更快,但是添加数据效率更低
LinkedList的底层使用链表,在内存中是离散的,没有扩容机制;LinkedList在查找数据时需要从头遍历,所以查找慢,但是添加数据效率更高

10.如何保证ArrayList的线程安全?
  • (1)使用collentions.synchronizedList() 方法为ArrayList加锁
  • (2)使用Vector,Vector底层与Arraylist相同,但是每个方法都由synchronized修饰,速度很慢
  • (3)使用juc下的CopyOnWriterArrayList,该类实现了读操作不加锁,写操作时为list创建一个副本,期间其它线程读取的都是原本list,写操作都在副本中进行,写入完成后,再将指针指向副本。
11.String、StringBuffer、StringBuilder的区别

String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。
StringBuffer可变并且线程安全;
StringBuiler不可变并且线程不安全。
操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer

参考链接:https://baijiahao.baidu.com/s?id=1740402133749788958&wfr=spider&for=pc

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值