由于不同的数据结构(数据的组织,存储方式),所以Java为我们提供了不同的集合。
集合体系形成的原因,是由于各类集合的功能都是类似的,不断的向上提取,抽取共性,形成集合体系。
有这样一个特点,最顶层包括有所有集合的共性,而最底层有最具体的实现。
而根据它们不同的特点,大致可以分为两类:
- 有序(存储和读取的顺序是一致的),允许重复,有整数索引。如:Collection,List,ArrayList,LinkedList(链表集合)遍历方法有四种:
1.for循环,通过整数索引遍历;
public static void findAllStudent(ArrayList<Student> arr){//查看所有学生信息
if (arr.size() == 0){
System.out.println("目前没有数据,请重新选择操作");
return;
}
System.out.println("学号\t\t姓名\t年龄\t居住地");
for (int i=0;i<arr.size();i++){
Student s = arr.get(i);
System.out.println(s.getId() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
}
}
2.通过 Iterator 迭代器对象(相当于创建一个对象的副本)遍历;PS:此方法需要注意并发修改异常,即不能直接修改原集合对象的元素,而是通过修改 Iterator 迭代器对象的元素来改变原集合对象元素。
Collection c1 = new ArrayList();
c.add("hello");
c.add("world");
Iterator it1 = c.iterator();
while (it1.hasNext()){//通过迭代器循环遍历集合
System.out.println(it1.next());
}
3.通过toArray()方法,将集合转化为数组遍历;
Collection<String> c = new ArrayList<String>();
c.add("hello");
c.add("world");
Object[] obj = c.toArray();
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
4.通过foreach加强循环遍历
private static void method() {
HashSet<Student> hs = new HashSet<Student>();
//创建元素对象
Student s = new Student("aa","12");
Student s1 = new Student("bb","13");
//添加元素对象
hs.add(s);
hs.add(s1);
//遍历集合对象
for (Student s2:hs
) {
System.out.println(s2);
}
}
- 无序(存储和读取的顺序有可能不一样),不允许重复(普通元素通过 equals 和 hashcode 方法判断,引用类型元素需自行重写hashcode 和 equals 方法),无索引,可添加Null元素(只允许有一个)。如:Set,HashSet,Map(双列集合),HashMap <Key,Value>(键值映射关系对象,key不允许重复)
由于没有索引,所以无序集合无法使用for循环方法遍历,故只有之上的2,3,4,三种遍历方法。
PS:HashSet的add()方法查找不能去重的原因在于,对于自定义的引用对象,无法对其成员变量进行逻辑的比对,所以需自行在类中重写其中的Hashcode和equals方法,同时可根据自身具体要求,重写tostring方法,使其打印输出简洁化。如:
class Student {
private String name;
private String age;
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;//比较地址值
if (o == null || getClass() != o.getClass()) return false;//是否为空,检验当前类的类型是否一样。提高安全性
Student student = (Student) o;
return name.equals(student.name)&&age.equals(student.age);//成员变量比较
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}