Java容器剖析:collection容器--【J2SE】


背景:

       起初,Java应该先有的数组。数组是一种高效存储和随机访问对象引用序列的方式,在效率和类型检查方面很有优势,但是当创建一个数组对象的时候,数组的大小也就固定了。为了满足想要多少分配空间,就能占多少,容器就诞生了~~

 

概念:

Java API所提供的一系列类的实例,用于在程序中存放对象。下图是容器的API框架图:

 Java容器剖析:collection容器--【J2SE】_第1张图片

JDK提供的容器:

  Set:数据对象无序,不可重复

  List:数据对象有序  ,可重复

       附:重复就是通过equals方法对比的结果 

  Map:接口定义了存储“键(key)-值(value)映射对”的方法。


Collection接口:

Collection接口定义了存储的一组对象的方法,其子接口Set和List分别细化了存储的方式。

Demo代码:

实例化一个ArrayList对象,实现父Collection接口,通过add方法添加两个元素,并打印c容器的大小和内容。

import java.util.*;
	public class Main {
		public static void main(String[] args) {
			Collection c=new ArrayList();//父类Collection实例化一个子类对象ArrayList
 			//可以放入不同的对象。 
			c.add("hello");
			c.add(new Integer(100));
			System.out.println(c.size());
		        System.out.println(c);
 		}
	
}


注意:

为啥要写Collection c=new ArrayList();父类指向子类的接口,这样实例化的对象里面只拥有父类方法的具体实现。假如根据需要,不实例化ArrayList了,改成LinkList了,只需要修改ArrayList出即可使用,体现了代码的灵活性。


输出结果:

Java容器剖析:collection容器--【J2SE】_第2张图片


Collection Remove代码:

跟上面的代码比,添加了remove方法的使用,调用Collection的add方法后移除remove,输出操作后的结果。

	import java.util.*;
	public class Main {
		public static void main(String[] args) {
			Collection c=new HashSet();
			//可以放入不同的对象。 
			c.add("hello");
			c.add(new Name("f1","l1"));
			c.add(new Integer(100));
                        //新添加移除remove方法
                        c.remove("hello");
			c.remove(new Integer (100)); //移除的时候,有一个equals的对比。
			System.out.println(c.remove(new Name("f1","l1")));
			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 getLashName(){return lastName;}
		public String toString(){return firstName + " " + lastName;}
		
		public boolean equals(Object obj){
			if(obj instanceof Name){
				Name name=(Name) obj;
				return (firstName.equals(name.firstName)) &&(lastName.equals(name.lastName));
				
			}
			return super.equals(obj);
		}
		public int hashCode(){
			return firstName.hashCode();
		}
	
	}

输出结果:

Java容器剖析:collection容器--【J2SE】_第3张图片



在作为索引的时候,重写equals的时候要重写hashcode.

Java容器剖析:collection容器--【J2SE】_第4张图片


Iterator接口:


Iterator就是一个统一遍历Collection所有元素的方法。

1所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。

2、Iterator对象称作迭代器,用以方便的实现对容器元素的遍历实现。

3、Iterator实现了下列方法:


Java容器剖析:collection容器--【J2SE】_第5张图片


Iterator 实例代码:

		import java.util.*;
		public class Main {
			public static void main(String[] args) {
				Collection c=new HashSet();	
				c.add(new Name("f1","l1"));
				c.add(new Name("f3","l3"));
				c.add(new Name("f5","l5"));
				//统一遍历Collection里面所有的元素
				Iterator i=c.iterator();	
				while(i.hasNext()){
					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 getLashName(){return lastName;}
			public String toString(){return firstName + " " + lastName;}
			
			public boolean equals(Object obj){
				if(obj instanceof Name){
					Name name=(Name) obj;
					return (firstName.equals(name.firstName)) &&(lastName.equals(name.lastName));
					
				}
				return super.equals(obj);
			}
			public int hashCode(){
				return firstName.hashCode();
			}
		
		}


输出结果:

Java容器剖析:collection容器--【J2SE】_第6张图片


注意:

Iterator对象的remove方法是在迭代过程中删除元素的唯一的安全方法。使用的过程中拒绝其他的remove方法。


下面一篇将为大家继续深入讲解Java容器,有兴趣的朋友可以继续关注我的博客!





你可能感兴趣的:(J2SE,Collection,容器)