一、Collections集合工具类
(1)常用方法
- Collections.min();最小值
- Collections.max();最大值
- Collections.sort();对集合进行排序
- Collections.swap();交换集合中指定元素索引的位置
- Collections.reverse();反转集合中元素的顺序
- Collections.shuffle();对集合进行随机排序
- Collections.fill();替换集合list中的所有元素
- Collections.copy();将集合a中的元素全部复制到b中,并且覆盖相应索引的元素
- Collections.replaceAll();替换指定元素为某元素,替换值存在刚返回true,反之返回false
- Collections.indexOfSubList();查找子集在list中首次出现位置的索引
- Collections.lastIndexOfSubList();查找子集在list中最后一次出现位置的索引
- Collections.binarySearch);查找指定集合中的元素,返回所查找元素的索引
- Collections.rotate();集合中的元素向后移m个位置,在后面被遮盖的元素循环到前面来
(2)设置比较规则
//如果age为int类型需要转为Integer
private class MyComparator implements Comparator<Person>{
@Override
public int compare(Person o1, Person o2) {
return o1.getAge().compareTo(o2.getAge());
}
}
public class Person implements Comparable<Person> {
public Integer age;
public String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Person o) {
return this.age.compareTo(o.getAge());
}
}
二、List集合
(1)集合常用方法
- list.add();添加数据
- list.addAll();添加数据集合
- list.remove();删除数据
- list.removeAll();删除数据集合
- list.set();修改数据
- list.get();查找数据
- list.subList();截取集合(包前不包后)
- list.clear();清空集合数据
- list.isEmpty();判断集合中是否存在元素
- list.size();获取集合大小
- list.toArray();集合变数组
- list.contains();List中是否包含该元素
- list.containsAll();List中是否包含该集合
- list.indexOf();List中首次出现该元素的位置。
- list.lastIndexOf();List中最后一次出现该元素的位置。
- list.iterator();迭代器,用于遍历取出元素
(2)ArrayList详解
- ArrayList是基于数组实现的list类,ArrayList其实是对数组的动态扩充,底层的数据结构使用的是数组结构,不指定的话长度默认为10。
- ArrayList插入数据可以重复,也是有序的,按照插入的顺序来排序。修改或查询数据相对快。添加或删除数据相对慢,因为需要移动大量的数据。ArrayList是线程不安全的。
- list.ensureCapacity();扩充原有的数组
(3)LinkedList详解
- LinkedList是基于链表实现的双向链表数据结构。它每一个节点都包含三方面的内容:节点本身的数据、前一个节点的信息、下一个节点的信息。
- 增加或删除数据相对快。修改或查询数据相对慢,因为需要遍历查找
(4)Vector
- Vector中的很多重要方法都是用synchronized实现同步,保证线程安全。Vector是线程安全的ArrayList。
二、set集合
(1)HashSet
- HashSet无序不允许集合元素的重复,可以存储null。底层数据结构是哈希表。根据hashCode来决定存储位置的。非线程安全,存取速度快。
- 通过hashCode和equals来保证元素的唯一性。如果元素的hashCode相同才会判断equals是否为true。如果hashCoed的值不同,则不会调用equals。
(2)TreeSet
- TreeSet不允许集合元素的重复。底层数据结构是二叉树,线程不安全。可以对Set集合中的元素进行排序
- TreeSet的排序让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo方法,如果两个对象通过compareTo()方法比较相等,那么新的元素将无法添加到TreeSet集合中。
public class Person implements Comparable<Person> {
public Integer age;
public String name;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Person o) {
return this.age.compareTo(o.getAge());
}
}
- 当元素本身不具备比较性,或者具备的比较性不是所需的,就需要让集合自身具备比较性
public static void treeSetTest(){
TreeSet treeSet = new TreeSet(new Comparator(){
public int compare(Object o1,Object o2){
M m1 = (M)o1;
M m2 = (M)o2;
return m1.age > m2.age ? -1 : m1.age < m2.age ? 1 : 0;
}
});
treeSet.add(new M(2));
treeSet.add(new M(8));
treeSet.add(new M(5));
treeSet.add(new M(-3));
}
static class M(){
int age;
public M(int age){
this.age = age;
}
}
(3)LinkedHashSet
- LinkedHashSet不允许集合元素的重复。集合也是根据元素的hashCode值来决定元素的存储位置,但和hashSet不同的是它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。linkedHashSet按元素的添加顺序来访问集合里的元素。(LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能,但是在遍历Set里面的全部元素将有很好的性能)
三、Map集合
- Map<K, V>集合是一个接口,和Collection集合不同的是,它是双列集合,也就是说他所存储的是键值对。其中键要求唯一,一个键不能对应多个值。
- put():添加键值对
- get():根据键获取值
- containsKey():判断是否包含键
- containsValue();判断是否包含值
- remove():删除键值对
- replace():替换新值,返回老值
- replace(K key, V oldValue, V newValue):替换新值
- Set<Map.Entry<K,V>> entrySet(): 包含所有键值对的Map对象的Set集合
- Collection<V> values(): 获取包含所有值的Collection集合
- Set<K> keySet(): 获取包含所有键的Set集合
(1)TreeMap
- TreeMap是平衡排序二叉树(红黑树)结构,按自然排序或比较器存入元素以保证元素顺序。TreeMap的键保唯一性,取决于比较方法和比较器。非线程安全。
(2)HashMap
- HashMap是哈希表结构,不保证存取顺序,允许null键或者null值。HashMap的键保持唯一性,取决于hashCode以及equals方法。非线程安全,效率较高。
(3)HashTable
- HashTable时哈希表结构,不保证存取顺序,不允许null键或者null值,线程安全,效率较低,已经被HashMap替代
(4)LinkedHashMap
- LinkedHashMap是带双向链表的哈希表结构,保持存取顺序,允许null键和null值,非线程安全,效率较高。