JAVA-器皿
容器位于java.util包内
Java容器类库的用途是保存对象,根据数据结构不同将其划分为两个不同的概念
(1) Collection,一个独立元素的序列,其中List按照元素的插入顺序保存元素,而set不能有重复元素,Queue(队列)按照先进先出(FIFO)的方式来管理数据,Stack(栈)按照后进先出(LIFO)的顺序管理数据。
(2) Map,一组键值对(key-value)对象的序列,可以使用key来查找value,其中key是不可以重复的,value可以重复。我们可以称其为字典或者关联数组。其中HashMap是无序的,TreeMap是有序的,WeakHashMap是弱类型的,Hashtable是线程安全的。
容器API的类图结构如图:
Collection接口
--定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。
示例:
import java.util.*; public class TestCollection{ public static void main(String[] args){ Collection c=new ArrayList(); //可以放入不同类型的对象 c.add("hello"); c.add(new Name("f1","l1")); c.add(new Integer(100)); System.out.println(c.size()); System.out.println(c); } } class Name{ private String firstName,lastName; public Name(String firstName,String lastName){ this.firstName=firstName; this.lastName=lastName; } public String getFirstName(){ return firstName; } public String getLastName(){ return lastName; } public String toString(){ return firstName+" "+lastName; } }
Set接口:
Set接口是Collection的子接口,Set接口没有提供额外的方法,但实现Set接口的容器类中的元素是没有顺序的,而且不可以重复。
import java.util.*; public class TestSet{ public static void main(String[] args){ Set s1=new HashSet(); Set s2=new HashSet(); s1.add("a"); s1.add("b"); s1.add("c"); s2.add("d"); s2.add("a"); s2.add("b"); Set sn=new HashSet(s1); //sn中与s2相同的 sn.retainAll(s2); Set su=new HashSet(s1); //所有的 su.addAll(s2); System.out.println(sn); System.out.println(su); } }
List接口:
List接口是Collection的子接口,实现List接口的容器类中的元素是有顺序的,而且可以重复。List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
次序是List最重要的特点;它确保维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(只推荐 LinkedList使用)。
import java.util.*; public class TestList{ public static void main(String[] args){ List l1=new LinkedList(); for(int i=0;i<=5;i++){ l1.add("a"+i); } System.out.println(l1); l1.add(3,"a100"); System.out.println(l1); l1.set(6,"a200"); System.out.println(l1); System.out.print((String)l1.get(2)+" "); System.out.println(l1.indexOf("a3")); l1.remove(1); System.out.println(l1); } }
Map接口
定义了存储“键(key)-值(value)映射对”的方法
import java.util.*; public class TestMap{ public static void main(String args[]){ Map m1=new HashMap(); Map m2=new TreeMap(); m1.put("one",new Integer(1)); m1.put("two",new Integer(2)); m1.put("three",new Integer(3)); m2.put("A",new Integer(1)); m2.put("B",new Integer(2)); System.out.println(m1.size()); System.out.println(m1.containsKey("one")); System.out.println(m2.containsValue(new Integer(1))); if(m1.containsKey("two")){ int i=((Integer)m1.get("two")).intValue(); System.out.println(i); } Map m3=new HashMap(m1); m3.putAll(m2); System.out.println(m3); } }
Iterator接口:
所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
import java.util.*; public class TestIterator{ public static void main(String[] args){ Collection c=new HashSet(); c.add(new Name("f1","l1")); c.add(new Name("f2","l2")); c.add(new Name("f3","l3")); Iterator i=c.iterator(); while (i.hasNext()){ //next()的返回值为Object类型,需要转换为相应类型 Name n=(Name)i.next(); System.out.println(n.getFirstName()+" "); } } } class Name{ private String firstName,lastName; public Name(String firstName,String lastName){ this.firstName=firstName; this.lastName=lastName; } public String getFirstName(){ return firstName; } public String getLastName(){ return lastName; } public String toString(){ return firstName+" "+lastName; } }
数组和容器类的区别:
效率、类型限定和对于基本类型的处理。
1,效率肯定是内建的数组效率更高一些。数组是一种高效的存储和随机访问对象引用序列的方式,使用数组可以快速的访问数组中的元素。但是当创建一个数组对象 ( 注意和对象数组的区别 ) 后,数组的大小也就固定了,当数组空间不足的时候就再创建一个新的数组,把旧的数组中所有的引用复制到新的数组中。,
2,在泛型出来之前,容器类都是存取Object,而数组规定了确定类型。
3,在自动封包解包前,容器类不支持基本类型,而数组支持。
泛型:
起因:类型不明确
装入集合的类型都被当做Object对待,从而失去自己的实际类型
从集合中取出时往往需要转型,效率底,容易产生错误
解决办法:
在定义集合的时候同时定义集合中对象的类型
1,可以在定义Collection的时候指定
2,也可以在循环时用Iterator指定
好处:增强程序的可读性和稳定性
import java.util.*; public class BasicGeneric { public static void main(String[] args) { List<String> c = new ArrayList<String>(); c.add("aaa"); c.add("bbb"); c.add("ccc"); for(int i=0; i<c.size(); i++) { String s = c.get(i); System.out.println(s); } Collection<String> c2 = new HashSet<String>(); c2.add("aaa"); c2.add("bbb"); c2.add("ccc"); for(Iterator<String> it = c2.iterator(); it.hasNext(); ) { String s = it.next(); System.out.println(s); } } }
总结:
以上只是简单介绍了容器的概念,以及各个容器类的特点和使用范例,对于容器类和数组来说,一般情况下,考虑到效率与类型检查,应该尽可能考虑使用数组。如果要解决一般化的问题,数组可能会受到一些限制,这时可以使用Java提供的容器类。
下篇博客将继续介绍集合类中如果实现判断大小和是否重复!
- 3楼tang_huan_1144分钟前
- 这些是容器的基础内容,你可以考虑一下容器和类的关系
- 2楼wang136675393251小时前
- 总结的很认真,学习了。
- 1楼lfmilaoshi2小时前
- 从题目上,就设计成一个系列的博客,如何?做一个博客党,挺好玩儿的。