Java集合02

1. Set集合

(1) Set集合的特点
  无序,唯一
(2) HashSet集合
  A:底层数据结构是哈希表(是一个元素为链表的数组)
  B:哈希表底层依赖两个方法:hashCode()和equals()
    执行顺序:
      首先比较哈希值是否相同
      相同:继续执行equals()方法
        返回true:元素重复了,不添加
        返回false:直接把元素添加到集合
      不同:就直接把元素添加到集合
  C:如何保证元素唯一性的呢?
    由hashCode()和equals()保证的
  D:开发的时候,代码非常的简单,自动生成即可
  E:HashSet存储字符串并遍历
  F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
  G:不保证set的迭代顺序,特别是它不保证该顺序恒久不变
(3) LinkedHashSet集合
  A:元素有序唯一。由链表保证元素有序,由哈希表保证元素唯一
(4) TreeSet集合
  A:底层数据结构是红黑树(是一个自平衡的二叉树) -> 保证元素的排序和唯一性
  B:保证元素的排序方式
    a:自然排序(元素具备比较性)
      让元素所属的类实现Comparable接口
    b:比较器排序(集合具备比较性)
      让集合构造方法接收Comparator的实现类对象
(5) 遍历
  A:HashSet集合
    a:用Iterator来遍历
    b:用增强for来遍历
  B:TreeSet集合

2. Collection集合总结
Collection
  |--List 有序,可重复
    |--ArrayList
      底层数据结构是数组,查询快,增删慢。
      线程不安全,效率高
    |--Vector
      底层数据结构是数组,查询快,增删慢。
      线程安全,效率低
    |--LinkedList
      底层数据结构是链表,查询慢,增删快。
      线程不安全,效率高
  |--Set 无序,唯一
    |--HashSet
      底层数据结构是哈希表。
      如何保证元素唯一性的呢?
        依赖两个方法:hashCode()和equals(),开发中自动生成这两个方法即可
      执行顺序:
        首先判断hashCode()值是否相同
          是:继续执行equals(),然后看其返回值,是true:说明元素重复,不添加,是false:就直接添加到集合
          否:就直接添加到集合
        最终:自动生成hashCode()和equals()即可
    |--LinkedHashSet
      底层数据结构是链表和哈希表
      由链表保证元素有序
      由哈希表保证元素唯一
    |--TreeSet
      底层数据结构是红黑树。
      如何保证元素排序的呢?
        自然排序(元素具备比较性),让元素所属的类实现Comparable接口
        比较器排序(集合具备比较性),让集合接收一个Comparator的实现类对象
      如何保证元素唯一性的呢?
        根据比较的返回值是否是0来决定

3. 针对集合我们到底使用谁呢?

是否是键值对象形式:
  是:Map
    键是否需要排序:
      是:TreeMap
      否:HashMap
    不知道,就使用HashMap。

  否:Collection
    元素是否唯一:
      是:Set
        元素是否需要排序:
          是:TreeSet
          否:HashSet
        不知道,就使用HashSet
      否:List
        要安全吗:
          是:Vector(其实我们也不用它,后面我们讲解了多线程以后,我在给你回顾用谁)
          否:ArrayList或者LinkedList
            增删多:LinkedList
            查询多:ArrayList
          不知道,就使用ArrayList
    不知道,就使用ArrayList

4. 在集合中常见的数据结构
ArrayXxx:底层数据结构是数组,查询快,增删慢
LinkedXxx:底层数据结构是链表,查询慢,增删快
HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

5. Map
(1) 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
(2) Map和Collection的区别?
  A:Map 存储的是键值对形式的元素,键唯一,值可以重复。
  B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。
  C:Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效。
(3) Map接口功能概述
  A:添加功能 V put(K key,V value)
  B:删除功能 V remove(Object key)
  C:判断功能 boolean containsKey(Object key) / boolean containsValue(Object value) / boolean isEmpty()
  D:获取功能 V get(Object key)
  E:长度功能 int size()
  F:遍历相关功能 Set<K> keySet() / Set<Map.Entry<K,V>> entrySet() / Collection<V> values()
(4) Map接口的实现
  A:HashMap
    基于哈希表的Map接口实现。哈希表的作用是用来保证键的唯一性的。
  B:LinkedHashMap
    是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
    由哈希表保证键的唯一性,由链表保证键盘的有序(存储和取出的顺序一致)
  C:TreeMapTreeMap
    基于红黑树的Map接口的实现
