Java基础04—集合

本文是学习Java时所记录的学习笔记,本节包含了集合的介绍,重点记录了集合中特性的部分,是从《疯狂Java讲义第四版》中学习。欢迎留言、私信交流~~

集合API

继承树
Collection集合体系的继承树
Map集合体系的继承树

Collection集合

  • Java Collection Framework API。也叫容器类。
  • 只存储了一组对象,一次可以添加一个元素。
  • 三种底层模式:数组、栈(先进后出)、队列(先进先出)。
Set集合
  • 就是Collection。它们的行为完全相似。
  • 该类是子接口,相当于标准的Collection。
  • Collection相关方法
    • removeALL() //集合相减。
    • addALL() //集合相减,不重复。
    • retainAll() //求交集部分。
  • 遍历Set集合,有两种方式:
    1. 用迭代器。
      //例子
      Iterator it = paramMap.entrySet().iterator();
      //判断是否还有值
      while (it.hasNext()){
          //把it中的当前值取出来,强转为键值对类型
          Map.Entry entry = (Map.Entry)it.next();
          String mapKey = entry.getKey();
          String mapValue = "";
          //通常map中value的类型是String[],一般需要先将value赋值给object,然后通过判断再赋值给String[]
          Object obj = entry.getValue();
          if(obj instanceof String[]){
              String[] strs = (String[])obj;
              mapValue = Arrays.toString(strs);
          }
      }
      
    2. 用foreach循环。
HashSet
  • HashSet的存储机制:底层用一个数组存元素,数组元素只能是2的N次方。
  • 最理想的情况向,HashSet的性能几乎可以和数组匹敌,存储性能非常高。
  • 通过计算HashCode来确认元素存储位置(所以可以说是无序存储)。
  • HashSet是Set的实现类。
  • 在HashSet没有大量出现“链表”的情况下,HashSet性能比TreeSet性能好。
  • 如果经常出现“rehash”,性能就没有TreeSet好。
  • 构造器
    • HashSet的构造器:HashSet(int initialCapacity,float loadFactor)
      • [initialCapacity] - 控制底层数组的长度,默认是16。如果传入的数组长度不是2的N次方,则HashSet会自动将他扩展到2的N次方。
      • [loadFactor] - 当HashSet元素达到这个百分比时(默认0.75),再次创建一个长度为原有数组长度2倍的数组。原来的数组变为垃圾——并且要把原有数组的元素复制到新数组种,专业说法叫“rehash(重hash)”。
  • HashSet存入机制
    1. 当有元素加进来时,HashSet会调用该对象的hashCode()方法,得到一个int值。
    2. 根据hashCode()返回的int值,计算出它在【底层数组】的存储位置(数组中索引)。
    3. 如果要加入的位置是空的,直接放入。
    4. 如果要加入的位置已经有元素,此处就会形成“链表”。
  • HashSet取元素机制
    1. 当有取一个元素时,HashSet会调用该对象的hashCode()方法,得到一个int值。
    2. 根据hashCode()返回的int值,计算出它在【底层数组】的存储位置。
    3. 如果该位置恰好是要找的元素,直接取出即可。
    4. 如果该位置有链表,HashSet要“逐个”搜索链表里的元素。
  • HashSet两个对象是相等的判断条件
    1. 两个对象的hashCode()返回值相等。
    2. 两个对象通过equals比较也返回true。
    3. 要求自定义类的hashCode()与equals()方法是一致的。(要求程序重写equals()所用的关键属性,与计算hashCode()所用到的关键属性相同)
  • 例子
    import java.util.*;
    HashSet<String> h1 = new HashSet<>();
    h1.add("1雷军");
    h1.add("2王兴");
    
LinkedHashSet
  • LinkedHashSet 是HashSet的子类,与HashSet的存储机制相似。
  • 但LinkedHashSet额外的维护一个链表,可以记住元素的添加顺序。
  • HashSet的子类,有序。
