本文共 4489 字,大约阅读时间需要 14 分钟。
java集合框架最精简最齐全总结
一、集合框架主要类结构
1、类介绍
List接口:ArrayList 、Voctor、LinkedList (同时实现Queue接口)
Set接口:HashSet、LinkedHashSet、TreeSet
Map接口:HashMap、HashTable、TreeMap、LinkedHashMap
2、迭代器
Iterator接口,用于遍历集合元素的接口,ListIterator接口,专门用来list遍历,可以实现集合修改。
Set和List可以通过Iterator方法返回迭代器,操作集合,Map可以通过keys.iterator()来操作。
3、 工具
Collections、Arrays
二、List集合介绍
1、特点介绍
ArrayList (基础容量10,扩容系数1.5倍)
优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程不安全,效率高Vector (基础容量10,扩容系数2倍)
优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程安全,效率低LinkedList (基础容量无,扩容系数无)
优点: 底层数据结构是双向链表,查询慢,增删快。缺点: 线程不安全,效率高2、主要Api
增:add(element) 、addAll(Collection)
删:remove(index)、remove(Collection)
改:set(index)
查: get(index)、size()、indexOf(element)、
判断:isEmpty、contains(Collection)
3、使用规则
线程安全使用Vector ,查询多:ArrayList、增删多:LinkedList。
三、Set集合介绍
1、基本特性
HashSet
底层数据结构是哈希表。(无序,唯一) 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals()LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一) 1.由链表保证元素有序 2.由哈希表保证元素唯一TreeSet
底层数据结构是红黑树。(唯一,有序) 1. 如何保证元素排序的呢? 自然排序 比较器排序 2.如何保证元素唯一性的呢? 根据比较的返回值是否是0来决定2、APi:省略
3、使用规则
需要保持插入顺序用linkedHashset,需要排序TreeSet,一般用Hashset
4、HashSet如何检查重复
当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。
hashCode()与equals()的相关规定:
1)、如果两个对象相等,则hashcode一定也是相同的。
2)、两个对象相等,equals方法返回true
3)、两个对象有相同的hashcode值,它们也不一定是相等的。
4)、equals方法被覆盖过,则hashCode方法也必须被覆盖 (由于hashmap实现方式是先判断hashCode,如果equals被覆盖,那么hashCode判断规则相同,equesls可能不同)
5、TreeSet使用规则
1). 往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。
2). 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口, 把元素的比较规则定义在compareTo(T o)方法上。 3). 如果比较元素的时候,compareTo方法返回 的是0,那么该元素就被视为重复元素,不允许添加. <<<<<<<<<<<<(注意:TreeSet与HashCode、equals方法是没有任何关系。)>>>>>>>>>>>>>>>> 4). 往TreeSet添加元素的时候, 如果元素本身没有具备自然顺序 的特性,而元素所属的类也没有实现Comparable接口, 那么必须要在创建TreeSet的时候传入一个比较器。否则报错!! 5). 往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口, 在创建TreeSet对象的时候也传入了比较器那么是以比较器的比较规则优先使用。@Test public void test1(){ TreeSetset = new TreeSet<>(new Comparator () { @Override public int compare(Student o1, Student o2) { return o1.id - o2.id; } }); Student a = new Student(1,"0号"); set.add(new Student(1,"1号")); set.add(new Student(2,"2号")); set.add(new Student(3,"3号")); set.add(new Student(3,"4号")); for (Student student : set) { System.out.println(student.toString()); } System.out.println(set.contains(a)); //contains依赖的也是compareTo或compare方法 } class Student /*implements Comparable */{ //方式1:让对象的类拥有可比性,实现comparable的compareTo private int id ; private String name; public Student(int id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } /* public int compareTo(Student o) { return this.id - o.id;; }*/ }
四、map集合介绍
1、基本特性
2、api操作:略
3、map迭代的几个方式
public void test2(){ Mapmap = new HashMap (); map.put("1", "value1"); map.put("2", "value2"); map.put("3", "value3"); Set keys = map.keySet(); Iterator it = keys.iterator(); while(it.hasNext()){ String key = it.next(); System.out.println("键:"+ key+" 值:"+ map.get(key)); } for (Entry me : map.entrySet()) { System.out.println("键:"+ me.getKey()+" 值:"+ me.getValue()); } }
五、工具使用
/**
* 1、Collections的基本使用 */@Test public void test1() { List/** * 2、Arrays集合变数组,数组变集合 */list = new ArrayList<>(); list.add(1); list.add(2); Collections.sort(list); //自然排序 Collections.sort(list,(o1,o2)->{ // 比较器 return o2-o1; }); Collections.max(list); // 最大元素 int index = Collections.binarySearch(list,1);//二分查找,返回角标。 Collections.reverseOrder();//逆向反转排序。 Collections.shuffle(list);//随机洗牌 }
@Test public void test2() { Listlist= new ArrayList<>(); list.add(1); list.add(2); Integer[] array = list.toArray(new Integer[list.size()]); System.out.println(array); List list2 = Arrays.asList(array); System.out.println(list2); }
转载地址:http://jeuni.baihongyu.com/