博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础review(2)---java集合框架最精简最齐全总结
阅读量:4075 次
发布时间:2019-05-25

本文共 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(){		TreeSet
set = 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、基本特性

  • TreeMap:基于红黑树实现。
  • HashMap:基于哈希表(哈希表(数组+链表)----jdk8为(数组+链表+红黑树))实现。 (初始容量16,扩容32)
  • HashTable:和 HashMap 类似,但它是线程安全的,这意味着同一时刻多个线程可以同时写入 HashTable 并且不会导致数据不一致。它是遗留类,不应该去使用它。现在可以使用 ConcurrentHashMap 来支持线程安全,并且 ConcurrentHashMap 的效率会更高,因为 ConcurrentHashMap 引入了分段锁。
  • LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序

2、api操作:略

 

3、map迭代的几个方式

public void test2(){		Map
map = 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
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);//随机洗牌    }

    /**
     * 2、Arrays集合变数组,数组变集合
     */

    @Test    public void test2() {        List
list=  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/

你可能感兴趣的文章
my ReadMap subway / metro / map / ditie / gaotie / traffic / jiaotong
查看>>
OS + Linux DNS Server Bind
查看>>
linux下安装django
查看>>
Android 解决TextView设置文本和富文本SpannableString自动换行留空白问题
查看>>
Android开发中Button按钮绑定监听器的方式完全解析
查看>>
Android自定义View实现商品评价星星评分控件
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
postgresql查看表的和索引的情况,判断是否膨胀
查看>>
postgresql中根据oid和filenode去找表的物理文件的位置
查看>>
postgresql减少wal日志生成量的方法
查看>>
swift中单例的创建及销毁
查看>>
获取App Store中App的ipa包
查看>>
iOS 关于pods-frameworks.sh:permission denied报错的解决
查看>>
设置RGBColor
查看>>
设置tabbaritem的title的颜色及按钮图片
查看>>
动态设置label的高度
查看>>
获取 一个文件 在沙盒Library/Caches/ 目录下的路径
查看>>
图片压缩
查看>>
检测缓存文件是否超时
查看>>
十进制字符串转十六进制字符串
查看>>