集合

集合框架

集合,数组都是对多个数据进行存储操作的结构,简称java容器。

java集合可分为Collection和Map两种体系

  • Collection接口(单列)
    • List 元素有序,可重复的集合
      • ArrayList
      • LinkedList
      • Vector
    • Set 元素无序,不可重复的集合
      • HashSet
      • LinkedHashSet
      • TreeSet
  • Map接口(双列 KV)
    • HashMap
    • LinkedHashMap
    • TreeMap
    • Hashtable
    • Properties

Collection接口的方法

  1. Collection coll = new ArrayList();
  • add(Object e) 将元素添加到集合
  • size() 获取添加元素的个数
  • addAll(Collection coll1) 将coll1集合中的元素添加到当前的集合中
  • isEmpty() 判断集合是否为空
  • contains() 判断当前集合中是否包含obj 会调用所在类的equals方法
  • containsAll() 判断形参coll中所有的元素是否都在当前集合中
  • remove() 从当前集合中移除obj元素
  • removeAll(Collection coll1) 从当前集合移除coll1中所有元素
  • retainAll(Collection coll1) 获取交集
  • equals() 集合是否相同
  • hashCode() 返回当前对象的哈希值
  • toArray() 集合到数组的转换
  • iterator() 返回Iterator接口的实例,用于遍历元素
    • iteraor对象称为迭代器,主要用于遍历Collection集合中元素,即提供一种方法,而又不暴露该对象的内部细节。迭代器模式就是为容器而生。
    • 继承了java.lang.Iterable接口
    • 仅用于遍历集合
    • 每次调用都得到一个全新的迭代器对象
    • next()
    • hasnext()
        1. while(iterator.hasNext()){
        2. System.out.println(iterator.next());
        3. }

List接口
  • 动态数组
  • 三个实现类
    • ArrayList
      • 作为List接口主要实现类
      • 线程不安全 效率高
      • 使用object[] elementData存储
    • LinkedList
      • 底层使用双向链表存储
      • 用于频繁插入和删除操作
    • Vector
      • 古老实现类
      • 线程安全的 效率低(使用synchronized实现)
      • object[] elementData

函数使用

  • ArrayList
    • add()
    • addall()
    • indexOf() 集合中首次出现的位置
    • LastIndexOf()
    • remove(int index) 按索引删除
    • remove(Object o) 按元素删除
    • subList(int fromIndex, int toIndex) 返回左闭右开集合

源码解析

  • ArrayList
    • ArrayList list = new ArrayList();
    • jdk7 底层创建了长度为10的Object[]数组 默认扩容到1.5倍,将原有数据复制到新数组中
    • jdk8 变化 声明时创建空列表 在使用add方法时长度为10
  • LinkList
    • LinkedList list = new LinkList();
    • 链表
  • Vector
    • 不用了
    • 通过Vector构造器 创建长度为10
      Set接口
  • 存储无序的不可重复的数据
  • 向Set中添加的数据,其所在类一定要重写hashCode()和equals()
  • HashSet
    • Set接口主要实现类
    • 线程不安全 可以存储Null值
    • 底层数组+链表
  • LinkedHashSet
    • 作为HashSet子类
    • 可按添加顺序遍历
    • 为每个数据维护两个引用
    • 用于频繁便利
  • TreeSet
    • 可以按照添加对象进行排序
    • 不能添加不同类的对象
    • 两种排序接口
      • 所用到的Person类

public class Person implements Comparable {
private String name;
private int age;

  1. public String getName() {
  2. return name;
  3. }
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public void setAge(int age) {
  8. this.age = age;
  9. }
  10. public int getAge() {
  11. return age;
  12. }
  13. public Person(String name, int age) {
  14. this.name = name;
  15. this.age = age;

}

  1. @Override
  2. public String toString() {
  3. return "Person{" +
  4. "name='" + name + '\'' +
  5. ", age=" + age +
  6. '}';
  7. }
  8. @Override
  9. public boolean equals(Person o) {
  10. if (this == o) return true;
  11. if (o == null || getClass() != o.getClass()) return false;
  12. return age == person.age && Objects.equals(name, person.name);
  13. }
  14. @Override
  15. public int hashCode() {
  16. return Objects.hash(name, age);

}

