Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中
各接口的特点
Collection接口存储一组不唯一,无序的对象
LIst接口存储一组不唯一,有序(插入顺序)的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射,一对一。
Collection接口常用方法
方法 | 说明 |
boolean add(Object o) | 从末尾添加元素o |
boolean addAll(Collection c) | 把一个集合中的所有元素添加到集合 |
boolean remove(Object o) | 删除指定元素 |
boolean removeAll(Collection c) | 从集合中删除一个指定的集合元素,该元素是两个集合的交集部分 |
void clear() | 删除集合中的所有元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean containsAll(Collection c) | 判断集合中是否存在指定的一个集合中的元素,当前集合元素调用equals方法,与集合c挨个比较 |
Iterator iterator() | 实现遍历功能,获取集合中的每一个元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 获取集合中元素的个数 |
boolean retainAll(Collection c) | 把当前集合与集合c的共有元素存入当前元素中,并且不影响集合c |
注意:上述两个contains方法,如果是自定义的对象,则需要在对象中重写Object的equals方法,否则比较的是地址值。重写后比较属性值。
List接口的实现类
ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
LinkedList采用链表存储方式,插入、删除元素时效率比较高
ArrayList集合类常用方法
方法 | 说明 |
boolean add(Object o) | 在列表末尾添加元素o,起始索引位置从0开始 |
void add(int index,Object o) | 在指定索引位置添加元素o,索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中元素的个数 |
Object get(int index) | 返回指定索引位置的元素,取出的元素时Object类型的,使用之前需要强制类型转换 |
void set(int index,Object obj) | 将index索引位置的元素替换为obj元素,覆盖。 |
boolean contains(Object o) | 判断列表中是否存在指定元素o |
int indexOf(Object obj) | 获取列表中指定元素obj的索引位置 |
boolean remove(Object o) | 从列表中删除元素o |
Object remove(int index) | 从列表中删除指定索引位置的元素,索引起始位置从0开始 |
LinkedList独有方法
方法 | 说明 |
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回当前集合的首位元素 |
Object removeLast() | 删除并返回当前集合的末尾元素 |
Set接口的常用实现类
Set接口描述的是一种比较简单的一种集合,集合中的对象并不按特定的方式排序,并且不能保存重复的对象。
HashSet是Set接口的常用实现类。而Set接口继承了Collection接口,同时没有添加新的方法,所以在使用上与List接口的实现类使用方式一致。
但是,要注意的是Set接口不存在get方法,也就是没有List接口中通过索引取值的方法。
没有get方法Set集合要怎么遍历输出呢?
方法1:增强for循环
方法2:通过迭代器Iterator实现遍历
获取Iterator :Collection 接口的iterator()方法
Iterator的方法:
boolean hasNext(): 判断是否存在另一个可访问的元素
Object next(): 返回要访问的下一个元素
Map接口
key使用Set存储,不允许重复;value使用Collection存储。Map对象所对应的类必须重写hashCode() 和equals( )
常用实现类,HashMap 、 TreeMap 、LinkedHashMap
map接口的常用方法
方法 | 说明 |
Object put(Object key,Object value) | 将相互关联的一个key与一个value放入该集合中,如果此接口中已经包含了key对应的value,新的value值将对旧value覆盖 |
Object remove(Object key) | 从当前集合中移除与指定key相关的映射值value,并返回该key值关联的旧value值,如果旧value没有关联,就返回null |
Object get(Object key) | 获得与key值相对应的value值,没有则返回null |
boolean containsKey(Object key) | 判断指定key值在本集合中存不存在 |
boolean containsValue(Object value) | 判断集合中是否存在value |
boolean isEmpty() | 判断集合是否为空 |
void clear() | 清除集合中的所有元素 |
int size() | 返回集合中元素的数量 |
Set keySet() | 遍历集合中的key值(获取集合中所有key值的集合) |
Collection values() | 获取所有value的集合 这个地方返回的是collection接口,使用的时候需要实例化。最简单的方式是利用list的构造函数实现,List =ArrayList(Collection<? extends E>) |
遍历Map集合
方法1:先遍历key,再通过key值来遍历value值(增强for,Iterator)
方法2:遍历key-value对,使用entrySet()(增强for,Iterator)
Set set = hashMap.entrySet();
for(Object key:set){
Map.Entry entry = (Map.Entry) key;
System.out.println(entry.getKey()+"-"+entry.getValue());
由于集合中啥类型都能放,我们在获取集合中存放元素时,最后输出类型默认值为Object,无法确定具体类型,在我们需要强制类型转换时,容易出现异常问题。所以我们需要引入一个新的概念,泛型,它在集合中的体现"<E>,<K,V>"用来表示泛型集合中的元素类型,泛型集合中的数据不再转换为Object,相较之前的集合,就多了一个指定元素类型外,泛型集合和集合没有区别,用法完全一致。JDK5.0使用泛型改写了集合框架中的所有接口和类。
Collections算法类
Java集合框架将针对不同数据结构算法的实现都保存在工具类中
Collections类定义了一系列用于操作集合的静态方法
Collections和Collection不同,前者是集合的操作类,后者是集合接口
Collections提供的常用静态方法
- sort():排序
- binarySearch():查找
- max()\min():查找最大\最小值
- reverse():反转元素顺序
实现一个类的对象之间比较大小(单纯比较是判断地址值,需要比较其中某个成员变量时要实现以下方法)
- 该类要实现Comparable接口
- 重写compareTo()方法
- 该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。
public class Student implements Comparable<Student>{
public static void main(String[] args) {
Student s1 = new Student(1, "zhangsan", 18);
Student s2 = new Student(1, "zhangsan", 18);
System.out.println(s1.compareTo(s2));
}
//输出0,表示两个对象的id相等;输出-1表示s2.id<s1.id;输出1表示s2.id>s1.id
//输出结果:0
private int id;
private String name;
private int age;
private Genders gender;
public Student() {
}
public Genders getGender() {
return gender;
}
public void setGender(Genders gender) {
this.gender = gender;
}
public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
if(this.id==o.id){
return 0;
}else if(o.id<this.id){
return 1;
}else{
return -1;
}
}
}