(5) Map集合的遍历
  A:键找值
    a:获取所有键的集合
    b:遍历键的集合,得到每一个键
    c:根据键到集合中去找值
  B:键值对对象找键和值
    a:获取所有的键值对对象的集合
    b:遍历键值对对象的集合,获取每一个键值对对象
    c:根据键值对对象去获取键和值

代码体现:

Map<String,String> hm = new HashMap<String,String>();

hm.put("it002","hello");
hm.put("it003","world");
hm.put("it001","java");

//方式1 键找值
Set<String> set = hm.keySet();
for(String key : set) {
    String value = hm.get(key);
    System.out.println(key+"---"+value);
}

//方式2 键值对对象找键和值
Set<Map.Entry<String,String>> set2 = hm.entrySet();
for(Map.Entry<String,String> me : set2) {
    String key = me.getKey();
    String value = me.getValue();
    System.out.println(key+"---"+value);
}

(6) 思考题
  A:HashMap和HashTable的区别
    a:Hashtable:线程安全,效率低。不允许null键和null值
    b:HashMap:线程不安全,效率高。允许null键和null值
  B:List,Set,Map等接口是否都继承子Map接口?
    List,Set不是继承自Map接口,它们继承自Collection接口
    Map接口本身就是一个顶层接口

6. Collections
(1) 是针对集合进行操作的工具类
(2) 思考题:Collection和Collections的区别
  A:Collection 是单列集合的顶层接口,有两个子接口List和Set
  B:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等
(3) 常见的几个小方法:
  A:public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
  B:public static <T> int binarySearch(List<?> list,T key):二分查找
  C:public static <T> T max(Collection<?> coll):最大值
  D:public static void reverse(List<?> list):反转
  E:public static void shuffle(List<?> list):随机置换

原文地址:https://www.cnblogs.com/nomad1c/p/11707041.html

时间: 2024-08-02 03:38:22

Java集合02的相关文章

Java—集合02

1.Iterator迭代器 Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来.一直把集合中的所有元素全部取出.这种取出方式专业术语称为迭代. 集合中把这种取元素的方式描述在Iterator接口中.  常用的方法:   判断集合中是否有下一个元素可以替代,如果可以替代则返回true:hasNext() / boolean;   返回迭代的下一个元素并把指针向下移一位:naxt() / E;   Colle

Java 集合系列 02 Collection架构

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 首先,我们对Collection进行说明.下面先看看Collection的一些框架类的关系图: Collection是一个接口,它主要的两个分支是:List 和 Set. List和Set都是接口,它们继承于Collection.L

Java多线程系列--“JUC集合”02之 CopyOnWriteArrayList

概要 本章是"JUC系列"的CopyOnWriteArrayList篇.接下来,会先对CopyOnWriteArrayList进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一步的了解CopyOnWriteArrayList.内容包括:CopyOnWriteArrayList介绍CopyOnWriteArrayList原理和数据结构CopyOnWriteArrayList函数列表CopyOnWriteArrayList源码分析(JDK1.7.0_40版本)Copy

20180826(02)-Java集合框架

Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题.由于这个原因,使用Vector类的方式和使用Properties类的方式有着很大不同. 集合框架被设计成要满足以下几个目标. 1.该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 2.该框架允许不同类型的集合,以类似的方式工作,

【Java集合源码剖析】HashMap源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,

java集合之整体架构

Java集合框架总结 Java集合是java 提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). Java集合工具包框架图(如下): 大致说明: 看上面的框架图,先抓住它的主干,即Collection和Map. 1. Collection是一个接口,是高

java集合18--Iterator和Enumeration比较

概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括: 第1部分 Iterator和Enumeration区别 第2部分 Iterator和Enumeration实例 转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311275 第1部分 Iterator和Enumeration区别 在Java集合中,我们通常都通过 "Iterator(迭代器)" 或 &qu

Java集合源码学习笔记(三)LinkedList分析

前面学习了ArrayList的源码,数组是顺序存储结构,存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1),数组的特点是寻址容易,插入和删除困难.今天学习另外的一种常用数据结构LinkedList的实现,LinkedList使用链表作为存储结构,链表是线性存储结构,在内存上不是连续的一段空间,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N),链表的特点是寻址困难,插入和删除容易.所有的代码都基于JDK 1.6. >>关于LinkedLis

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数