黑马程序员-Java基础-集合类总结

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

Collection集合类,用来存储对象的引用,也就是内存地址值。

Collection
        |---List 元素是有序的,元素可以重复,
              |--ArrayList:底层的数据使用的是数组结构,线程不同步。
                                     特点:查询速度很快,但是增删数据稍慢
              |--LinkedList:底层使用的是链表数据结构
                                     特点:增删速度很快,查询稍慢
              |--Vector :底层是数组数据结构,线程同步,较安全。
        |---Set:元素是无序的,元素不可以重复。
              |--HashSet:底层数据结构是哈希表
                        HashCode如何保证元素唯一性:
                     通过元素的两个方法,HashCode和equals来完成。
                    如果HasCode值相同,才会判断equals是否是true
                    如果HasCode值不同,不会调用equals方法。
                    对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法
              |--TreeSet

Map

       |--HashTable:底层是哈希表数据结构,不可以存入null键null值。线程同步。效率低。JDK1.0
       |--HashMap:底层是哈希表数据结构,允许null键和null值。非同步,效率高。JDK1.2
       |--TreeMap:底层是二叉树,线程不同步。可以用于给map集合中的键进行排序。

             
    List:特有方法:凡是可以操作角标的方法都是该体系结构特有的方法。
       1、 增加
      add(index,element)
      addAll(index,collection)
      2、 删除
      remove(index)
      3、 修改
      set(index,element)
      4、查询
      get(index,element)
      subList(from,to)
      listIterator() 

     List集合特有的迭代器,ListIterator是iterator子接口。
     在迭代时,不可以通过集合对象的方法操作集合中的元素。
      因为会发生ConcurrentModificationException异常。
      所以,在迭代时,只能用迭代器的 方法操作元素,可以Iteratir方法是有局限的,
      只能对元素进行判断,取出,删除操作。
      如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.
      该接口只能通过List集合的ListIterator获取。

 Set:元素是无序的(存入和取出的顺序不一定),元素不可以重复。
 set和collection的功能是一致的。

 集合中使用迭代器取出元素,也就Iterator.

iterator提供hasNext()和next()方法

            TreeSet:可以对set集合中的元素进行排序。
