第11章 持有对象

首先想说持有这词用的真好

基础知识

图1

  • 图描述:图中只有四种容器:Map , ListSetQueue . 常用的容器用黑色的粗线框表示。(点线框表示接口,实线框表示普通的(具体的)类。带有空闲箭头的电线表示一个特定的类实现了一个接口,实心箭头表示可以生成箭头所指向类的对象。)

  • java有多种方式保存对象,更确切的说是对象的引用

  • java容器类可以划分为两个不同的概念: Collection: 一个独立的序列 (所有的Collection,都可以用foreach) Map: 一组成对的键值对对象
  • 常用的有4类容器:set map list queue
    • list必须按照插入的顺序保存元素
    • set不能有重复的元素
    • queue按照排队的规则来确定对象的产生顺序(通常与插入的顺序相同)
  • @Suppress warnings('unchecked')可以压制警告信息
  • 向上转型也可以像其他类型一样作用于泛型(其实子类可以存放进具有父类约束的容器中):
class GrannySmith extends Apple {}
class Gala extends Apple {}
class Fuji extends Apple {}
class Braeburn extends Apple {}

public class GenericsAndUpcasting {
  public static void main(String[] args) {
    ArrayList<Apple> apples = new ArrayList<Apple>();
    apples.add(new GrannySmith());
    apples.add(new Gala());
    apples.add(new Fuji());
    apples.add(new Braeburn());
    for(Apple c : apples)
      System.out.println(c);
  }
} 
  • 向容器中添加一组元素:
Collection<Integer> collection =
      new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5));
Integer[] moreInts = { 6, 7, 8, 9, 10 };
collection.addAll(Arrays.asList(moreInts));
// Runs significantly faster, but you can't construct a Collection this way:
    Collections.addAll(collection, 11, 12, 13, 14, 15);
    Collections.addAll(collection, moreInts);

注意:Arrays.asList(*)其底层表示的还是数组,因此不能调整尺寸

List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);
list.set(1, 99); // OK -- modify an element
// list.add(21); // Runtime error because the
                     // underlying array cannot be resized.
  • Collection的打印风格:[rat, cat, dog, dog]
  • Map的打印风格:{dog=Spot, cat=Rags, rat=Fuzzy}
  • ArrayList和LinkedList都是list类型,它们都可以保存元素的顺序,只是在某些操作上的性能不同
  • 注意:对于内置对象,java负责编写了equals方法,但是自己编写的类,却没有
  • -

set

  • set对于每个值都只保存一个对象
  • HashSet使用最复杂的技术保存对象,但是能够最快的获取元素,但不能保持顺序。TreeSet按照比较的结果升序保存对象。LinkedHashSet按照添加的顺序保存对象,同时保存了HashSet的查找速度
  • set不保存重复的元素
  • TreeSet将元素存储在红-黑树的数据结构中,二HashSet使用的是散列函数。LinkedHashList因为查询速度的原因也使用了散列。

map

  • map也有HashMap, TreeMap, LinkedHashMap,性质同Set.
  • -

list

  • 有两种基本类型:
    • ArrayList: 擅长于随机访问,插入和删除操作较慢
    • LinkedList:擅长插入和删除,随机访问相对较慢

Queue

  • 队列在并发任务中非常的重要
  • LinkedList 提供了方法以支持队列的行为,并且它也实现了 Queue 接口.
    • offer() 将一个元素插入到队列尾,或者返回 false
    • peek() 和 element() 都在不移除的情况下返回队头, 但是peek()方法在队列为空时,返回null element() 会抛出NoSuchElementException异常
    • poll() 和 remove() 方法将移除并返回队头, 在队列为空的时候,poll会返回null, remove会抛出NoSuchElementException异常
  • PriorityQueue
    • 当时用 offer() 插入一个对象的时候,这个对象会在队列中被排序。默认的排序是使用对象在队列中的 自然顺序,但是可以通过Comparator来修改这个顺序。
    • -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值