集合类
java.util包中提供了一些集合类,这些集合类称为容器。
集合类与数组的不同之处是数组长度是固定的,集合类的长度是可变的。
数组用来存放基本类型的数据,集合用来存放对象的引用。
Collection接口
构成Collection的单位称为元素
Collection接口通常不能直接使用,但该接口提供添加元素、删除元素、管理数据的方法
体系结构:
-
怎么学习?最顶层开始学习,因为最顶层包含了所有的共性
-
怎么使用?使用最底层,因为最底层就是具体的实现
package e5;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Muster {
public static void main(String[] args) {
// TODO Auto-generated method stub
Collection<String> list=new ArrayList<String>(); //实例化集合类对象
//向集合添加元素
list.add("a");
list.add("b");
list.add("c");
Iterator<String> it=list.iterator();//创建迭代器
while(it.hasNext()) { //判断是否有下一个元素
String str=(String)it.next();
System.out.println(str);
}
}
}
Iterator的next方法返回的是Object
List 集合
-
List接口
-
重要方法
get(int index):
获得指定索引位置的元素set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象
-
通过ArrayList 、LinkedList类实例化List集合,代码如下:
List<E> list=new ArrayList<E>();
List<E> list2=new LinkedList<E>();
package e5;
import java.util.ArrayList;
import java.util.List;
public class Gather {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String > list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
int i=(int)(Math.random()*list.size()); //获得0~2之间的随机数
System.out.println("随机获取数组中的元素:"+list.get(i));
list.remove(2);
System.out.println("将索引是2的元素从数组移除后,数组中的元素是:");
for(int j=0;j<list.size();j++) {
System.out.println(list.get(j));
}
}
}
ArrayList类实现了可变数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的访问。
LinkedList类采用链表保存对象
与数组相同,集合的索引也是从0开始
Set集合
set 的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object ).
set接口常用的实现类
HashSet类实现Set接口,有哈希表支持。它不保证Set的迭代顺序,特别是它不保证该顺序是恒久不变的,此类允许使用null元素。
TreeSet类不仅实现了Set接口,还实现了java。util.SortedSet接口;Set集合在遍历 集合时按照自然顺序递增排序。
public class HashSetDemo2 {
public static void main(String[] args) {
//创建集合对象
HashSet<Student> hs = new HashSet<Student>();
//创建元素对象
Student s = new Student("zhangsan",18);
Student s2 = new Student("lisi",19);
Student s3 = new Student("lisi",19);
//添加元素对象
hs.add(s);
hs.add(s2);
hs.add(s3);
//遍历集合对象
for (Student student : hs) {
System.out.println(student);
}
}
}
package com.itheima_01;
import java.util.HashSet;
/*
* 使用HashSet存储自定义对象并遍历
* 通过查看源码发现:
* HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,
* 如果hash值不一样,则直接添加新的元素
* 如果hash值一样,比较地址值或者使用equals方法进行比较
* 比较结果一样,则认为是重复不添加
* 所有的比较结果都不一样则添加
*/
public class HashSetDemo2 {
public static void main(String[] args) {
//创建集合对象
HashSet<Student> hs = new HashSet<Student>();
//创建元素对象
Student s = new Student("zhangsan",18);
Student s2 = new Student("lisi",19);
Student s3 = new Student("lisi",19);
//添加元素对象
hs.add(s);
hs.add(s2);
hs.add(s3);
//遍历集合对象
for (Student student : hs) {
System.out.println(student);
}
}
}
class Student {
String name;
int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj) {
//System.out.println("-------------------");
Student s = (Student)obj;//向下转型,可以获取子类特有成员
//比较年龄是否相等,如果不等则返回false
if(this.age != s.age) {
return false;
}
//比较姓名是否相等,如果不等则返回false
if(!this.name.equals(s.name)) {
return false;
}
//默认返回true,说明两个学生是相等的
return true;
}
@Override
public int hashCode() {
return 1;
}
}