一、Collection接口

Collection接口属于java.lang包,是集合类框架的主要接口,List接口、set接口、Queue接口继承了Collection接口,分别是列表、集合和队列。

1、List接口

java.lang.List接口主要定义了一些添加、获取、删除的元素的方法,主要是存储引用。注意:基本数据类型在进行操作时,会自动进行拆装箱。元素是有序的,并且可以重复,每个元素都有自己的索引

void add(Object obj);   //顺序的将一个引用放入列表中,增加元素
void add(int index,Object obj);   //在指定位置增加元素
Object get(int index);   //获取某个位置的引用
Object remove(int index);   //删除指定位置元素
void set(int index,Object obj);   //更改某一位置的元素
int size();   //得到当前列表的大小

ArrayList类:List接口的实现类

  • 底层结构是动态数组
  • 不支持线程同步,建议在单线程时使用
  • 由于底层是数组,因此查找快,增删较慢,需要移动元素

LinkedList类:List接口的实现类

  • 底层使用链表数据结构
  • 不支持线程同步
  • 查找需要遍历链表,因此慢,增删必须要移动元素,快

Vector类:List接口的实现类

  • 底层是动态数组
  • 支持线程同步,是线程安全的
  • 查找快,增删慢

2、Set接口 

Set是接口是集合,需要满足数学上集合特性,无序性、互异性,不支持线程同步

HashSet类:

  • 底层是哈希表数据结构,根据hashcode()和equals()方法确定元素的唯一性
  • 集合中的元素不重复且是无序的

TreeSet类:

  • 底层数据结构是二叉树
  • 可以对Set集合中的元素进行排序,自然顺序。也可以自己写个类实现Comparable接口或者Comparator接口,定义自己的比较器。

先准备一个类吧,要求对年龄从小到大进行排序

public class People{int age;String name;public People(int age,String name){this.age = age;this.name = name;}public int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;People other = (People) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}

方式一:实现Comparator接口,不需要在类中实现该接口

public static void main(String[] args) {// TODO 自动生成的方法存根ArrayList<People> list = new ArrayList<>();list.add(new People(15,"张三"));list.add(new People(14,"李四"));list.add(new People(20,"王五"));list.add(new People(17,"赵六"));Collections.sort(list,new Comparator<People>() {@Overridepublic int compare(People o1, People o2) {if(o1.age > o2.age)return -1;if(o1.age < o2.age)return 1;return 0;}});for(int i = 0; i < list.size();i++) {System.out.println(list.get(i).name + ":" + list.get(i).age);}
}//输出
王五:20
赵六:17
张三:15
李四:14

方法二:在People类中实现Comparable接口

public class People implements Comparable<People>{int age;String name;People(int age,String name){this.age = age;this.name = name;}public int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}public boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;People other = (People) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic int compareTo(People o) {// TODO 自动生成的方法存根if(this.age > o.age)return 1;if(this.age < o.age)return -1;return 0;}
}
public static void main(String[] args) {Set<People> set = new TreeSet<>();set.add(new People(15,"张三"));set.add(new People(14,"李四"));set.add(new People(20,"王五"));set.add(new People(17,"赵六"));for(People p : set)System.out.println(p.name + ":" + p.age);
}
//输出
李四:14
张三:15
赵六:17
王五:20

二、Map接口

该集合是存储键值对的,确保键的唯一性。综合考虑了数组查找快和链表增删快的优点。

put(Object key,Object value);//向map中放入一个值
Object get(Object key);//根据键找值
boolean containsKey(Object key);//判断Map中是否有值为key的键
remove(Object key);//删除键值为key的键值对
int size();//得到键值对的个数

1、HashMap类

  • 底层是哈希表数据结构
  • 可以存入null键和null值,但最多允许一个键为null,多个值为null
  • 线程不同步,但是效率高
  • 如果想要线程同步,可以考虑使用ConcurrentHashMap

2、 HashTable类

  • 底层是哈希表数据结构
  • 不允许键或者值为null
  • 支持线程同步,效率没有HashTable高

3、 TreeMap

  • 底层二叉树数据结构
  • 线程不同步
  • 可以对map集合进行排序,可以自己指定比较器,与TreeSet相似

三、Java中Collection集合常见的面试题

1、ArrayList与LinkedList的区别

2、ArrayList与Vector的区别

