黑马程序员----------集合框架

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、概述
  集合是一个容器,它的内部装的都是对象,并且可以是不同类型的对象。当把基础类型放入集合时,系统会自动装箱拆箱,例如将int存入List,会自动转换成Integer。
  集合和数组相比有几点不同
    1.数组内的长度是固定的,集合是可变的
    2.数组可以存放基础类型,集合通过包装基础类才能存取
二、Collection接口中的几个常用类
  Collection接口
    1.List接口  实现该接口的类,元素都是有序的,可以重复,该集合体系有索引。
      1.1 ArrayList类  该类底层是数组结构,线程不同步,读取快。
      1.2 LinkedList类  该类底层是链表结构,增删快,但是读取慢。
      1.3 Vector类  该类底层是数组结构,线程同步,增删改查都很慢,已经很少使用。
    2.Set接口  实现该接口的类,元素都是无序的,不可以重复,该体系没有索引。
      2.1 HashSet类 底层是哈希表结构,使用该类应该复写hashCode和equals方法
      2.2 TreeSet类 底层是二叉树结构,使用该类应该确保成员有可比性,通过compareTo()方法或者调用Comparator排序器。
  Collection的子类都实现了iterator()方法
  Collection的共有方法示例

import java.util.*;
class Demo implements Cloneable{
	public static void main (String []args)  throws Exception{
		List list = new ArrayList(); //创建新集合
		List list2 = new ArrayList();
		list2.add("asdqwd");  //加入元素
		list2.add("qwrd");    
		list2.add("asewe");
		list2.add("wad");
		if( list.isEmpty() ){  //判断集合是否为空
			list.addAll(list2);  //加入一个集合的所有元素
		}
		list.containsAll(list2);  //判断是否包含一个集合所有元素
		boolean x = list.contains("qwed");   //获取一个元素在集合的
		list.remove("wad");	         //删除一个元素
		list.clear();                //清空一个集合
		int y = list.size();         //获取集合的长度
		Iterator it = list2.iterator();   //建立该集合的迭代器对象
		while(it.hasNext()){							//判断有没有下一个元素
			System.out.println(it.next());  //输出下一个元素
		}
	}
}

List的特有方法
  add(index,element)  //指定角标添加元素
  remove(index)       //删除指定角标
  set(index,element)  //替换指定角标的元素
  get(index)          //获取指定角标的元素
  subList(form,end)   //获取一个子集,包含form到end-1的元素,
  listIterator()      //获取一个专门处理list的迭代器
LinkedList:特有方法
   addFirst():        //开头添加一个对象
   addLast():         //向结尾添加一个对象
   getFirst():        //获取开头的对象
   getLast():         //获取集合尾部的对象
   removeFirst():     //删除角标为0的对象,并且返回这个对象

Set集合元素是无序的,我们要保证元素的唯一性
   hashSet是通过元素的hashCode和equals来保证元素唯一性。首先判断hashCode是否相同,不同就显然不是同一对象,如果哈希值相同,再通过equals来判断是否相同。

class People{
	private String name;
	private int age;
 	People(String name){
		this.name = name;
		this.age = age;
	}
	void getname(){
		System.out.println("t");
	}
	public int hashCode(){
		return name.hashCode()*22+age;
	}
	public boolean equals( Object obj ){
		if( (obj instanceof People)!=true )
		 	return false ;
		else{
			People p = (People)obj;
			if(this.hashCode() != p.hashCode() )	
				return false ;
			else if( this.name == p.name && this.age == p.age ){
				return true ;
			}
			else
				return false ;
		}
	}
}

 TreeSet通过两元素比较的方法来确定唯一性。要么对象的类实现了Comparable接口并重写compareTo方法,要么使用比较器。
 

//Comparable接口方法
class Person implements Comparable{
	private String name;
	private int age;
 	Person(String name){
		this.name = name;
		this.age = age;
	}
	void getname(){
		System.out.println("t");
	}
	public  int compareTo(Object o){
		Person p = (Person)o;
		if( this.name == p.name && this.age == p.age)
			return 0 ;
		else if( this.age >= p.age ){
			return 1 ;
		}
		else
			return -1 ;
	}
}

//比较器方法
	class Demo(){
		TreeSet<Person> ts = new TreeSet<Person>(new Mycomp());
	}
	class Mycomp implements Comparator<Person>{
		public int compare(Person p1,Person p2){
			return p1.compareTo(p2);
		}	
	}


三、Map接口和它的实现类
 Map与Collection在集合框架中属并列存在,Map存储的是键值对,Map存储元素使用put方法,Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素,Map集合中键要保证唯一性。
 Map的常用子类
  Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。
  HashMap:线程不安全,速度快,允许存放null 键,null值。
   TreeMap:对键进行排序,排序原理与TreeSet 相同。
 Map有两种遍历方式

class Demo implements Cloneable{
			public static void main (String []args)  throws Exception{
					Map<Integer,String> map = new TreeMap<Integer,String>();
					map.put(1,"aaa");
					map.put(2,"bbb");
					map.put(3,"ccc");
					map.put(4,"ddd");
					map.put(5,"eee");
					//下面是用keySet来遍历
					Set<Integer> s = map.keySet();
					Iterator<Integer> it = s.iterator();
					while(it.hasNext()){
						int x = it.next();
						System.out.println(x+"  "+map.get(x));
					}
					//下面是用entrySet来遍历
					Set<Map.Entry <Integer,String >>  s2= map.entrySet();
					Iterator<Map.Entry < Integer,String > > it2 = s2.iterator();
					while(it2.hasNext()){
						Map.Entry <Integer,String> m = it2.next();
						System.out.println(m.getKey()+"  "+m.getValue());
					}
				}
			}

使用entrySet可以使用setValue来修改值,所以推荐使用。
四、Collections
  Collections是一个Collection的工具类,它里面都是静态方法。常用方法有:
   fill(List<? super T> list, T obj);
   max(Collection<? extends T> coll);
   min(Collection<? extends T> coll);
   reverse(List<?> list);
   reverseOrder(Comparator<T> cmp);
   shuffle(List<?> list);
   sort(List<T> list, Comparator<? super T> c);
   swap(List<?> list, int i, int j);
  用是个i还有一个对应操作数组的Arrays。他们实现了数组集合的互转。注意的是数组转成的集合不具备扩展性。
五、高级For循环
  在遍历一个数组或集合时,可以这样简写
   for( Object o : list ){
   }
  高级for循环其实用的也是迭代器,再使用高级for循环时无法对集合进行操作,只能遍历,有较大局限性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值