Java的Collection集合

目录

1.集合与数组的区别

2.集合框架介绍

3.list集合

4.Set集合

 5.Map集合

6.迭代器

7.增强for循环


1.集合与数组的区别

  • 数组的长度是固定的,集合的长度是可变的。
  • 数组中存储的是统一类型的元素,可以存储基本数据类型值;集合存储的都是对象,而且对象的类型可以不一致。

2.集合框架介绍

  • Collection接口(父类)
    • 定义
      • 所有单列集合都可以使用共性的方法
      • 没带索引的方法
      • 所有单列集合中共性的方法
    • 分类
      • List接口:有序的集合,允许存储重复的元素,有索引,可以使用普通的for循环
        • ArrayList集合:底层是数组实现的,查询快,增删慢。
        • LinkedList集合:底层是链表实现的,查询慢,增删快。
        • Vector集合
      • Set接口:不允许存储重复的元素,没有索引
        • HashSet集合:无序,底层是哈希表+(红黑树)实现的,无索引,不可以存储重复的元素、存取无序。
        • LinkedHashSet集合:有序,底层是哈希表+链表实现的,无索引,不可以存储重元素,可以保证存取顺序。
        • TreeSet集合:底层是二叉树实现的,一般用于排序。
    • 常用方法
// 添加元素
boolean add(E e);
// 删除集合中的某个元素
boolean remove(E e);
// 清空集合
void clear();
// 判断集合中是否包含某个元素
boolean contains(E e);
// 判断集合是否为空
boolean isEmpty();
// 获取集合长度
int size();
// 将集合转换成一个数组
Object[] toArray();
// 往集合中添加一些元素
Collections.addAll(list,"a","b","c");
//打乱集合顺序
Collections.shuffle(list);
//将集合中的元素安装默认顺序进行排序
Collections.sort(list);
//重写排序规则   this-参数就是升序, 参数-this就是降序
public int compartTo(Presion o){
    return this.age()-0.age();  // 升序
}

Map接口(父类)

  • 特点
    • Map集合是一个双列结合,一个元素包含两个值(一个key,一个value)。
    • Map集合中的元素,key和value的数据类型可以是相同的,也可以是不同的。
    • Map集合中的元素,key是不允许重复的,value是可以重复的。
    • Map集合中的元素,key和value是一一对应的。
  • 分类
    • HashMap
    • LinkedHashMap
    • HashTable
  • 常用方法
// 将指定的键与指定的值添加到Map集合中
public V put(K key, V value);
    返回值:V
        存储键值对的时候,key不重复,返回V是null
        如果key重复,会使用新的value替换Map中重复的value,返回被替换的值
// 获取指定的键所对应的键值
public V get(K key);
// 把指定的键所对应的键值在Map集合中删除,返回被删除的元素
public V remove(K key);
// 判断集合中是否包含指定的键,包含返回true
boolean containsKey(K key);

3.list集合

  • 特点
    • 有序的集合,存储元素和取出元素是一致的。
    • 有索引,包含一些带索引的方法。
    • 允许存储重复的元素。
    • 注意:操作索引的时候,一定要防止索引越界。
  • 带索引的方法
    // 将指定的元素,添加到该集合中的指定位置上
    public void add(int index, E e);
    // 返回集合中指定位置的元素
    public E get(int index);
    // 移除列表中指定位置的元素,返回的是被移除的元素
    public E remove(int index);
    // 用指定元素替换集合中指定位置的元素,返回的是更新前的元素
    public E set(int index, E e);

     

  • ArrayList集合
    • 底层是数组结构,查找快,增删慢。
    • 线程异步的,不安全。
    • 增长率是当前数组的50%。
  • LinkedArrayList集合 
    • 特点
      • 底层是链表结构,查找慢,增删快。
      • 里面包含了大量操作首尾元素的方法。
      • 注意:使用LinkedArrayList集合特有的方法不能使用多态。
    • 常用方法
// 将指定的元素插入此列表的开头
public void addFirst(E e);
// 将指定的元素插入此列表的结尾
public void addList(E e);
// 将元素入栈
public void push(E e);
// 从此列表所表示的堆栈中弹出一个元素
public E pop();

// 返回此列表的第一个元素
public E getFirst();
// 返回此列表的最后一个元素
public E getLast()l

// 移除并返回此列表的第一个元素
public E removeFirst();
// 移除并返回此列表的最后一个元素
public E removeLast();

  •  vector数组
    • 特点
      • 底层也是一个数组。
      • 线程同步的,某一个时刻只有一个线程能写Vector,所以是线程安全的。
      • 访问速度比ArrayList快。
      • 增长率是当前数组的100%。