  1. ```java
  2. public Person() {
  3. }
  4. //按照姓名从小到大排列, 年龄从小到大
  5. @Override
  6. public int compareTo(Person o) {
  7. Person user = (Person) o;
  8. //return this.name.compareTo(user.name);
  9. int compare = this.name.compareTo(user.name);
  10. if(compare !=0){
  11. return compare;
  12. }else {
  13. return Integer.compare(this.age,user.age);
  14. }
  15. }
  1. - 自然排序 实现Comparable接口
  2. - ```java
  3. @Override
  4. public int compareTo(Person o) {
  5. //return this.name.compareTo(user.name); 先比较name再比较age
  6. int compare = this.name.compareTo(user.name);
  7. if(compare !=0){
  8. return compare;
  9. }else {
  10. return Integer.compare(this.age,user.age);
  11. }

}

TreeSet set = new TreeSet(com); //初始化

  1. - 定制排序 实现Comparator接口
  2. - ```java
  3. Comparator com = new Comparator() {
  4. //按照年龄排列
  5. @Override
  6. public int compare(Object o1, Object o2) {
  7. if(o1 instanceof Person && o2 instanceof Person){
  8. Person u1 = (Person) o1;
  9. Person u2 = (Person) o2;
  10. return Integer.compare(u1.getAge(), u2.getAge());
  11. }else {
  12. throw new RuntimeException("输入的数据类型有误");
  13. }
  14. }
  15. };
  16. TreeSet set = new TreeSet(com); //初始化

Map方法

  • HashMap
    • Map的主要实现类
    • 线程不安全
    • 可以存储Null
    • LinkedHashMap 适用于频繁遍历操作
  • TreeMap
    • 实现排序遍历
    • 考虑key的自然或定制排序
    • 底层使用红黑树实现
  • Hashtable
    • 古老实现类
    • 线程安全
    • Properties:用来处理配置文件 KV均为String
  • HashMap的底层实现原理 (JDK7)
    • Hash map = new HashMap();
      • 底层创建了长度16的Entry[]数组
      • map.put(k1,v1);
      • 调用k1所在类的hashCode()计算哈希值,得到在Entrey中存放的位置
      • 如果此外无 则成功
      • 如果不为空 比较k1的哈希值 ,
        • 不同 添加成功(以链表实现)
        • 相同 调用k1的equals()方法,
          • 如果false,添加成功(以链表实现)
          • 如果true ,替换value
      • 默认扩容为原来的2倍
      • JDK8中 声明时未创建 Node[]非Entry[]
      • jdk7只有数组+链表
      • jdk8 数组+链表+红黑树
        • 当数组的某一个索引的位置的元素以链表形式存在且个数>8 且当前数组的长度>64时,此时索引上的位置所有数据改为红黑树存储
  • Map结构的理解
    • key 无序 不可重复 Set存储
    • Value 无序 可重复 Collection存储
    • entry 无序 不可重复 Set存储
  • 方法

    • Map map = new HashMap();
    • rmove()
    • put()
    • putAll()
    • size()
    • clear()
    • get()
    • isEmpty()
    • containsKey()
    • Set keySet() 返回所有key构成的集合

        1. Set set = map.keySet();
        2. Iterator iterator = set.iterator();
        3. while (iterator.hasNext()){
        4. System.out.println(iterator.next());
        5. }
    • Collection values() 返回所有value构成的Collection集合

        1. Collection collection =map.values();
        2. for(Object obj : collection){
        3. System.out.println(obj);
        4. }
    • Set entrySet() 返回所有key-value对构成的Set集合

        1. Set entrySet = map.entrySet();
        2. Iterator iterator1 = entrySet.iterator();
        3. while (iterator1.hasNext()){
        4. Object obj = iterator1.next();
        5. // entrySet集合中的元素都是entry
        6. Map.Entry entry = (Map.Entry) obj;
        7. System.out.println(entry.getKey()+"-->"+entry.getValue());
        8. }

Collections

  • Collections是操作Collection ,Map的工具类
  • reverse(List)

  • shuffle(List) 随机排列
  • sort(List) 升序
  • sort(List , Comparator) 指定Comparator
  • swap(List , int i, int j) i处和j处交换
  • Object max(Collection)
  • Object max(Collection , Comparator) 返回给定的Comparator下的最大元素
  • Object min(Collection)
  • Object min(Collection, Comparator)
  • int frequency(Copllection, Object) 返回指定元素出现的次数
  • void copy(List dest,List src) 将src copy到dest中
  • bollean replaceAll(List list, Object oldVal, Object newVal) 替换