3、HashMap与HashTable的区别

4、HashMap与ConcurrentHashMap以及HashTable的区别

5、HashSet如何检查元素的重复

7、有关Comparator接口与Comparator接口的区别(在TreeSet与TreeMap中可能会用到)

8、ConcurrentHashMap线程安全的具体实现方式

Java集合类框架总结相关推荐

  1. Java集合类框架源码分析 之 LinkedList源码解析 【4】

    上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...

  2. 夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  3. Java集合类框架的基本接口有哪些?

    总共有两大接口:Collection 和Map ,一个元素集合,一个是键值对集合: 其中List和Set接口继承了Collection接口,一个是有序元素集合,一个是无序元素集合: 而ArrayLis ...

  4. c++ map的存储结构_「软帝学院」java集合类框架map及相关常见问题二

    Map接口 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图. Collection中的集合,元素是孤立存在的(理解为单身),向集合中存 ...

  5. java 面试 框架_这份java集合框架面试题,轻松搞定面试官!

    集合框架 1. ArrayList 和 Vector 的区别. 这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集 合,即存储在这两个集合中的元素的位 ...

  6. 传递集合对象_面试必备——Java集合框架

    Java集合框架面试题 常见集合 集合可以看作是一种容器,用来存储对象信息. 数组和集合的区别: (1)数组长度不可变化而且无法保存具有映射关系的数据:集合类用于保存数量不确定的数据,以及保存具有映射 ...

  7. collection集合 多少钱_面试必备-Java集合框架

    Java集合框架面试题 常见集合 集合可以看作是一种容器,用来存储对象信息. 数组和集合的区别: (1)数组长度不可变化而且无法保存具有映射关系的数据:集合类用于保存数量不确定的数据,以及保存具有映射 ...

  8. java集合框架源代码_面试必备——Java集合框架

    Java集合框架面试题 常见集合 集合可以看作是一种容器,用来存储对象信息. 数组和集合的区别: (1)数组长度不可变化而且无法保存具有映射关系的数据:集合类用于保存数量不确定的数据,以及保存具有映射 ...

  9. 面试必备-Java集合框架

    Java集合框架面试题 常见集合 集合可以看作是一种容器,用来存储对象信息. 数组和集合的区别: (1)数组长度不可变化而且无法保存具有映射关系的数据:集合类用于保存数量不确定的数据,以及保存具有映射 ...

最新文章

  1. HDU6964 I love counting (字典树+莫队)
  2. 骑士旅行pascal解题程序
  3. oracle exp导出成功终止,成功终止导出
  4. 服务器cpu,内存正常, 部分网站打不开,提示死锁,应用程序池回收就正常,如何解决?...
  5. RabbitMQ快速入门--消息模型介绍
  6. c++大文本比较_Excel – 将文本转换为数值,第二种方法会的请举左手
  7. mvc 事务层切换数据源_Mvc 与 Flux 与 Redux的一些思考
  8. 小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...
  9. 业务 T+1 T+2
  10. RS-232 vs. TTL Serial Communication(转载)
  11. 木马编程DIY (Delphi版) - 第2篇 单实例运行
  12. 《图解算法》学习笔记之递归
  13. python自动下载酷狗音乐_python获取酷狗音乐top500的下载地址 MP3格式
  14. 匈牙利算法及KM算法详解
  15. LTE手机接收灵敏度究竟如何?
  16. 水星路由器怎么设置虚拟服务器,水星路由器怎么设置图解教程
  17. vue简单购物车结算计算总价
  18. UE4蓝图(很经典) 间隔1秒就执行一次,间隔循环执行
  19. Load Balancer as a Service (LBaaS V2.0)
  20. Python爬虫实战—2345影视获取经典电影信息

热门文章

  1. b站黑马Vue2后台管理项目笔记——(1)登录功能
  2. 稿定设计怎么去除水印?
  3. shp数据中文乱码的一种恢复方法
  4. 2018-09-11-二手车交易平台系统
  5. Win7搜索之体验!
  6. Win10 系统 C 盘飘红,6 招瞬间腾出十几 GB 空间
  7. H5 直播的疯狂点赞动画是如何实现的?(附完整源码)
  8. element表格左对齐方法
  9. 机器学习实战 决策树(附数据集)
  10. 简单js模仿浏览器crtl+f功能