java集合框架(黑马程序员)

------- android培训、java培训、期待与您交流! ----------

如何在java中存储大量数据?我们想到的是java的集合,也叫容器。集合类都是继承Collection接口的。所以我们首先分析Collection接口。Collection口中有很多方法,是其他类通用的,所以其他子框架一样!

//collection都有两个构造方法:1不带参数的。2带参数的且参数为另一个同类集合
	public static void collectionDemo_1()
	{
		Collection<String> col = new ArrayList<String>();
		//Collection<String> col2 = new ArrayList<String>(col);
		col.add("hello");
		col.add("java");//用于增加一个元素。
		System.out.println(col.contains("java"));//用于测试是否包含该元素。
		//下面的代码为toarray的用法:转化到一个数组中。
		String[] str = new String[col.size()];
		col.toArray(str);
		for(String s:str)
		System.out.println(s);
		
		col.clear();//用于清空所有元素。
		System.out.println(col.size());//size是测试集合的大小,返回个数!
	}

那么还是有几点要说:1.为什么用Collection作为类型?这是面向接口编程,高手都是这么玩的,呵呵。面向接口可以方便后续程序的通用性。假如我要修改ArrayList为LinkedList那么只修该处即可。十分方便!2.这些方法都是通用的,其他的集合中都是可用的!

下面来了解各个详细的集合吧:

1ArrayList 那么先看一下demo:

public static void collectionDemo_2()
	{
		List<String> mylist = new ArrayList<String>();
		mylist.add("i");
		mylist.add("you");
		mylist.add(1, "love");//这个方法有个重载,在index处添加element。
		mylist.set(2, "her");//该方法所作用是去替换元素!
		System.out.println(mylist.get(1));//得到元素!
		System.out.println(mylist.indexOf("love"));//找出下标,
		for(Iterator<String> it = mylist.iterator();it.hasNext();)
		{
			//it.remove();该方法可以移除取到元素!
			System.out.println(it.next());
		}
		//在Collection中都有iterator但是list接口下有ListIterator。以实现add和set
		for(ListIterator<String> it = mylist.listIterator();it.hasNext();)
		{   
			it.next();
			it.set("haha");
		}
		System.out.println(mylist);	
	}

依旧是代码中告诉我们应该怎么用ArrayList,其实相比较一下与Collection的区别,就是多了一个get,set的方法,细想一下为什么呢?其是ArrayList的底层结构就是数组,快捷的访问与修改,那么必然会有set与get了。增加了方便性!

另一点就是在Iterator了。list接口下增加了ListIterator。其中可以有set,add,和remove方便了程序的书写!

2LinkedList的方法没有什么特殊的,就是多了几个首尾元素的操作方法!

