1、介绍Collection框架的结构

集合是Java中的一个非常重要的一个知识点,主要分为List、Set、Map、Queue三大数据结构。它们在Java中的结构关系如下:

Collection接口是List、Set、Queue的父级接口。

Set接口有两个常用的实现类:HashSet和TreeSet。List接口的常用接口有ArrayList和Vector接口。

Map接口有两个常用的实现类:Hashtable和HashMap。

2、Collection框架中实现比较要实现什么接口

要实现比较有两种方式:第一种,实体类实现Comparable<T>接口,并实现 compareTo(T t) 方法,我们称为内部比较器。第二种,创建一个外部比较器,这个外部比较器要实现Comparator接口的 compare(T t1, T t2)。

第一种,实现Comparable接口:

package com.chanshuyi.comparable;import java.util.*;public class Student implements Comparable<Student> {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Student o) {if ( getAge() > o.getAge()) {return 1;} else if ( getAge() < o.getAge()) {return -1;} else {return 0;}}//重写toString() 用于输出public String toString() {return "[" + name + "," + age + "]";}public static void main(String args[]){Student s1 = new Student("Tom", 12);Student s2 = new Student("Marry", 9);Student s3 = new Student("Json", 88);List<Student> studentList = new ArrayList<Student>();studentList.add(s1);studentList.add(s2);studentList.add(s3);Collections.sort(studentList);System.out.printf("Original  sort, list:%s\n", studentList);}
}

View Code

第二种,实现Comparator接口:

先定义一个Student类,无须实现任何接口。

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

View Code

定义一个外部比较器类,实现Comparator接口:

public class StudentComparator implements Comparator<Student>{@Overridepublic int compare(Student o1, Student o2) {if (o1.getAge() > o2.getAge()) {return 1;}else if (o1.getAge() == o2.getAge()) {return 0;}else{return -1;}}public static void main(String args[]) {Student marry = new Student("marry", 12);Student tom = new Student("tom", 3);Student jackson = new Student("jackson", 88);StudentComparator comparator = new StudentComparator();System.out.println(comparator.compare(marry, tom)); //1System.out.println(comparator.compare(tom, jackson));  //-1
    }
}

View Code

由此可见,如果你希望该实体类在放入集合的时候能按照你希望的方式排序(如果集合支持),那么你需要让实体类实现Comparable接口。如果你只是需要简单比较两个实体类的大小,最后返回一个结果,那么用Comparator接口实现一个外部比较器更合适。

3、ArrayList和Vector的区别(是否有序、是否重复、数据结构、底层实现)

ArrayList和Vector都实现了List接口,他们都是有序集合,并且存放的元素是允许重复的。它们的底层都是通过数组来实现的,因此列表这种数据结构检索数据速度快,但增删改速度慢。

而ArrayList和Vector的区别主要在两个方面:

第一,线程安全。Vector是线程安全的,而ArrayList是线程不安全的。因此在如果集合数据只有单线程访问,那么使用ArrayList可以提高效率。而如果有多线程访问你的集合数据,那么就必须要用Vector,因为要保证数据安全。

第二,数据增长。ArrayList和Vector都有一个初始的容量大小,当存储进它们里面的元素超过了容量时,就需要增加它们的存储容量。ArrayList每次增长原来的0.5倍,而Vector增长原来的一倍。ArrayList和Vector都可以设置初始空间的大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。

4、HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,并且都是key-value的数据结构。它们的不同点主要在三个方面:

第一,Hashtable是Java1.1的一个类,它基于陈旧的Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。

第二,Hashtable是线程安全的,也就是说是线程同步的,而HashMap是线程不安全的。也就是说在单线程环境下应该用HashMap,这样效率更高。

第三,HashMap允许将null值作为key或value,但Hashtable不允许(会抛出NullPointerException)。

5、List 和 Map 区别?(数据结构,存储特点)

这个要从两个方面来回答,一方面是List和Map的数据结构,另一方面是存储数据的特点。在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复)。

6、List、Map、Set三个接口,存取元素时,各有什么特点?

List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去。所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合(map.keySet()),还可以获得所有的value的结合(map.values()),还可以获得key和value组合成的Map.Entry对象的集合(map.entrySet())。

List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

