一、Collection
是所有集合的根接口
二、List
是一个接口,表示有序(存入和取出)可重复集合,可以保存null元素 。
List常用的子类有ArrayList、LinkedList、Vector
1.ArrayList
内部基于数组实现的一个集合类,且数组的大小可变。查询比较快,添加和删除相对于LinkedList较慢
ArrayList添加数据与遍历
ArrayList bag = new ArrayList();
bag.add("电脑");
bag.add(200);
bag.add("鼠标");
bag.add("小人书");
bag.add("教材");
bag.add("牛奶");
//使用普通for循环,foreach都可以
for(int i=0;i<bag.size();i++){
System.out.println(bag.get(i));
}
使用迭代器遍历,迭代器分为单向迭代器(Iterator)和双向迭代器(ListIterator)
单向迭代器:while循环完毕指针移动到末尾,如果再进行第二次迭代输出,是不会有任何结果输出
ArrayList bag = new ArrayList();
//获取单向迭代器
Iterator it = bag.iterator();
//boolean hasNext() 判断是否有下一个元素,如果返回true表示有下一个
while(it.hasNext()){
//Object next() 调用一次获得一个元素(每调用一次指针会向后移动一个)
System.out.println(it.next());
}
双向迭代器:指针移到末尾还可以再末尾遍历到头部
ArrayList bag = new ArrayList();
// 获得双向的迭代器
ListIterator iterator = bag.listIterator();
//这里和单向迭代器一样
while(iterator.hasNext()){
System.out.println(iterator.next());
}
//boolean hasPrevious() 判断是否有上一个
while(iterator.hasPrevious()){
//Object previous() 调用一次获得一个元素(每调用一次指针会向上移动一个)
System.out.println(iterator.previous());
}
2.LinkedList
内部是基于链表结构实现的。添加和删除比较快,查询相对ArrayList比较慢
LinkedList bag = new LinkedList();
bag.add("电脑");
bag.add(200);
bag.add("鼠标");
bag.add("小人书");
bag.add("教材");
bag.add("牛奶");
循环遍历的方式也是那四中方式,普通for循环、增强for循环、单项迭代器、双向迭代器
相对于ArrayList而言还多了一些操作头和尾的方法
3. Vector
本质就是线程安全的ArrayList
三、Set
不可重复集合,可以保存null元素
1.HashSet
判断重复的机制:先判断元素的hashCode值,在hashCode相等的情况下,继续判断equals比较,如果都相等认为是同一个元素
HashSet遍历只有增强for循环和单向迭代器
HashSet<Object> hashSet = new HashSet<>();
Collections.addAll(hashSet, "电脑","牛奶","教材","鼠标",21,5.3);
for (Object object : hashSet) {
System.out.println(object);
}
//单向迭代器
Iterator<Object> iterator = hashSet.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
2.TreeSet
TreeSet有自然排序和定制排序
自然排序,元素类型必须实现Comparable接口,且必须重写compareTo()方法
/**
* TreeSet判断重复与hashcode和equals无关,而是通过实现Comparable的compareTo()方法
* 0是代表重复,正数是升序,负数是降序
*/
class User implements Comparable<User>{
String name;
public User(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return "[" + name + "]";
}
/**
* 通过名字长度升序排列
*/
@Override
public int compareTo(User o) {
if (this.name.length() > o.name.length()) {
return 1;
} else if(this.name.length() < o.name.length()){
return -1;
}else {
return 0;
}
}
TreeSet<Object> treeSet = new TreeSet<>();
User user1 = new User("张三");
User user2= new User("李狗蛋");
User user3 = new User("张三");
User user4 = new User("王鑫");
User user5 = new User("刘琦");
treeSet.add(user1);
treeSet.add(user2);
treeSet.add(user3);
treeSet.add(user4);
treeSet.add(user5);
System.out.println(treeSet);
结果
定制排序,Comparator接口的实现类,必须重写compare方法
class StudetComparator implements Comparator<Student>{
/**
* 年龄升序,名字降序
*/
@Override
public int compare(Student o1, Student o2) {
if (o1.id > o2.id) {
return 1;
}else if (o1.id < o2.id) {
return -1;
}else {
if (o1.name.length() > o2.name.length()) {
return -1;
}else if (o1.name.length() < o2.name.length()) {
return 1;
}else {
return 0;
}
}
}
}
TreeSet<Student> treeSet = new TreeSet<>(new StudetComparator());
Student student1 = new Student(13, "帝弟");
Student student2 = new Student(13, "黄岚岚");
Student student3 = new Student(45, "施施");
Student student4 = new Student(45, "帝弟");
Student student5 = new Student(24, "琪琪");
//Collections添加方法
Collections.addAll(treeSet, student1,student2,student3,student4,student5);
System.out.println(treeSet);
结果