《Thinking in Java》读书笔记——第11章 持有对象

一.基本概念

java集合类类库的用途是“保存对象”,并将其划分为两个不同的概念

  • Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
  1. ArrayList和LinkedList都是List类型,它们都按照被插入的顺序保存元素,两者的不同之处不仅在于执行某些类型的操作时的性能,而且LinkedList包含的操作也多于ArrayList。
  2. HashSet、TreeSet和LinkedHashSet都是Set类型,HashSet存储是无序的,但是是很快的获取元素方式;TreeSet按照比较结果的升序保存对象;LinkedHashSet按照被添加的顺序保存对象。
  • Map。一组成对的“键值对”对象,允许你使用键来查找值。ArraList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起,映射表允许我们使用另一个对象来查找某个对象,它也被成为“关联数组”,因此它将某些对象与另外一些对象关联在了一起;或者成为“字典”,因此你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是去哪搞大的编程工具。
  1. Map(也被成为关联数组)可以用键来查找对象,就像一个简单的数据库。Map可以自动调整尺寸,HashMap没有明显的顺序来保存元素,但是提供最快的查找技术,TreeMap按照比较结果的升序保存键,LinkedHashMap按照插入顺序保存键,并且保留了HashMap的查找速度。
    集合

二.List

1.ArrayList常用api:

  • contains()来确定某个对象是否在列表中;containsAll()来判断是否包含指定集合中的所有元素,显然,顺序是不重要的(contains()底层基于indexOf()判断,indexOf()基于equals())。
public boolean contains(Object o) {
    
    
        return indexOf(o) >= 0;
    }
 public int indexOf(Object o) {
    
    
     if (o == null) {
    
    
         for (int i = 0; i < size; i++)
             if (elementData[i]==null)
                 return i;
     } else {
    
    
         for (int i = 0; i < size; i++)
             if (o.equals(elementData[i]))
                 return i;
     }
     return -1;
 }
public class Test01 {
    
    
    @Test
    public void main () {
    
    
        List<Integer> list1 = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
    
    
            list1.add(i);
        }
        List<Integer> list2 = new ArrayList<Integer>();
        list2.add(5);
        list2.add(3);
        list2.add(4);
        boolean contains = list1.containsAll(list2);
        System.out.println(contains);
    }
}
输出:true。
  • remove()可以通过对象的引用或者索引编号来删除该对象(底层基于equals())。
  • subList()方法允许你从较大的列表中创建一个片段。
  • retainAll()方法保留同时存在于两个集合(集合类型不需要相同)中的元素(基于contains()方法判断,contains()方法基于equals()):
public class Test01 {
    
    
    @Test
    public void main () {
    
    
        List<Integer> list1 = new ArrayList<Integer>();
        for (int i = 0; i < 10; i++) {
    
    
            list1.add(i);
        }
        List<Integer> list2 = new ArrayList<Integer>();
        for (int i = 5; i < 15; i++) {
    
    
            list2.add(i);
        }
        Set<Integer> set = new HashSet<Integer>();
        set.add(8);
        set.add(5);
        set.add(12);
        list1.retainAll(list2);
        System.out.println("List1为:"+list1);
        System.out.println("List2为:"+list2);
        list2.retainAll(set);
        System.out.println("List2为:"+ list2);
    }
}

输出

2.LinkedList常用api:

  • LinkedList还添加了可以使其用作栈,队列,或双端队列的方法:
    getFirst()、addFirst()、removeFirst()等。
  • peek()返回第一个元素,没有则返回null。
  • poll()返回并删除第一个元素,没有则返回null。

3.Stack

  • pop()移除并保留栈顶元素。peek()取栈顶元素。
  • push() 入栈操作。

4.Queue

  • LinkedLIst提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。
  • offer()方法将一个元素插入队尾,或者返回false。
  • peek()和element()在不移除元素的情况下返回队头,队列为空时分别返回null和NoSuchElementException。
  • poll()和remove()移除并返回第一个元素,队列为空时分别返回null和NoSuchElementException。

三.Set

  1. Set不存在重复元素,查找是Set中最重要的操作,因此通常会选择HashSet实现,而HashSet底层实际是new了一个HashMap。。
public HashSet() {
    
    
        map = new HashMap<>();
    }
其他构造函数有关初始容量(initialCapacity)和装载因子(loadFactor)的内容以后再谈。
  1. TreeSet可以对元素进行排序,元素需要重写compareTo()方法或者实现Comparable接口,或者在初始化对象的时候传入Comparator比较器。TreeSet底层实际是new了一个TreeMap
public TreeSet(Comparator<? super E> comparator) {
    
    
        this(new TreeMap<>(comparator));
    }
public TreeSet() {
    
    
        this(new TreeMap<E,Object>());
    }

猜你喜欢

转载自blog.csdn.net/weixin_48922154/article/details/112972563