• Java常见面试知识点汇总(2)


    提问:==与equals()有什么区别?

    ==用于比较两个值是否相等,可以作用于任何对象的比较;而equals()方法是Object类中的方法,用于比较两个类对象是否相等,必须使用<类对象>.equals(<另一个类对象>)方法。

    (a)对于==,比较的是值地址是否相等。

    如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址;

    如果一边是基本数据类型,一边是其对应的包装类型,则会先将封装类型拆箱,按照基本数据类型进行比较;

    (b)equals操作表示的两个引用变量堆中的内容是否相同。

    equals方法不能作用于基本数据类型的变量,equals继承Object类,比较的是两个对象的值。

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址,所以默认情况下,同类型的两个类对象equals比较肯定返回false。

    对于JDK中的一些类,诸如String、Date等类,对equals方法进行了重写的话,比较的是所指向的对象的内容。

    提问:为什么重写equals方法后,必须重写hashcode方法?

    equals方法和hashcode方法都是Object类定义的方法,前者用于可以理解成从业务数据角度比较两个Object对象内容是否相等;后者则用于计算Object的hash值。

    在Object中,equals方法默认是通过比较两个对象是否指向同一个地址来判断是否相等的;而hashcode方法是个native方法,根据一些hash算法生成,一般每个对象的hash值都会不同。

    当重写equals方法时(即根据某些定义的业务字段维度去判断两个对象是否相等),如果不重写hashcode,那么会导致及时是equals判定相等的两个对象hashcode值不一样,从而在使用一些如HashTable、HashMap、ConcurrenntHashMap、HashSet等底层采用hash结构的集合类型时,会存在不同的对象都会保存到集合中,而这个与实际的业务诉求并不相符,从而存在一些问题。

    根据规范,一般要求equals判定相等的两个对象,其hashcode值也必须一样。

    提问:String, StringBuilder, StringBuffer的区别是什么?

    String是Java中的一种数据类型,由final定义,对象创建之后不可改变。

    StringBuilder, StringBuffer是JDK中提供的两个用于进行字符串操作的帮助类,目的是为了提升字符串操作效率;其中StringBuilder为非线程安全的,StringBuffer为线程安全的。

    一般在循环中进行字符串拼接的话,会使用StringBuilder或者StringBuffer。

    提问:Collection与Collections的区别是什么?

    Collection是Java集合框架的根接口(顶级接口);

    Collections是JDK提供的用于操作集合类型的工具类,提供了一些静态方法,用于对集合中的元素进行排序,查找、乱序、逆序等操作,还提供了一些方法方法用于将非线程安全集合封装成线程安全集合。

    提问:聊聊对JAVA Collection集合框架的了解?

    Collection是Java集合框架的根接口(顶级接口);Map不是Collection接口的子接口,但是Map中可以生成Collection的对象,如Map的key集合或者value集合都是Collection。

    Java集合大致可分为Set、List、Queue和Map,其中Set代表无序、不可重复的集合;List代表有序、可重复的集合;而Map则代表具有映射关系的集合。Java 5之后,增加了Queue体系集合,代表一种队列集合实现。

    Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。

    (1)List分支:

    从数据结构的实现不同看,分为基于链表(LinkedList)的和基于数组(ArrayList、CopyOnWriteArrayList、Vector和Stack)。

    从线程安全性方面看,分为线程安全(CopyOnWriteArrayList、Vector、Stack)和非线程安全(ArrayList、LinkedList)。

    Vector及Stack的线程安全性是通过在方法上添加synchronized关键字保证的;CopyOnWriteArrayList的线程安全是通过ReentrantLock实现的,内部是通过创建一个新的数组来替换之前旧的数组来实现。

    (2)Set分支:

    从数据结构实现不同看,分为基于数组(CopyOnWriteArraySet)、基于哈希表(HashSet、LinkedHashSet、ConcurrentSkipListSet)、基于树(TreeSet)。

    从是否保证有序角度看,分为不保证顺序(HashSet)和保证顺序(LinkedHashSet和TreeSet,前者保证插入顺序,后者保证按照字段含义进行排序);

    从线程安全性方面看,分为线程安全(CopyOnWriteArraySet,ConcurrentSkipListSet)和非线程安全(HashSet、LinkedHashSet、TreeSet);

    (3)Map分支:

    从数据结构实现不同看,分为基于跳表(ConcurrentSkipListMap)、基于哈希(HashTable、HashMap、LinkedHashMap、ConcurrentHashMap、WeakHashMap)、基于树(TreeMap)。

    从线程安全性方面看,分为线程安全(HashTable、ConcurrentSkipListMap,ConcurrentHashMap)和非线程安全(HashMap、LinkedHashMap、TreeMap、WeakHashMap)。

    从有序性角度看,分为有序(LinkedHashMap、TreeMap、ConcurrentSkipListMap)和无序(HashTable、HashMap、ConcurrentHashMap、WeakHashMap)。

    (4)Queue分支

    ArrayBlockingQueue :一个由数组支持的有界队列。
    LinkedBlockingQueue :一个由链接节点支持的可选有界队列。
    PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。
    DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
    SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
    LinkedTransferQueue :由链表结构组成的无界阻塞队列。

    备注说明

    如果想第一时间获取最新最全的面试知识和面试技巧,欢迎扫码关注微信公众号(IT面试直通车),关于互联网编程与面试,这里一定有你想要的。

    目前公众号处于初期内容整理建设阶段,计划半年到一年时间将所有相关知识点都整理汇总,添加关注后可以跟随公众号一起逐渐成长,如对相关问题有疑问,可回复进行探讨,谢谢。

    在这里插入图片描述

    前文回顾

    Java常见面试知识点汇总(1)

  • 相关阅读:
    CoCube显示测试笔记
    Python爬取小说
    angular学习笔记
    转债列表筛选及与正股数据整合:qlib+fastapi
    xftp打开时提示需要更新或使用新版本
    基于TCP的网络聊天系统
    Spring Framework :WebClient 取代 RestTemplate
    尚硅谷Vue系列教程学习笔记(4)
    【MySql】mysql之MHA高可用配置及故障切换
    01 | jenkins的pipeline 脚本
  • 原文地址:https://blog.csdn.net/andamajing/article/details/124850856