Java编程思想读书笔记(11)

第11章 持有对象

Java有多种方式保存对象(对象的引用)。Java类库中提供了一套相当完整的容器类来解决问题,称为集合类。Java容器类都可以自动地调整自己的尺寸。

11.1泛型和类型安全的容器

使用Java泛型来创建类会非常复杂,所以通常用预定义的泛型(如:ArrayList<Apple> apples=new ArrayList<Apple>())。

练习1:创建一个新类Gerbil,包含int gerbilNumber,在构造器中初始化它。添加一个新方法hop(),用以打印号码和它正在跳跃的信息。创建一个ArrayList,并向其中添加一串Gerbil对象。使用get()遍历List,并且对每个Gerbil调用hop()。

import java.util.ArrayList;
//P218练习一
public class Gerbil {
    int gerbilNumber;
    public Gerbil(int gerbilNumber) {
    	this.gerbilNumber=gerbilNumber;
    }
    public void hop() {
    	System.out.println(gerbilNumber+"正在跳跃!");
    }
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		ArrayList<Gerbil> gerbillist=new ArrayList<Gerbil>();
		for(int i=1;i<11;i++) {
			Gerbil gerbil=new Gerbil(i);
			gerbillist.add(gerbil);
		}
		for(int i=0;i<10;i++) {
			gerbillist.get(i).hop();;
			
		}

	}

}

结果如下:


11.2基本概念

Java容器类类库的作用是保存对象,并将其划分为两个不同的概念。

1)Collection。一个独立元素的序列。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队顺序来确定对象产生的顺序。

2)Map。一组成对的“键值对”对象,允许用键值查找对象。关于容器类的简介参考自:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%AE%B9%E5%99%A8.md

 1. Set

  • HashSet:基于哈希实现,支持快速查找,但不支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。
  • TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN);
  • LinkedHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序。

2. List

  • ArrayList:基于动态数组实现,支持随机访问;查找快。插入删除慢。
  • Vector:和 ArrayList 类似,但它是线程安全的;查找慢,插入删除快。
  • LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。

3. Queue

  • LinkedList:可以用它来支持双向队列;
  • PriorityQueue:基于堆结构实现,可以用它来实现优先队列。

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

11.3添加一组元素,11.4容器的打印省略

11.5List

List可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。

  • ArrayList
  • LinkedList

List允许在创建后添加和移除元素。

方法:

  • contains():确定某个对象是否在列表中。
  • remove():如果想移除某个对象,就可以将这个对象的引用传递给remove()。
  • indexOf():如果有一个对象的引用,可以用indexOf()来发现该对象在List中所处位置的索引编号。
  • subList():从较大的一个列表中创建出一个片段。参数为起始索引和结束索引。
  • removeALL():移除所有特定的类。
  • set(index,Object):替换索引位置的对象。
  • addALL():添加列表。
  • isEmpty():判断列表是否为空。
  • toArray():转换为对象数组。

11.6迭代器

Iterator:

  1. 使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
  2. 使用next()获得序列中的下一个元素。
  3. 使用hasNext()检查序列中是否还有元素。
  4. 使用remove()将迭代器新近返回的元素删除。

11.7LinkedList

添加了可以将其用作栈、队列和双端队列的方法。

方法:

  • getFirst(),element():返回列表的头,并不移除它。如果List为空,则抛出NoSuchElementException。peek()在列表为空时返回null。
  • removeFirst(),remove():移除并返回列表的头,列表为空时抛出NoSuchElementException。poll()在列表为空时返回null。
  • addFirst(),add(),addLast():将某个元素插入到列表的尾部。
  • removeLast():移除并返回列表的最后一个元素。

11.8Stack

方法:

  • push(T v):元素入栈。
  • peek():返回栈顶元素并不移除。
  • pop():元素出栈。

11.9Set

11.10Map

方法:

  • get():通过键值得到value。
  • containsKey():判断是否含有键值。
  • containsValue():判断是否含有某个值。

11.11Queue

LinkedList可以作为Queue的一种实现。

方法:

  • offer():允许的情况下,将一个元素插入队尾。
  • peek(),element():在不移除的情况下返回队头。队伍为空element()抛出NoSuchElementException,peek()返回null。
  • poll(),remove():移除返回队头。队伍为空remove()抛出NoSuchElementException,poll()返回null。

11.11.1PriorityQueue

调用offer()方法来插入对象时,这个对象在队列中会被排序。可通过设定自己的Comparator来修改排序规则。PriorityQueue可以确保当你调用peek()、poll()、remove()方法时,获取的是队列中优先级最高的元素。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值