记录我的java之路——day12(周更)

day12-集合框架(上)

  • 集合入门

  • Collection接口

  • List

  • Set

  • Map

集合入门

集合(Conllection),集合即一种容器,是数据结构在Java应用中的 一种体现,早在jdk1.0的版本中就存在一些集合相关类:Stack,Properties,Vector,Dictionary;但是由于上述结构均为类,不利于扩展,并且无统一标准;因此,在JDK1.2之后Java就引入了集合框架,其中包括Collection,List,Set,Deque(JDK1.6),Map等接口.

Collection

Collection是集合框架的顶层接口,大多数的集合类,接口都是直接或者间接从Collection继承或者实现

List接口

List接口直接从Collection接口继承而来,List集合是一个有序集合(元素在集合中的存储顺序是有序的,获取的时候根据存储的位置获取),List允许重复元素,List接口包含三个比较常用的实现类:ArrayList、LinkedList、Vector(jdk1.0)

public static void main(String[] args) {
        
        List list = new ArrayList();
//      List list = new LinkedList();
//      List list = new Vector();
        
        list.add(new String("abc"));
        list.add("hello");
        list.add(123);
        list.add(new User());
        //向指定的索引处插入元素
        list.add(1, true);
        //替换指定 索引出的元素
        list.set(1, true);
        
        //移除指定索引处的元素,并返回该被移除的元素对象
//      Object obj = list.remove(1);
//      boolean  result = list.remove(new String("abc"));
//      System.out.println(result);
        
        
        List list2 = new ArrayList();
        list2.add(123);
        list2.add("hello");
        
        //从当前集合中删除子集
        boolean result = list.removeAll(list2);
        System.out.println(result);
        System.out.println(list);
        
        //向当前集合添加子集合
        list.addAll(list2);
        
        System.out.println(list);
    }

ArrayList,LinkedList,Vector区别?

ArrayList基于可变长度的数组实现,内部通过数组拷贝原理实现容量扩展,ArrayList每次扩展为源数组的一半,ArrayList进行元素查询时相对LinkedList快(每个元素都有一个索引,可以直接根据索引获取元素),ArrayList是线程不同步的实现(效率高,不安全)

LinkedList基于链表的实现,内部元素之间通过首尾指针关联,在进行元素修改时(比如新增元素),相对ArrayList会更方便(只需要修改元素的首尾指针指向即可),但是在进行查询时链表的查询效率是低于数组的

Vector基于可变长度的数组实现,Vector每次扩展为原来长度的一倍(ArrayList是一半),Vector是线程同步的实现(效率低,安全)

Set集合

Set集合也是从Collection接口继承而来,set集合是一个无序集合(存储顺序与元素的添加顺序无关),set集合不允许出现重复元素(重复元素会覆盖第一次出现的元素),不允许存在e1.equals(e2)的情况(针对HashSet的实现),set集合中的元素无法通过索引获取;Set集合有两个常用的实现类:HashSet、TreeSet

基于HashSet的实现

public static void main(String[] args) {
        
        Set set = new HashSet();
        set.add("hello");
        set.add("rose");
        set.add("jack");
        set.add("admin");
        set.add("true");
        set.add("admin");
​
//      for (Object o : set) {
//          System.out.println(o);
//      }
        Iterator it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }

基于TreeSet的实现

首先被作为元素的对象必须实现Comparable接口并实现接口中的compareTo方法

public class Student implements Comparable<Student>{
​
    private int age;
    
    public Student(int age) {
        this.age = age;
    }
    //实现对比方法
    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
​
    @Override
    public String toString() {
        return "Student [age=" + age + "]";
    }
​
}

测试类:

public class TreeSetDemo {
​
    public static void main(String[] args) {
        Set set = new TreeSet();
//      set.add(10);
//      set.add(20);
        set.add(new Student(28));
        set.add(new Student(16));
        set.add(new Student(18));
        set.add(new Student(18));
//      set.add(new String("hello"));//ClassCastException
        System.out.println(set);
​
    }
​
}

HashSet和TreeSet区别?

HashSet元素添加到集合中之后,元素的存储顺序,基于散列算法(计算获取对象在内存中的唯一地址)实现的元素排序,HashSet是线程不同步的实现;

TreeSet基于二叉树中红黑树算法实现,TreeSet内部的元素存储顺序跟元素实现的Comparable接口中compareTo方法有关,所以TreeSet要求所有元素所对应的类必须实现Comparable接口(TreeSet要求内部存储的元素必须是相同的数据类型),TreeSet也是线程不同步的实现;

Map集合

Map集合是一种键值对结构,不同与List与Set;Map集合中的元素通常由key-value构成,一个键可以指向一个值,但是键不允许重复,但是值可以,Map集合的出现是为了取代老式的Dictionary类,Map集合常用的两个实现类:HashMap,TreeMap

public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("一号", 100);
        map.put("二号", 100);
        map.put("三号", 80);
        map.put("四号", 70);
        map.put("五号", 60);
        
        System.out.println(map);
        //获取map集合中的所有键集
        Set<String> keys = map.keySet();
        //获取map集合的值集
        Collection<Integer> c = map.values();
        
        for(String k:keys){
            //根据键获取值
            int i = map.get(k);
            System.out.println(k+":"+i);
        }
    }

HashMap、TreeMap、Hashtable,ConcurrentHashMap的区别

HashMap基于散列表实现的Map(jdk1.2)接口,内部的元素存储顺序根据元素中键的Hash值排序,每个元素都存在一个独一无二的hash地址,所以不允许出现重复的键,允许空键值,此实现是线程不同步的。

TreeMap基于红黑树的实现,内的元素存储顺序默认按照元素的自然顺序排序,或者根据给定的比较器(Comparator)进行排序,集合中键必须是同一种数据类型,键对应的类型必须实现Comparable接口,并实现比较的方法(compareTo(T t))

Hashtable基于散列表的从老式Dictionary(jdk1.0)类继承,Hashtable不允许空键值存在,Hashtable是线程安全的实现(线程同步)

哈希算法:

完成一个通讯录需求:1.添加联系人(联系人:编号,姓名,电话,QQ)2.联系人查询(输入姓名或电话查询)3.显示联系人列表(要求按照姓名拼音字典顺序排序:中文排序)4.根据编号删除指定联系人

Jsoup 爬虫插件

猜你喜欢

转载自blog.csdn.net/qq_34304871/article/details/81274751