Java集合常见面试题集锦相关推荐

  1. Java工程师常见面试题集锦

    Java工程师常见面试题集锦(一)互联网人必看!(附答案及视频教程,持续更新) 2019年01月02日 14:01:14 CSDNedu 阅读数:653 大牛也怕面试题,尤其是基础题,在面试中如果出现 ...

  2. Java集合常见面试题

    原文链接:https://javaguide.cn 集合面试常问 Java集合框架继承图 综合面试题 1.说说List.Set.Queue和Map四者的区别. 2.集合的底层数据结构 3.如何选取集合 ...

  3. Java 集合常见面试题

    1.ArrayList和LinkedList区别? ArrayList是容量可以改变的非线程安全集合.内部实现使用数组进行存储,集合扩容时会创建更大的数组空间,把原有数据复制到新数组中.ArrayLi ...

  4. 【面试题】Java常见面试题集锦

    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...

  5. java陷阱常见面试题_Java常见陷阱

    java陷阱常见面试题 总览 Java是一种极简主义的语言,具有比其他语言故意更少的功能,尽管如此,Java仍然具有产生奇怪效果的边缘情况,甚至具有令人惊讶的效果的一些常见情况也会使您轻而易举. 如果 ...

  6. Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3

    Java开发常见面试题详解(LockSupport,AQS,Spring循环依赖,Redis)_3 总览 问题 详解 String.intern()的作用 link LeetCode的Two Sum题 ...

  7. Java开发常见面试题详解(JVM)_2

    Java开发常见面试题详解(JVM)_2 JVM 问题 详解 JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots link 你说你做过JVM调优和参数配置,请问如何盘点查看JVM系统默认 ...

  8. html5退出全屏触发的方法_好程序员web前端分享HTML5常见面试题集锦二

    web前端分享HTML5常见面试题集锦第二篇,希望对大家有所帮助. 1. 方法1: html,body{height: 100%;} body{ margin: 0;display: flex; ju ...

  9. html5 将id的值用于top_web前端分享HTML5常见面试题集锦四

    web前端分享HTML5常见面试题集锦四 1.为什么要初始化CSS样式? 答案:因为浏览器的兼容问题,不同浏览器对有些标签的默认值是不同的,如果没对CSS初始化往往会出现浏览器之间的页面显示差异. 当 ...

  10. js怎么在一个div中嵌入另一网站_好程序员web前端学习路线分享HTML5常见面试题集锦一...

    好程序员web前端学习路线分享HTML5常见面试题集锦,接下来将会持续为大家分享几篇HTML5常见面试题. 1.布局 左边20% 中间自适应 右边200px 不能用定位 答案:圣杯布局/双飞翼布局或者 ...

最新文章

  1. 计算机网络rsa算法,计算机网络安全实验新报告--非对称密码算法RSA.doc
  2. 数据库内容导出为excel并下载
  3. redmine安装指引
  4. 在Ant的javac中指定源文件编码方式,以避免警告: 编码 GBK 的不可映射字符的错误...
  5. mingw64+msys2下使用cmake问题
  6. 一款开源Office软件---Lotus Symphony在Linux系统下的应用
  7. beautifulsoup 基本语法
  8. VLFeat工具箱配置
  9. 今天分享一下做支付宝小程序遇到的坑。ISV权限不足,建议在开发者中心检查对应功能是否已经添加。验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配
  10. debian查询端口进程_Linux 查看端口占用情况
  11. 盘点五款值得收藏的 Linux 开发板
  12. 火车采集器html规则,火车头采集器代码过滤方法
  13. web测试-WEB常用测试用例集
  14. C# Word文档中插入、提取图片,文字替换图片
  15. jsp 的 4 种作用域?
  16. 测试岗最好用的——十大软件测试工具
  17. 航班信息查询和检索系统
  18. tensorflow之pb文件保存与载入
  19. 侠众道武功最佳练级方案_侠众道二层武功先练什么 武功选择分享
  20. 识别有关视频文件的编解码器和技术信息

热门文章

  1. 第三届易观算法大赛 -- OLAP Session分析(5万奖金)
  2. Mysql数据库查询优化日常笔记
  3. mysql 数据库数据恢复 库被删了怎么恢复数据库
  4. Xshell使用方法
  5. GNS3模拟ASA8.4 ASDM6.4QEMU模拟 终结版
  6. AUTOCAD——光顺曲线命令、分解命令
  7. STC8A 进行USB直接ISP下载
  8. 熟练掌握CAD制图,能做哪些工作?
  9. php gd jpeg,怎么解决GD库不支持JPEG
  10. ofd文件怎么复制文字