4.Set集合

  • 特点
    • 不允许重复的元素。
    • 没有索引,没有带索引的方法,也不能使用普通的for循环遍历。
  • HashSet
    • 特点
      • 是一个无序的集合,存储元素和取出元素的顺序可能不一致。
      • 底层是一个哈希表结构,查询速度快。
    • 哈希表
      • 哈希值:是一个十进制的整数,由系统给出
        // 返回该对象的哈希值,native代表该方法调用的是本地操作系统的方法
        public native int hashCode();

         

      • 解决冲突的方法
        • 开放地址法
        • 再哈希法
        • 链地址法
        • 建立公共溢出区
      • JDK1.8之前:哈希表=数据+链表
      • JDK1.8之后:
        • 哈希表=数组+链表
        • 哈希表=数组+红黑树(链表长度超过8位,就会把链表转换为红黑树)
    • HashSet集合不能重复的原因
      • Set集合在调用add方法的时候,add方法会调用元素的hashcode方法和equals方法,判断元素是否重复
      • 前提:存储的元素必须重写hashcode和euqals方法
  • LinkedHashSet
    • 特点
      • 底层是一个哈希表+链表,多了一条链表用于记录元素的存储顺序,保证元素有序。

 5.Map集合

  • 遍历
    • 通过键找值的方法
      • Map集合中的方法
        // 返回此映射中包含的键的Set视图
        Set<K> keySet();

         

      • 实现步骤
        • 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中。
        • 遍历set集合,获取Map集合中的每一个key。
        • 通过Map集合中的方法get(key),通过key找到value。
      • 实例
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while(it.hasNext()){
    String key = it.next();
    Integer value = map.get(key);
    System.out.println(value);
}

for(String key:map.keySet()){
    Integer value = map.get(key);
    System.out.println(value);
}
  • 使用entrySet对象进行遍历
    • Map集合中的方法
      // 返回此映射中包含的映射关系的set视图
      Set<Map.Entry<K,V>> entrySet();

       

    • 实现步骤
      • 使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中。
      • 遍历Set集合,获取每一个entry对象。
      • 使用entry对象中的方法getKey()和getValue()获取键和值。
    • 实例
      Set<Map.Entry<String, Integer>> set = map.entrySet();
      Iterator<Map.Entry<String, Integer>> it = set.iterator();
      while(it.hasNext()){
          Map.Entry<String, Integer> entry = it.next();
          String key = entry.getKey();
          Integer value = entry.getValue();
      }
      for(Map.Entry<String, Integer> entry:set){
          String key = entry.getKey();
          Integer value = entry.getValue();
      }

       

  • HashMap
    • 特点
      • 底层是哈希表,查询速度快
      • JDK1.8之后是数组+单向链表/红黑树
    • 存储自定义类型键值
      • Key:String类型
        • String类型必须重写hashCode方法和equals方法,保证key的唯一
      • Value:Person类型
      • HashMap<String,Person> map = new HashMap<>();
  • LinkedHashMap
    • 特点
      • 底层是哈希表+链表
      • 是一个有序的集合,存储元素和取出元素的顺序是一定的
  • HashTable
    • 底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快,可以存储null值和null键

6.迭代器

迭代器是一个接口,无法直接使用,需要使用Iterator接口的实现类对象。Collection接口中有一个方法:Iterator(),这个方法返回迭代器的实现类对象。

Iterator<E> iterator();
  • (1) 常用方法
// 判断是否有元素可以继续迭代,有则返回true
boolean hasNext();
// 返回迭代的下一代元素
E next();
  • (2) 使用步骤
    • 使用集合中的方法Iiterator()获取迭代器的实现类对象,使用Iterator接口接收。
    • 使用Iterator接口中的方法hasNext()判断还有没有下一个元素。
    • 使用Iterator接口中的方法next()取出集合中的下一个元素。
  • (3) 实例
Collection<String> coll = new ArrayList();
coll.add("1");
coll.add("1");
coll.add("1");
coll.add("1");

Iterator<String> it = coll.iterator();
while(it.hasNext()){
    String s = it.next();
}

for(Iterator<String> it = coll.iterator(); it.hasNext()){
    String s = it.next();
}

7.增强for循环

  • (1) 格式
for(集合/数组的数据类型 变量名:集合名/数组名){
    sout(变量名);
}
  • (2) 实例
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("1");
list.add("1");
list.add("1");
for(String s:list){
    System.out.println(s);
}

int[] arr = {1,2,3,4,5};
for(int i:arr){
    System.out.println(i);
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值