集合的介绍(2)
Set
Set
是Java
中的集合类,是一个继承自Collection
接口,提供了一种无顺序,不重复的集合。常用的子类包括HashSet
, TreeSet
(不能填入null
)等。
package chapter06;
import java.util.ArrayList; import java.util.HashSet;
public class Collection_HashSet { public static void main(String[] args) {
HashSet set = new HashSet(); set.add("zhangsan"); set.add("zhangsan"); set.add("lisi"); set.add("wangwu");
for (Object o : set) { System.out.println(o); }
System.out.println(set);
HashSet set1 = new HashSet();
ArrayList list = new ArrayList(); list.add("zhangsan"); list.add("lisi"); list.add("wamngwu"); set1.addAll(list); System.out.println(set1); Object[] objects = set.toArray(); System.out.println(objects); System.out.println(set.isEmpty()); System.out.println(set.contains("zhangsan")); System.out.println(set.size()); Object clone = set.clone(); System.out.println(clone);
class User{ public int id; public String name;
@Override public int hashCode() { return id; }
@Override public boolean equals(Object obj) { if ( obj instanceof User ) { User otherUser = (User)obj; if ( otherUser.id == this.id && otherUser.name.equals(this.name) ) { return true; } return false; } else { return false; } }
@Override public String toString() { return "User["+id+", "+name+"]"; } }
HashSet set2 = new HashSet();
User user1 = new User(); user1.id = 1001; user1.name = "zhangsan"; System.out.println(user1.hashCode());
User user2 = new User(); user2.id = 1001; user2.name = "zhangsan"; System.out.println(user2.hashCode());
User user3 = new User(); user3.id = 1002; user3.name = "lisi";
set2.add(user1); set2.add(user2); set2.add(user3);
System.out.println(set2); } }
|
Queue
(队列)
- 队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是
java
的某些队列运行在任何地方插入删除;比如我们常用的 LinkedList
集合,它实现了Queue
接口,因此,我们可以理解为 LinkedList
就是一个队列;
阻塞和非阻塞
阻塞队列
- 入列(添加元素)时,如果元素数量超过队列总数,会进行等待(阻塞),待队列的中的元素出列后,元素数量未超过队列总数时,就会解除阻塞状态,进而可以继续入列;
- 出列(删除元素)时,如果队列为空的情况下,也会进行等待(阻塞),待队列有值的时候即会解除阻塞状态,进而继续出列;
- 阻塞队列的好处是可以防止队列容器溢出;只要满了就会进行阻塞等待;也就不存在溢出的情况;只要是阻塞队列,都是线程安全的;
非阻塞队列
- 不管出列还是入列,都不会进行阻塞,
- 入列时,如果元素数量超过队列总数,则会抛出异常,
- 出列时,如果队列为空,则取出空值;
一般情况下,非阻塞式队列使用的比较少,一般都用阻塞式的对象比较多;阻塞和非阻塞队列在使用上的最大区别就是阻塞队列提供了以下2个方法:
- 出队阻塞方法 : take()
- 入队阻塞方法 : put()
有界和无界
有界:有界限,大小长度受限制
无界:无限大小,其实说是无限大小,其实是有界限的,只不过超过界限时就会进行扩容,就行ArrayList
一样,在内部动态扩容
package chapter06;
import java.util.concurrent.ArrayBlockingQueue;
public class Collection_Queue { public static void main(String[] args) throws Exception {
ArrayBlockingQueue queue = new ArrayBlockingQueue(3);
boolean zhangsan = queue.offer("zhangsan"); System.out.println(zhangsan); boolean lisi = queue.offer("lisi"); System.out.println(lisi); boolean wangwu = queue.offer("wangwu"); System.out.println(wangwu); boolean zhaoliu = queue.offer("zhaoliu"); System.out.println(zhaoliu);
System.out.println(queue.poll()); System.out.println(queue.poll()); System.out.println(queue.poll()); System.out.println(queue.poll());
System.out.println(queue); } }
|