容器介绍
容器架构图
Map
Map自成一体,其根接口不是Collection。Map接口有两个子类HashMap和TreeMap。HashMap有一个子类LinkedHashMap.
各个容器之间继承(接口实现)关系简要介绍
- Collection是Set、List、Queue的根接口。
- Map自成一体,Collection不是其父接口。
- Iterator是迭代器,用于遍历集合。
- Comparator是比较器,用于TreeSet中的排序。
Collection常用方法
增
boolean add(E e)
:向集合中添加元素boolean addAll(Collection c)
:向集合中添加参数中的所有元素
删
boolean remove(E e)
:若集合中存在e元素,则删除该元素,并返回true;否则,返回falseboolean removeAll(Collection c)
:从集合中删除参数中的所有元素void clear()
:清除集合中的所有元素
判断集合中是否存在元素
boolean contains(E e)
:判断集合中是否存在元素eboolean containsAll(Collection c)
:判断集合中是否存在参数中的所有元素
判空
boolean isEmpty()
:判断集合是否为空,如果为空返回true;否则返回false
迭代器
Iterator iterator()
:获取迭代器iterator.hasNext()
:判断容器中的元素是否遍历完毕iterator.next()
:返回迭代的下一个元素;iterator.next()的输出形式:key=valueiterator.remove()
:删除并返回上一次next()方法返回的元素iterator.forEachRemaining(lambda表达式)
:这是Java8为Iterator新增的方法,可使用lambda表达式来遍历容器中的元素
交集
boolean retainAll(Collection c)
:将集合与c中元素的交集存入集合中,原集合中的元素会被删除
长度
int size()
:获取集合的元素个数
转化成数组
Object[] toArray()
:把集合转化成数组
Collections
介绍
Collections是集合中的一个工具类,它里面提供了一系列静态方法用来操作集合元素。
Collections工具类中适用于List的静态方法
- 复制
Collections.copy(List dest,List src)
:把src集合中的元素复制到dest中- 注意点
- 如果src的长度大于dest的长度,那么会抛异常,复制失败。
- 如果src的长度等于dest的长度,那么dest中的元素会被全部替换掉。
- 如果src的长度(m)小于dest的长度(n),那么dest中的前m个元素会被src的元素替换掉,后面剩余的元素不变。
- 替换
Collections.fill(List<T> list,T obj )
:用obj将list中的所有元素都替换掉
- 随即调整
Collections.shuffle(List<T> list)
:使用默认源对集合随机调整Collections.shuffle(List<T> list,Random random)
- 排序
Collections.sort(List<T> list)
:根据元素的自然顺序来对集合中的元素进行递增排序
- 查找
Collections.min(List<T> list)
:返回经过排序后的第一个元素Collections.max(List<T> list)
:返回经过排序后的最后一个元素Collections.binarySearch(List<T> list,T obj)
:返回obj元素在list中的索引(索引从0开始计数)
Set
Set特点
元素无序且不可重复。(无序是指元素存入的顺序和元素取出的顺序是不一致的)
HashSet
HashSet存储元素时,是根据该元素的哈希码进一步计算出该元素在容器中的存储位置。而Set中不允许有重复元素,故当obj1.equals(obj2)为true时,就必须保证obj1和obj2的hashCode()是一样的。所以,自定义的类要存储到HashSet中,就必须重写equals()和hashCode()方法(两个方法必须都重写)。
TreeSet
简要介绍
TreeSet是SortedTree的实现类,所以TreeSet里面的元素需要排序。排序有两种方式:自然排序和指定排序。
自然排序
实现方式
在自定义的类对象中去继承Comparable接口,并实现compareTo(Object obj)方法;该方法比较自定义类与obj的大小,若前者大,则返回一个大于0的整数;若两者相等,则返回0;若后者大,则返回一个小于0的整数。
public class Person implements Comparable {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
//重写equals方法
public boolean equals(Object obj) {
Person p = null;
if (obj instanceof Person) {
p = (Person) obj; //强转
if ((p.name.equals(this.name)) && (p.age == this.age))
return true;
}
return false;
}
@Override
// 重写hashCode方法
public int hashCode() {
int code;
code = (this.name == null ? 0 : this.name.hashCode());
code = 10 * this.age + code;
return code;
}
// 实现compareTo方法
@Override
public int compareTo(Object obj) {
// 自定义比较规则:按名字拼音排序,如果名字相同,则按年龄排序(递增排序)
Person p = null;
if (obj instanceof Person)
p = (Person) obj; //强转
Comparator comparator = Collator.getInstance(Locale.CHINA); //获取按照名字拼音排序的比较器
int result = comparator.compare(this.name, p.name);
if (result == 0) //名字相同
return this.age > p.age ? 1 : (this.age == p.age ? 0 : -1);
else
return result;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}