集合类(HashSet)

单列集合:Collection(接口)

双列集合:Map(接口)

Collection中的两个重要子接口:List、Set

List:元素有序、可重复。线性存储(包括顺序存储和链式存储),可以通过索引的方式来访问集合中指定的数组。三个重要的实现类:ArrayList(顺序存储,适合查找,线性不安全)、LinkedList(链式存储,适合增删)、Vector(线性安全)

Set:元素无序、不可重复。

ArrayList:内部封装了一个长度可变的数组对象,当存入的元素超过数组元素时会在内存中分配更大的数组来存储这些元素,可以看作是一个长度可变的数组。ArrayList集合的底层是使用一个数组来保存元素,集合进行更改时就会创建新的数组。不适合进行增删操作。

LinkedList:集合内部维护了一个双向循环表,增删操作效率很高。

Iterator接口:迭代访问(遍历集合)

foreach循环:遍历数组或者集合的元素。

Iterator:调用ArrayList集合的Iterator()方法获取对象,使用hasNext()方法判断是否有下一个元素,使用next()方法取得元素。可以使用Iterator中额remove()删除元素

Enumeration接口:遍历集合,和Iterator接口很相似。在Vector中提供返回对象的方法。

package study;
import java.util.*;
import java.util.ArrayList;
public class Example24 {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("data_1");
list.add("data_2");
list.add("data_3");
list.add("data_4");
Iterator it=list.iterator();
while(it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}
}
}


foreach:自动遍历容器中的每一个元素,但是不能修改。

(this表示本对象,比如你这样调用equals函数:stu1.equals(stu2),this就表示stu1)
HashSet:

对于HashSet的hashcode()和equals的重写,另一个网站有更详细的解释,下面是我复制过来的一部分:(http://www.cnblogs.com/happyPawpaw/p/3744971.html)

【object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true 
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()】

在向HashSet集合添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素。

package study;
import java.util.*;
class Student1{
private String id;
private String name;
public Student1(String id, String name) {
this.id = id;
this.name = name;
}
public String toString(){
return id+":"+name;
}
public int hashCode(){
return id.hashCode();
}
public boolean equals(Object obj){
if(this==obj){
return true;
}
if(!(obj instanceof Student1)){
return false;
}
Student1 stu=(Student1) obj;
boolean b=this.id.equals(stu.id);
return b;
}
}
public class Example25 {
public static void main(String[] args) {
HashSet hs=new HashSet();
Student1 stu1=new Student1("1","Jack");
Student1 stu2=new Student1("2","Rose");
Student1 stu3=new Student1("2","Rose");
hs.add(stu1);
hs.add(stu2);
hs.add(stu3);
System.out.println(hs);
}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值