黑马程序员 Collection 集合的个人总结

-----------android培训java培训、java学习型技术博客、期待与您交流! ------------

Collection 集合的意思
他是这个接口类型的,类所以不能直接创建实例化对象,要用其子类来完成.

Collection 最常用到的子类是,List  和   Set    这两大子类

那么我们现在就分别说一下 这两个集合中常见子类的特点.

在  List 集合中常见的子类 是,主要有三大集合  Vector   LinkedList   ArrayList

Vector 集合中,具有一种特殊的取值的方式那就是枚举.这个集合是线程同步的,效率较慢.底层也是,数组结构
	main(){
	Vector v= new Vector();
			v.add("zhangsan");
			v.add("zhangsan");
			v.add("zhangsan");
			/*Enumeration e=v.elements();
			while(e.hasMoreElements()){这是枚举取值
				System.out.println(e.nextElement());
			}*/
			for(int i=0; i<v.size();i++){这是索引取值
				System.out.println(v.get(i));
			}
	}

LinkedList 集合中,底层实现的方式是链表式结构.在对大量数据进行增删操作的时候用会比较合适增,速度较快.是线程不同步的,

ArrayList 集合中,底层实现的方式,是数组结构,ArrayList 取代了 Vector  在用法上基本上一样的,ArrayList是线程不同步的
对数据的增删操作较慢,没有LinkedList 快.
 
 这里面重点要说一下 set 集合.
 在Set 集合中主要是有 两大 子类集合 ,
1,HashSet
 	HashSet 底层数据结构方式是哈希表结构,是线程不同步的.
 	放在这个集合中的元素是不可以重复的,为什么这样说呢?
 	在HashSet 底层实现的的时候,其中里面有两个方法
 	一个是HashCode 一个是equals 而HashCode 是用来算出他们在堆内存中
 	内存地址值,假设我们在判断人对象的时候,建立好他们的对象,如果是
 	放在,HashSet 集合中的话,每new出来一个对象,只要一new 那么就会在
 	内存中产生对象,产生对象的同时他们就,具备了内存地址值,这是每产生
 	一个对象,他们的内存地址值都是不相同的(就是HashCode 的值) 那么他们
 	都会被存放到,集合中,这个时候只有保证他们的 内存地址值是一样的,我们才有
 	办法进行比较,那么 就要覆盖  其中的方法   HashCode(); 如果两个对象的HashCode值
 	是相同的,那么才会用,equals去比较他们的内容是否相同.如果说他们连
 	HashCode 的值都是不相同的话,那么就像我们上面说到的那样,他们就是不同的对象了,无需比较
 	
 2,TreeSet 
	TreeSet 集合 底层数据结构是,二叉树的结构
	这个集合他本身就是一个可以用来排序的集合,当我们只是单纯的向往这个集合
	中存入元素的话,当这些元素有一定的,比较关系的时候,这个集合是会自动给
	排序的,假如当我们在写一个类的时候,这个类是不具备任何比较性的怎么办呢?
	那么我们可以让这个类具有比较的功能,可以让类实现 Comparable接口,
	并复写其中的compareTo方法。 还有另外一种方式就是,让集合本身就具备比较的功能.
	你只要是存进来的元素,我都给你比较一下,这就是比较器 写一个类实现 Comparator接口
	复写 其中 Compare(Object obj1 , Object obj2)在把实现了Comparator接口子类对象
	传到集合中就可以了  ,当这两种方式同时存在的时候,那么优先使用比较器的比较方式




public class Person implements Comparable<Person> {//让这个类 具有比较性
	private String name;
	private int age;
	Person(String name,int age){
		this.name= name;
		this.age= age;
	}
	@Override
	public int compareTo(Person s) {//这是覆盖比较器的方法
		int num = new Integer(this.age).compareTo(new Integer(s.age));
		if(num == 0)
			return s.name.compareTo(this.name);
		return num;
	}
	public int hashCode(){ //对于存放到 HashSet 集合中的时候.覆盖了 HashCode方法
		return  60;
	}
	public boolean equals(Object obj){//对于存放到 HashSet 集合中的时候.覆盖了equals方法
		if(!(obj instanceof Person))
			throw new RuntimeException("不是人对象");
			Person p = (Person)obj;
			return this.name.equals(p.name)&& this.age==p.age ;
	}
	public String toString(){
		return name+"..."+age;
	}
	public String getName(){
		return name;
	}
	public int getAge(){
		return age;
	}
	
}
class BJQ implements Comparator{//这是比较器

	@Override
	public int compare(Object o1, Object o2) {//这是覆盖比较器的方法.
		// TODO Auto-generated method stub
		if(!(o1 instanceof Person && o2 instanceof Person))
			throw new RuntimeException("bushi ren lei de dui xiang ");
		Person p1= (Person)o1;
		Person p2 =  (Person)o2;
		int unm = p1.getName().compareTo(p2.getName());
		if(unm==0)
			return new Integer(p1.getAge()).compareTo(new Integer(p2.getAge()));
		return unm;
	}
	
}



----------- android培训 java培训 、java学习型技术博客、期待与您交流! ------------


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值