集合框架 --简述

集合框架

集合用来存放数据,是一种容器

集合的长度是可变的,而数组的长度是固定的

集合中存储的元素必须是引用类型的

集合不接受基本类型,但是java的自动装箱机制会把基本类型转换为相对的类

Collection接口

在这里插入图片描述

collection常用的子接口有 : List接口、Set接口

List接口常用子类有 : ArrayList类、LinkedList类

Set接口常用子类有 : HashSet类、LinkedHashSet类

Collection接口方法

  • add() 向集合中添加元素
  • clear() 清空集合中的元素
  • contains() 查看集合中是否包含元素,包含返回true
  • remove() 删除集合中第一个出现的元素,如果没找到返回false,
  • size() 返回集合中元素的个数
  • toArray() 将集合转换成数组
  • iterator() 返回容器的迭代器

Collection遍历

Iterator迭代器

所有集合容器使用迭代器进行遍历的方式一致

迭代器的并发修改异常 java.util.ConcurrentModificationException 迭代器在工作的时候不允许对集合进行修改

方法
  • hasNext() 如果仍有元素可以迭代,返回true

  • next() 返回迭代的下一个元素

  • remove() 从迭代器指向的collection容器中移除迭代器返回的最后一个元素

只有next()方法才会使指针后移,hasNext()不会改变指针位置

如果hasNext()返回false代表后面没有元素了,如果这时调用next()会抛出NoSuchElementException异常

原则上iterator只能使用一次,指针不会向前移

foreach

优点 : 方便对容器进行遍历

缺点 : 没有索引,不能更改容器中的元素

List接口

特性

有序、有索引、可以存储重复元素

实现类

数组

ArrayList

查询快,增删慢 空参构造创建一个初始容量10的空列表

Vector 被ArrayList取代 线程安全,运行速度慢

链表

LinkedList 查询慢,增删快 提供了大量的操作首位的方法 getFirst() getLast() 没有元素会抛出异常java.util.NoSuchElementExcption 加判断条件 list.size() != 0 或 !list.isEmpty()

方法

add() 添加

get() 查询

remove() 删除

set() 修改, 返回修改之前的元素

遍历

for

foreach

Set接口

不允许添加重复元素、没有索引、取出元素的方式只有foreach、迭代器

基于map、可以存储null

HashSet

哈希表 存储查找都快 线程不安全

空参构造 初始容量16 加载因子0.75

哈希值

如果没有重写hashCode()方法, 每次返回的哈希值都不同

哈希值是存储到HashSet集合的依据

String类重写了Object父类hashCode()方法
public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}
哈希表存储

在容器中找到hash值相同的元素,并且equals方法比较两个元素返回true,则判定已经存在元素

在容器中找到hash值相同的元素,并且equals方法比较两个元素返回false,则以桶的方式存储当前元素

在容器中没有找到hash值相同的元素,存储当前元素

存储自定义对象要重写hashCode()方法和equals()方法

//例如
public int hashCode(){
    //*55降低hashCode()的重复概率
    return name.hashCode() + name * 55;
}
public boolean equals(Object obj){
    if(this == obj){
        return true;
    }
    if(obj == null){
        return null;
    }
    if(obj intanceof Person){
        Person p = (Person)obj;
        return name.equlas(p.name) && age == p.age;
    }
    return false;
}

LinkedHashSet

基于LinkedHashSet 基于链表的哈希表实现、继承HashSet

具有顺序,存储和取出的顺序相同、线程不安全

HashSet()和equals()

ArrayList的contains(Obj)方法基于equals()方法实现

HashSet的add()方法基于hashcode()和equals()方法实现

存储自定义对象要重写hashCode()方法和equals()方法

hashCode常规协定:

两个对象哈希值相同,equals不一定返回true

两个对象equals返回true,两个对象哈希值一定相同

Map接口

在这里插入图片描述

常用实现类

HashMap

哈希表结构 存取顺序不保证一致 需要重写hashCode() equals()方法 允许存储null

LinkedHashMap

HashMap的子类 哈希表+链表结构 通过链表结构保证存取顺序一致 通过哈希表保证键唯一 需要重写hashCode() equals()方法

Hashtable

哈希表结构 特点同HashMap 线程安全集合,运行速度慢 被取代 不允许存储null

但他的子类 Properties 常用

方法

put(K,V) 存储重复键的时候,会返回被覆盖之前的值 否则返回null

V get(K) 查询,没有键返回null

remove() 移除键值对,返回被删掉的值

size()返回映射关系的个数

遍历

使用keySet() 方法
  • keySet() 返回键的Set集合(HashMap$KeySet HashMap内部类 KeySet)
  • 遍历Set集合,获取Map中的键
  • 调用get()方法,通过键获取值
使用Map.Entry对象
  • entrySet() 返回 Set(Map.Entry<K,V>) 返回映射关系Entry的Set集合
  • 遍历Set集合,获取映射关系对象Map.Entry<K,V>
  • 使用Map.Entry<K,V>对象的getKey() 和 getValue()方法获取键值对

不能直接遍历Map!

Collections工具类

方法

Collections.sort(List) 对List集合进行升序排列

Collections.binarySearch(List, Ele) 二分法查找 数据必须有序排列 找到返回索引index,没找到返回(-插入点-1)

Collections.shuffle(List) 对List 中的元素进行随机排列

猜你喜欢

转载自blog.csdn.net/sougou_1323/article/details/90077208