* 底层数据结构是二叉树,保证元素唯一性的依据是:compareTo方法的return 0;`
* 这种方式也称为元素的自然顺序,或者叫默认顺序。

* TreeSet排序的第一种方式;让元素自身具备比较性,
* 元素需要实现Comparable接口,覆盖CompareTo方法。
* 排序时,当主要条件相同时,一定要判断一下次要条件。

* TreeSet排序的第二种方式:
* 当于元素不具备比较性时,或者具备的比较性不是所需要的时。
* 这时就需要让集合自身具备比较性。
* 在集合初始化时,就有了比较方式。使用构造函数。

 Map集合:该集合存储键值对。一对一对存数据,而且保证键的唯一性。
            将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 
此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口。
1、添加
  put(K key,V value)
  putAll(Map<? extends K,? extends V> m) 
2、删除
  clear()
  remove(Object key) 
3、判断
  containsKey(Object key)
  containsValue(Object value)
  isEmpty()
4、获取
  get(Object key)
  size()
  values()
  entrySet()
  KeySet()    
      map和set很像,而且set底层就是使用了Map集合。

 Map集合的两种取出方式:
      1、Set<K>  KeySet:将Map中所有的键存入到Set集合中,,因为Set具备迭代器,
                           所以可以迭代方法取出所有的值,再根据get方法,获取每一个键对应的值。
        map集合取出原理:将map集合转成set集合,再 用迭代器取出。
      2、Set<Map,Entry<K,V> > EntrySet:将Map集合中的映射系存储到set集合中,而这个关系的数据类型就是Map.Entry,
                             在Map.Entry中通过getKey和getValue获取内容。                           
         Map.Entrry 其实Entry也是一个接口,它是Map接口中的一个内部接口.

集合类体系结构图例:


ArrayList方法演示,代码如下:

package com.itheima.day14;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListDemo 
{
	/*
    Collection
        |---List 元素是有序的,元素可以重复,
	          |--ArrayList:底层的数据使用的是数组结构,线程不同步。
	          |--LinkedList:底层使用的是链表数据结构
	          |--Vector :底层是数组数据结构,线程同步,较安全。
        |---Set:元素是无需的,元素不可以重复。
              |--HashSet:底层数据结构是哈希表
              |--TreeSet
             
    List:
                      特有方法:凡是可以操作角标的方法都是该体系结构特有的方法。
      1、增加
	  add(index,element)
	  addAll(index,collection)
      2、删除
      remove(index)
      3、 修改
      set(index,element)
      4、查询
      get(index,element)
      subList(from,to)
      listIterator() 
	 */
	public static void main(String[] args) 
	{
		method_add();
		method_listIterator();
	}
	public static void method_add()
	{
		 ArrayList a1 = new ArrayList();
	        //添加元素
	        a1.add("a");
	        a1.add("b");
	        a1.add("c");
	        print("原集合是:"+a1);
	        //在指定位置添加元素
	        a1.add(1, "kk");
	        //删除指定位置的元素
	        a1.remove(2);
	        //修改元素
	        a1.set(1, "dd"); 
	        //通过角标获取元素
	        print("get(1):"+a1.get(1));
	        //获取所有元素
	        for(int i=0; i<a1.size(); i++)
	        {
	        	System.out.println("a1.get("+i+")="+a1.get(i));
	        }
	        //迭代器获取所有元素
	        Iterator it = a1.iterator();
	        while(it.hasNext())
	        {
	        	print(it.next());
	        }
	        //通过indexOf()获取对象的位置
	        print("index="+a1.indexOf("dd"));
	        //返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
	        List sub = a1.subList(1, 3);
	        print("sub="+sub);
	}
	public static void method_listIterator()
	{
		 ArrayList a1 = new ArrayList();
	        a1.add("java01");
	        a1.add("java02");
	        a1.add("java03");
	        /*
	        Iterator it = a1.iterator();
	        //在迭代过程中,增加或者删除元素
	        while(it.hasNext())
	        {
	        	Object obj = it.next();
	        	if(obj.equals("java02"))
	        	{
	        		it.remove();//将java2de引用从集合中删除
	        		//a1.add("java04");抛出ConcurrentModificationException异常
	        		print("obj="+	obj);
	        	}
	        }
	        */
	       //演示列表迭代器。ListIterator具备增删改查功能。
	        ListIterator li = a1.listIterator();
	        while(li.hasNext())
	        {
	        	Object obj = li.next();
	        	if(obj.equals("java02"))
                    //li.add("java009");
	                li.set("java006");
	        	    print("obj="+obj);
	        }
	        print(a1);
	        // boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 同hasNext()相反,向前遍历
	        print("a1.hasPrevious()="+li.hasPrevious());
	}
	public static void print(Object obj)
	{
		System.out.println(obj);
	}

}

HashSet方法演示,代码如下:

package com.itheima.day14;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest 
{

	/*
	 * 举例:
	 * 将自定义的对象作为元素存储到HashSet集合中,并去除重复数据。
	 * 比如:存储人对象,同姓名同年龄,视为同一个人,为重复数据。   
	 */
	public static void main(String[] args) 
	{
 
		HashSet hs = new HashSet();
		hs.add(new Person2("a1",1));
		hs.add(new Person2("a2",2));
		hs.add(new Person2("a3",3));
		hs.add(new Person2("a2",2));
		
//	    System.out.println(hs.contains(new Person("a1",1)));
		hs.remove(new Person("a3",3));
		
		Iterator it = hs.iterator();
		while(it.hasNext())
		{
			Person2 p = (Person2)it.next();
			System.out.println(p.getName()+"--"+p.getAge());
		
		}	
	}
}
class Person2
{
    private  String name;
    private  int age;
    Person2(String name,int age)
    {
    	this.name = name;
    	this.age = age;
    }
    public int hashCode()
    { 
    	System.out.println(this.name+"===hashcode");
    	return name.hashCode()+age*20;
    }
    public boolean equals(Object obj)
    {
    	if(!(obj instanceof Person2))
    		return false;
    	Person2 p = (Person2)obj;
    	System.out.println(this.name+"**eqauls**"+p.name);
		return this.name.equals(p.name) && this.age == p.age;
    	
    }
	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}  
}
ArrayList举例
 将自定义的对象作为元素存储到ArrayList集合中,并去除重复数据。
比如:存储人对象,同姓名同年龄,视为同一个人,为重复数据。

代码如下:

package com.itheima.day14;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 举例:
 * 将自定义的对象作为元素存储到ArrayList集合中,并去除重复数据。
 * 比如:存储人对象,同姓名同年龄,视为同一个人,为重复数据。
 * 
 * 思路:
 * 1、对人描述,将数据封装成人对象。
 * 2、定义容器,将人存入
 * 3、取出。
 *  
 *  List集合判断两个集合是否相同,根据的是元素的equals方法
 * @author kevin
 *
 */
public class ArrayListTest2 {
	public static void main(String[] args) 
	{
		ArrayList al = new ArrayList();
		al.add(new Person("zhangsan",20));
		al.add(new Person("lisi",22));
		al.add(new Person("lisi",22));
		al.add(new Person("crystal",23));
		al.add(new Person("zhangsan",20));
		al.add(new Person("andrea",20));
		
		al = singleElement(al);
		
		Iterator it = al.iterator();
		while(it.hasNext())
		{
			Person p = (Person)it.next();//必须向下转型为Person,否则异常
			System.out.println(p.getName()+"--"+p.getAge());
		
		}		
    }
	 public static ArrayList singleElement(ArrayList al)
	    {
	    	ArrayList newal = new ArrayList();
	    	Iterator it = al.iterator();
	    	while(it.hasNext())//迭代中next一次就判断一次
	    	{
	    		Object obj = it.next();
	    		if(!newal.contains(obj))//contains底层调用equals方法
	    			newal.add(obj);
	    	}
	    	return newal;
	    }
}

class Person
{
    private  String name;
    private  int age;
    Person(String name,int age)
    {
    	this.name = name;
    	this.age = age;
    }
    public boolean equals(Object obj)
    {
    	if(!(obj instanceof Person))
    		return false;
    	Person p = (Person)obj;
//    	System.out.println(this.name+"--"+p.name);
		return this.name.equals(p.name) && this.age == p.age;
    	
    }
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
    
}


LikedList常用方法:

void addFirst(E e) 
    将指定元素插入此列表的开头。
void addLast(E e) 
    将指定元素添加到此列表的结尾。
void addFirst(E e) 
    将指定元素插入此列表的开头。
void addLast(E e) 
    将指定元素添加到此列表的结尾。
boolean offerFirst(E e) 
    在此列表的开头插入指定的元素。
boolean offerLast(E e) 
    在此列表末尾插入指定的元素。
E peekFirst() 
    获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
E peekLast() 
    获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。
E removeFirst() 
    移除并返回此列表的第一个元素。
E removeLast() 
    移除并返回此列表的最后一个元素。

 E pollFirst() 

     获取并移除此列表的第一个元素;如果此列表为空,则返回 null。 
E pollLast() 
     获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。 

LinkedList举例,代码如下:

package com.itheima.day14;

import java.util.LinkedList;

public class LinkedListDemo 
{

	/**
	 *链表特有方法;
	 *
	 *addFirst()
	 *addLast()
	 *
	 *getFirst()
	 *getLast()
	 *获取元素,但是不删除数据
	 *
	 *removeFirst()
	 *removeLast()
	 *获取元素,但是删除元素
	 *如果集合中没有元素,会出现NoSuchElementException异常,
	 *
	 *在JDK1.6或出现了替代方法.
	 *offerFirst()
	 *offerLast()
	 *
	 *peekFirst()
	 *peekLast()
	 *
	 *pollFirst()
	 *pollLast()
	 *如果集合中没有元素,会返回null
	 *
	 *
	 * @param args
	 */
	public static void main(String[] args) 
	{
         LinkedList lk = new LinkedList();
         lk.addFirst("java01");
         lk.addFirst("java02");
         lk.addFirst("java03");
         System.out.println(lk);
         /*
          * 输出:[java03, java02, java01]
          * 后面Add的数据放在原数据前面
          */
         System.out.println(lk.getFirst());
         System.out.println(lk.getLast());
         
         //System.out.println(lk.removeFirst());
         System.out.println("size="+lk.size());
         while(!(lk.isEmpty()))
         {
        	 System.out.println(lk.removeLast());
         }
         System.out.println("size="+lk.size());
	}

}

Vector举例,代码如下:

package com.itheima.day14;

import java.util.Enumeration;
import java.util.Vector;

public class VectorDemo 
{

	/**Enumeration是Vector特有的取出数据的方式,和Iterator功能相似。
	 * 因为枚举的名称和方法的名称都过长,所以被Iterator取代了.
	 * 枚举是vector中特有的迭代方法。
	 * @param args
	 */
	public static void main(String[] args) 
	{
          Vector v = new Vector();
          v.add("java01");
          v.add("java02");
          v.add("java03");
          Enumeration en = v.elements();
          while(en.hasMoreElements())
          {
        	  System.out.println(en.nextElement());
          }
	}

}

TreeSet举例:按照字符串长度排序。

代码如下:

package com.itheima.day15;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * 举例:按照字符串长度排序
 * 
 * 字符串本身具有比较性,但是它得比较方式不是所需要的。
 * 这时就需要使用比较器。
 * @author kevin
 *
 */
public class TreeSetTest 
{
	public static void main(String[] args) 
	{
		TreeSet tree = new TreeSet(new StrLenCompare());
		tree.add("a");
		tree.add("dc");
		tree.add("bba");
		tree.add("bbc");
		Iterator  it = tree.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}
class StrLenCompare implements Comparator
{

	@Override
	public int compare(Object o1, Object o2) 
	{
		String  s1 = (String)o1;
		String  s2 = (String)o2;
	/*	if(s1.length()>s2.length())
			return 1;
		if(s1.length()==s2.length())
			return 0;
		return -1;*/
		int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
		if(num==0)
			return s1.compareTo(s2);
		return num;
	}
	
}
Map集合举例:
package com.itheima.day16;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapDemo2 {

	/*
      Map集合的两种取出方式:
      1、Set<K>  KeySet:将Map中所有的键存入到Set集合中,,因为Set具备迭代器,
                           所以可以迭代方法取出所有的值,再根据get方法,获取每一个键对应的值。
        
        map集合取出原理:将map集合转成set集合,再 用迭代器取出。
      2、Set<Map,Entry<K,V> > EntrySet:将Map集合中的映射系存储到set集合中,而这个关系的数据类型就是Map.Entry,
                             在Map.Entry中通过getKey和getValue获取内容。
                             
         Map.Entrry 其实Entry也是一个接口,它是Map接口中的一个内部接口.
         interface Map
         {
            public static infterfaceEntry
            {
               public static abstract Object getKey();
               public static abstract Object getValue();
            }
         }
         class HashMap implements Map
         {
           class HashDemo implement Entry
           {
                public static  Object getKey(){}
               public static  Object getValue({}
           }
         }

	 */
	public static void main(String[] args)
	{
		Map<String,String> map = new HashMap<String,String>();
		map.put("01", "java01");
		map.put("02", "java02");
		map.put("03", "java03");
	     //EntrySet方法演示
		 //将Map集合中的映射关系取出,存入到Set集合中。
		Set<Map.Entry<String, String>> entrySet = map.entrySet();
		Iterator<Map.Entry<String, String>> it = entrySet.iterator();
		while(it.hasNext())
		{
			Map.Entry<String, String> me = it.next();
			//关系对象Map.Entry<K, V>中封装有getKey和getValue方法
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+":"+value);
		}
		
		/*
		 * KeySet方法演示
		//先获取map集合中的所有键set集合,keySet
		Set<String> keyset = map.keySet();
		//有了set集合,就可以获取其迭代器
		Iterator<String> it = keyset.iterator();
		while(it.hasNext())
		{
			String key = it.next();
			System.out.println("key="+key);
			//由来map键就可以使用map的get方法获取没有个键对饮的值
			String value = map.get(key);
			System.out.println("value="+value);
		}
		*/
	}

}


----------------------  ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------
详细请查看: http://edu.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值