集合

JAVA(集合)

一,集合框架

集合:容器,存放数据的一个容器

 

使用集合目的:更方便得存储和操作数据。CRUD(增删改查)

 

二,集合继承结构

  • Collection<E>:存放单值最大父接口

    List<>(E)(列表)线性表,可以动态增长,查找效率高,插入删除效率低

    set<E> 也是线性表,检索元素效率高,插入删除效率高,插入删除涉及元素移位

  • Map<K , V>:存放对值得最大父接口

    Map<K,V> 用户保存具有映射关系的数据,Map保存两组数据,key和value,key和value可以是任意数据类型,key不能重复

 

三,List

初始化尽量指定初始化容量,不确定,默认16

使用泛型,数据类型,尽量使用数据类型

 

数组转List

int a[] = new int[]{1};
List<int[]> ints = Arrays.asList(a);//存放的是一个数组放到List第一位
System.out.println(ints.get(0)[0]);//List第一个是数组,在获取数组的值

 

LinkedList<String> list = new LinkedList<String>();

 

 

 

//我们创建的是多态
//只能用父类和子类都有的方法

//Collection和Map的区别
//存储单值,  存储 值对的

//ArrayList和LinkedList的区别

//ArrayList 和Vector的区别、
// 线程异步,不安全   线程同步,安全,有sychronized
// 效率高    效率低

 

三,Set

Collection接口

List和set的区别

list:有顺序,元素可以重复,添加的先后顺序

set:无顺序,元素不可以重复,添加的先后顺序(添加一样的,new 引用数据类型)

  set的无序不是随机,无序是没有按照添加顺序排序,但内部有自己的排序算法

  如何保证数据不能重复,重写equals方法和hashCode方法

 

treeset

排序规则

  要排序的对象的类必须实现Comparable接口

 

LinkedHashSet

添加数据的同时,会维护数据的添加顺序,效率比HsahSet略低

 

比较接口

Comparable接口:自然排序,排序规则固定

Comparator接口:临时排序

 

四,Map

1.存储对值 K - V  key - value

2.key不能重复,value可以重复

3.没有顺序(添加的先后顺序)

 

HashMap内部存储结构

JDK1.7之前:链表 + 二叉树

JDK1.7之后:链表 + 数组 + 红黑树

 

Hashtable和HashMap区别

Hashtable有sychronized

 HashMap线程异步,不安全;Hashtable线程同步,安全

HashMap的key可以为null;Hashtable不可以为null

结构区别:HashMap是由数组+链表形成,在JDK1.8之后链表长度大于8时转化为红黑树;而HashTable一直都是数组+链表;

继承关系:HashTable继承自Dictionary类;而HashMap继承自AbstractMap类;

 

LinkedHashMap,内部加了链表

 

Properties

属性,Hashtable的子类  ,更多的是来操作属性文件

(db.properties) 

 

五,集合的遍历

list

 List<Integer> list = new ArrayList(16);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);

        // for循环
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

        //foreach
        for (Object o : list) {
            System.out.println(o);
        }

        //迭代器(接口)
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            Integer next = iterator.next();
            System.out.println(next);
        }

 

 set

        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(1);
        set.add(30);
        set.add(15);
        set.add(40);

        //foreach
        for (Integer integer : set) {
            System.out.println(integer);
        }

        //迭代器
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

 

 map

 

        Map<String,String> map = new HashMap();
        map.put("1","1");
        map.put("2","2");
        map.put("3","3");
        map.put("1","1");
//        System.out.println(map);
//        System.out.println(map.get("3"));
//        System.out.println(map.keySet());
//        System.out.println(map.values());

        //foreach
        Set<String> strings = map.keySet();
        for (String string : strings) {
            System.out.println(strings);
        }

        //Entry是hashMap的一个内部类
        //每一组键值对都是一个Entry
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }

 

六,HashSet,TreeSet和LinkSet的区别

1.SET接口

set不允许包含相同的元素,如果把两个相同的元素加入同一个集合中,add方法返回false

set判断两个对象相同不是用 == 运算符,而是用equals方法,也就是两个对象用equals方法比较返回true,set就不会就受这两个对象

2.HashSet

  • 不能保证元素的排列顺序,顺序可能发生变化
  • 不是同步的,集合元素可以是null

当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode方法来得到该对象的hashCode值,然后根据hashCode值来决定该对象在HashSet中存储位置。

HashSet集合判断两个元素想的标准时两个对象通过equals方法比较相等,并且两个对象的hashCode方法返回值相同

3.LinkHashSet

LinkHashSet与HashSet的不同在于,LinkHashSet维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序

LinkHashSet集合同样是根据元素的hashCode值来决定元素的存储位置

4.TreeSet

TreeSet是SortSet接口的唯一实现类,TreeSet可以确保集合的元素处于排序状态

TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式,向TreeSet中加入的应是同一个类的对象

TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或通过CompareTo方法比较返回有没有0

5.线程安全

Set三个实现类HashSet,TreeSet,EnumSet都是线程不安全的

 

七,HashMap,LinkHashMap和TreeMap的区别

map主要存储键值对,根据键得到值,因此不允许键的重复,但允许值重复

1.HashMap

HashMap是一个常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取他的值,具有很快的访问速度,遍历时,获取数据的顺序完全是随机的

HashMap最多只允许一条记录的键为null,允许多条记录的值为null

HashMap不支持线程的同步(非线程安全),即任一时刻可以有多条线程同时写HashMap,可能会导致数据的不一致

同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

在Map中插入,删除和定位,HashMap是最好的选择

2.Hashtable

Hashtable与HashMap类似,它不允许记录的键或者值为空

支持线程同步(线程安全),任一时刻只有线程能写Hashtable,导致Hashtable写入比较慢

3.LinkHashMap

LinkHashMap是HashMap的一个子类

LinkHashMap保存了记录的插入顺序,在用Iterator遍历LinkHashMap时,先得到的记录肯定是先插入的

在遍历的时候回比HashMao慢,但当HashMao容量很大时,实际数据少,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

4.TreeMap

TreeMap实现SortMap接口,能够把保存的记录根据键排序,默认是按键值的升序排序

TreeMap取出来的是排序后的键值对

TreeMap基于红黑树实现,TreeMap没有调优,因为该树总处于平衡状态

非线程安全

5.总结

HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只是Set用的是Map的key

Map的key和Set都有一个共同特性就是集合的唯一性,TreeMap多了一个排序的功能

hashCode和equals,HashMap因为无需排序,只需要关注定位和唯一性

  hashCode是用来计算hash值,hash值是用来确定hash表索引的

  hash表中的一个索引处存放的是一张链表,通过equals方法循环比较链表上每一个每一个对象才能定位到键值对应的Entry

  put时,如果hash表中没定位到,就在链表前加一个Entry;如果定位到了,则更换Entry中的value,并返回旧value。

  Collection没有get方法获取某个元素,只能通过iterator遍历元素

 

posted @ 2022-08-06 21:17  一只神秘的猫  阅读(46)  评论(0)    收藏  举报