public static void collectionDemo_3()
	{
		LinkedList<String> mylist = new LinkedList<String>();
		mylist.add("shit");
		mylist.add("shut");
		mylist.add("up");
		mylist.addFirst("lin");//以前的方法在链表首尾增加元素!
		mylist.addLast("!");
		mylist.removeFirst();//以前的方法在链表的首尾删除元素!
		mylist.removeLast();
		System.out.println(mylist.getFirst());
		System.out.println(mylist.getLast());
		//新的一些方法
		String str = mylist.peek();
		String str1 = mylist.peekFirst();//获取list的首尾元素,但不删除。
		String str2 = mylist.peekLast();//唯一的区别是当list为空时返回null!
		
		String mystr = mylist.pollFirst();//获取并移除该元素!
		String mystr1 = mylist.pollLast();
		
		for(Iterator<String> it = mylist.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
	}
LinkedList的方法中,体现出了他的底层结构的特点:链表的操作,主要是对首尾元素的操作,因为要作为栈和队列的体现。那么如果要在首尾添加元素用:addFirst和addLast。删除用:removeFrist和rermoveLast。要取出元素时候用:peekFrist和peekLast。或者pollFrist和polllast唯一的区别就是,你是取出该元素的时候是否要删除该元素!

3Vector是一个不常用的东东,但他有一个特殊的迭代器:枚举迭代器Enumeration

	public static void collectionDemo_4()
	{
		Vector<String> v = new Vector<String>();
		v.add("this");
		v.add("is");
		v.add("vector");
		for(Enumeration<String> en = v.elements();en.hasMoreElements();)
		{
			System.out.println(en.nextElement());
		}
	}
vector的enumeration迭代和iterator一样。

上面就是几个重要的list接口下的类ArrayList呢是不同步的。Vector是同步的。数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 。 

4hashSet

public static void collectionDemo_5()
	{
		HashSet<person> hc = new HashSet<person>();
		hc.add(new person("lisi",33));
		hc.add(new person("wangwu",22));
		hc.add(new person("zhaoliu",11));
		for(Iterator<person> it = hc.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
	}
}
class person
{
	private String name;
	private int age;
	person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public String toString()
	{
		return name+""+age;
	}
	public int hashCode()
	{
		return 60*age;
	}
	public boolean equals(Object obj)
	{
		person p = (person)obj;
		if(p.name.equals(name)&&(p.age == age) )
		return true;
		else return false;
	}
}
关于HashSet没有什么特殊的东西,就是set的作用是哈希表为底层的,他主要就是不可以存储同一个元素或者对象!所以一个对象进入检查时,要首先看他的hashcode,然后再比较equals方法。关于覆盖不覆盖就要看你的代码了。随机应变!

5.TreeSet也是有set集合来的,所以哟加入了主要是排序功能!

我们扩展一下刚才的person让他继承implments comparable接口那么就可以比较两个对象了,而且comparable接口也是作为TreeSet集合传入的必要接口!所以在实现compareTo(Object o)

	public int compareTo(Object o) {
		person p = (person)o;
		if(p.age > age)
			return 1;
		else if (p.age == age)
 		return 0;
		else 
			return -1;
	}
所以有了TreeSet的demo
public static void collectionDemo_6()
	{
		TreeSet<person> ts = new TreeSet<person>(new mycompare());
		ts.add(new person("zhansannn",11));
		ts.add(new person("lisi",22));
		ts.add(new person("wangwu",14));
		ts.add(new person("zhaoliu",18));
		for(Iterator<person> it = ts.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}
	}
作为上面的方法,重要的是结论,在会用你的compareTo的方法比较对象。所以会有按年龄排序。那么又有了一个需求,如果你的类不让你implments但是你又要进行比较器compartor的使用!也就是说你要有一个比较器类,implments compartor接口。所以覆盖compare(Object o1,ObjectO2)

class mycompare implements Comparator
{

	@Override
	public int compare(Object o1, Object o2) {
		person p1 = (person)o1;
		person p2 = (person)o2;
		if(p1.name.length() > p2.name.length())
		return 1;
		else if(p1.name.length() < p2.name.length())
			return -1;
		else return 0;
	}
	
}
所以关键是排序问题的话,你就可以用TreeSet集合了!所以到目前为止,你要了解结合的每个作用,然后再活学活用!

6.Map的主要是HashMap,HashTable,TreeMap为重点其中:

HashMap:哈希表数据结构,为同步的,不允许存储null的键值对。

HashTable:哈希表数据结构,为不同步的,允许存储null的键值对。

TreeMap:二叉树数据结构,线程不同步,可以给map中的键排序。

	public static void collectionDemo_7()
	{
		HashMap<String,String>  hm = new HashMap<String,String>();
		hm.put("en", "11");//map中特有的添加方法。
		hm.put("cn", "33");
		hm.put("kt", "22");
		System.out.println(hm.containsKey("cn"));//是否包含该键
		System.out.println(hm.get("en"));//通过键的来获取值。
		System.out.println(hm.values());//获取所有的值得映射表
		hm.clear();//清空,清空一个用remove
		System.out.println(hm.size());//获取键值对的个数
	}
但是我们始终没有迭代器来迭代,于是我们看到Set keySet();返回一个存储键的Set集合。于是

		Set<String> s = hm.keySet();
		for(Iterator<String> it = s.iterator();it.hasNext();)
		{
			System.out.println(it.next());
		}

通过Set遍历,你还可以在里面通过get()来获取值;所以keyset可以满足你的需要!

另外Map集合还提供了entrySet来提供全部逻辑映射的访问!

public static void collectionDemo_8()
	{
		HashMap<String,String>  hm = new HashMap<String,String>();
		hm.put("en", "11");//map中特有的添加方法。
		hm.put("cn", "33");
		hm.put("kt", "22");
		Set<Map.Entry<String, String>> ens = hm.entrySet();
		for(Iterator<Map.Entry<String, String>> it = ens.iterator();it.hasNext();)
		{
			Map.Entry<String, String> s = it.next();
			System.out.println(s.getValue()+"----"+s.getKey());
		}
	}
由于返回值为Map.Entry<k,v>的对象所以,你必须去用getKey和getValue才能获得键值对!

上述就是集合类的东西,要活学活用!


------- android培训、java培训、期待与您交流! ----------







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章