TreeSet
  • 保证Set里的元素是“大小”排序。字符串的大小是一次比较每个字符串unicode值。
  • 它是标准的“红黑树”。
  • 树 → 二叉树 → 排序二叉树 → 平衡排序二叉树 → 红黑树。
  • Set-SortedSet的实现类。
  • TreeSet的存入、检索机制
    1. 底层用一颗“红黑树”存放所有数据。
    2. 元素存入、检索的性能比较好。
  • TreeSet与HashSet的区别
    1. TreeSet不会像HashSet有“空”值。
    2. TreeSet可以保证集合元素是按“大小”排序的。
  • TreeSet两个对象判断相等的条件
    • 只要两个对象通过compareTo比较返回0,TreeSet认为他们是相等的。
  • 要求集合元素必须是可以比较大小的。
  • Java比较大小有两种方式:
    1. 自然排序(所有集合元素实现Comparable接口)
    2. 定制排序(要求创建TreeSet时,提供Comparator对象)
    3. Comparator对象负责对元素进行比较大小。
    4. 可以重写compare对TreeSet进行排序。对象的比较可以用compareTo。
List集合
  • 可以根据索引存储元素。
  • 子接口,线性表,数组实现存储元素。类似于竹筒,有索引。
ArrayList
  • List的实现类,数组实现。
    • 优点:可以根据底层数组的索引存取元素,所以性能非常快。
    • 缺点:当插入元素、删除元素,后面的所有元素要跟着整体移动。
  • ArrayList与Vector的区别
    • ArrayList与Vector的存储机制:
      • 它们底层完全基于数组。
    • ArrayList与Vector的区别:
      • Vector是老版本的技术。
      • ArrayList是线程不安全的,Vector是线程安全的。
      • ArrayList的性能比Vector要好。
      • 可以使用Collections把ArrayList转换成线程安全的。
LinkedList
  • 实现类,是List和Deque的实现类,链表。
  • 即是线性表,又是队列,还是栈。LinkedList底层是基于链表实现的。
    • 优点:插入元素、删除元素时,无需整体移动,所以性能非常快。
    • 缺点:由于底层采用链表存储元素,因此根据索引存取元素时,性能较慢。

Queue集合

  • 子接口,特征为队列:先进先出,后进后出。
Deque
  • 功能被限制的线性表。既是队列,又是栈。
  • Queue的子接口。是双端队列。可以先进先出和后进先出都可以。
ArrayDeque
  • Deque的实现类,基于数组实现。
  • 栈模式
    Dequ<String> deque = new ArrayDeque<>(); 
    //把Deque当栈用。
    push()  //存入
    pop()  //取出
    peek()  //访问栈顶元素,并不弹出
    
  • 队列模式
    Dequ<String> deque = new ArrayDeque<>(); 
    //把Deque当栈用。
    offer()  //添加元素
    poll()  //从队列头部取出元素
    peek()  //访问栈顶元素,并不弹出
    

Map集合

  • 每次可以添加一对元素,被称为双列集合。
  • 存放的内容为:key-value对。
  • 以键值对的形式存储数据,但键不能重复,键具有唯一性。
HashMap
  • 根据key的hashCode()方法的返回值来计算key的存、取位置。
  • HashMap判断两个key重复的条件
    1. 通过equals比较返回true。
    2. 两个key的hashCode()返回值相等。
Hashtable
  • Hashtable和HashMap几乎相同。
  • HashTable和HashMap的区别
    1. Hashtable是从JDK1.0就有的,尽量少用。
    2. Hashtable不允许使用unll作为key、value。但HashMap允许。
    3. Hashtable是线程安全(实现不好),HashMap是线程不安全。HashMap性能好。
TreeMap
  • 底层的红黑树只对key进行排序。
  • treeMap要求key必须是可比较大小:
    1. 自然排序:要求所有key实现Comparable接口。
    2. 定制排序:要求创建TreeMap时提供一个Comparator接口。
  • treeMap判断两个key重复的条件
    • 通过compareTo()比较大小时返回0,表明两个元素相等。

操作集合的工具类(collections)

  • Collections类
    方法名称说明
    reverse()反转
    synchronizedXxx把原有的集合,包装成线程安全的集合。
    sway(List<?> list,int i,int j)把指定集合的2个位置互换。
    shuffle(List<?> list)将list集合元素进行随机排列。

相关知识

参考资料
  • 《疯狂Java讲义(第4版)》 李刚
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值