java 中的集合框架之列表、集合

集合框架是java中非常重要的一部分,它是很好的对象管理器。接下来的文章总结一下所学习的框架知识,包括:equal 和hashcode 方法的重写,常用集合框架的层次,自然排序和指定排序,常用的集合类(List,Set)等等,集合的遍历(迭代器,for-each)。下一篇讲映射类和集合常用操作,以及泛型编程。

Object类

Object是所有的超类,他有很多重要的方法,需要他的子类来重写。toString(),equal(),hashCode()

toString方法:当使用System.out.println方法打印Object时,调用的就是Object的toString方法,如果不重写要打印的类的toString方法,打印出来的东西就很难理解。想打印出自己想要的信息,就要在类中重写public String toString()。

比如

	public String toString(){
		String st="学生的名字:"+this.name+" 学生的年龄"+this.age+"学生的班级"+this.classNum+"\n";
		return st;
	}
equal方法:Object类中equal方法用于比较两个对象是否相同,如果不重写object则 A.equal(B)比较的就是A和B两个引用是否指向同一个对象,为了真正比较A和B两个对象是否有相同的内容,就需要重写equal方法。

public boolean equals(Object o){
		System.out.println("调用了equals方法和"+((Student3)o).name+"比");
		//如果两个引用相同则直接返回true
		if(this==o){
			return true;
		}
		//如果对比对象是空,则直接返回false
		if(o==null){
			return false;
		}
		//如果对比对象的类型和本对象不符合,则返回false
		if(!(o instanceof Student3)){  //object instanceof Class 将return object是否是Class的一个实例	
			return false;
		}
		//将引用转换为Student3类型好进行对比
		Student3 s=(Student3)o;
		//对比Student3的名字,返回结果
		if(this.name.equals(s.name)){
			return true;
		}else{
			return false;
		}
	}
重写equal方法时要注意,参数一定要是object类型,否则不会构成重写,还要遵守几个原则:如果两个类的引用相同,就返回true,如果对比类引用为空或者两个类类型不一样,返回false,其他情况就进行自己的对比逻辑。

hashCode方法:

重写了equal方法就必须重写hashCode方法,equal返回true,hashCode必须相等,hashCode不相等,equal必须false。对于哈希存储结构,两个对象的hashCode相等的情况下,再比较两个对象的equal,这样的结构使查找更简单。

hashCode可以和类中的某些成员联系起来,用成员创建hashCode值。


java中常用集合框架的层次关系如图


其中collection,set,List,Map,SortedMap是接口,其他是类。继承关系如图所示。


对于集合框架中元素的没骗人排序有Ordered和Sorted两种

Ordered是后天指定排序,以下类属于ordered:ArrayList,Venctor,LinkedList

Sorted是指先天顺序排序:TreeSet,TreeMap,SortedSet,SortedMap


列表接口List,它的元素按照索引顺序访问,实现该接口的类都属于Ordered型.它的常用方法有add,addAll,clear,contants,get,remove,set等等

列表的实现主要有:数组实现ArrayList,向量实现Vector,链表实现LinkedList

ArrayList数组实现,基于数组实现的,对元素的随机访问性能较好,但是如果有大量的插入删除,则性能很差。

Vector向量实现,它和ArrayList基本相同,不过该类是同步的,同一时刻只能有一个线程访问。

LinkedList链表实现,它以来内部双链表实现,具有很好的插入删除性能,但是随机访问性能比较差。


如果想把数组转换为List,可以使用静态方法,Arrays.asList(T a)


集合:Setj接口和它的子接口子类都成为集合,Set中不能有重复的元素,Set中元素没有顺序。 

HashSet是最常用的实现之一,HashSet既不是ordered也不是sorted,元素存储不保证任何顺序。

LinkedHashSet类是ordered,采用双链表,元素在其中有固定的顺序。也就是插入的顺序。


SortedSet接口与TreeSet类

SortedSet接口是sorted的,其中的元素会按照天然顺序进行排序,TreeSet是这个接口的实现,TreeSet里的元素会按照天然顺序排序。如果要将自己开发的类作为元素放入TreeSet,就必须实现Comparable接口,用于排序。Comparable接口中的int comparaTo(Object o)方法,用于比较对象,返回值为负数就是小于,0就是等于,正数就是大于。

可以为单独制作一个比较器,创建一个类实现Comparator接口,实现其中的int compara(Object o1,Object o2)方法,再把这个比较器类传递给TreeSet构造函数中,就可以按照这个比较器的规则进行排序。


集合的遍历

1迭代器 每个集合(Collection,Set)都有一个迭代器方法,返回一个迭代器, 方法名为iterator。创建一个Iterator 对象,Iterator it=hashset.iteator();就可以使用it对象的next,hasnext,remove方法遍历集合。

2for-each

java5.0以后可以使用这个方法遍历集合,

for(引用类型 引用变量:引用集合){

//操作引用变量

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值