【黑马程序员】集合

面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。

 

2:Set集合
 (1)Set集合的特点
  无序,唯一
 (2)HashSet集合(掌握)
  A:底层数据结构是哈希表(是一个元素为链表的数组)
  B:哈希表底层依赖两个方法:hashCode()和equals()
    执行顺序:
   首先比较哈希值是否相同
    相同:继续执行equals()方法
     返回true:元素重复了,不添加
     返回false:直接把元素添加到集合
    不同:就直接把元素添加到集合
  C:如何保证元素唯一性的呢?
   由hashCode()和equals()保证的
  D:开发的时候,代码非常的简单,自动生成即可。
  E:HashSet存储字符串并遍历
  F:HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)
 (3)TreeSet集合
  A:底层数据结构是红黑树(是一个自平衡的二叉树)
  B:保证元素的排序方式
   a:自然排序(元素具备比较性)
    让元素所属的类实现Comparable接口
   b:比较器排序(集合具备比较性)
    让集合构造方法接收Comparator的实现类对象
  C:把我们讲过的代码看一遍即可
 (4)案例:
  A:获取无重复的随机数
  B:键盘录入学生按照总分从高到底输出
  
3:Collection集合总结(掌握)
 Collection
  |--List 有序,可重复
   |--ArrayList
    底层数据结构是数组,查询快,增删慢。
    线程不安全,效率高
   |--Vector
    底层数据结构是数组,查询快,增删慢。
    线程安全,效率低
   |--LinkedList
    底层数据结构是链表,查询慢,增删快。
    线程不安全,效率高
  |--Set 无序,唯一
   |--HashSet
    底层数据结构是哈希表。
    如何保证元素唯一性的呢?
     依赖两个方法:hashCode()和equals()
     开发中自动生成这两个方法即可
    |--LinkedHashSet
     底层数据结构是链表和哈希表
     由链表保证元素有序
     由哈希表保证元素唯一
   |--TreeSet
    底层数据结构是红黑树。
    如何保证元素排序的呢?
     自然排序
     比较器排序
    如何保证元素唯一性的呢?
     根据比较的返回值是否是0来决定
     
4:针对Collection集合我们到底使用谁呢?(掌握)
 唯一吗?
  是:Set
   排序吗?
    是:TreeSet
    否:HashSet
  如果你知道是Set,但是不知道是哪个Set,就用HashSet。
   
  否:List
   要安全吗?
    是:Vector
    否:ArrayList或者LinkedList
     查询多:ArrayList
     增删多:LinkedList
  如果你知道是List,但是不知道是哪个List,就用ArrayList。
 
 如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
 
 如果你知道用集合,就用ArrayList。
 
5:在集合中常见的数据结构(掌握)
 ArrayXxx:底层数据结构是数组,查询快,增删慢
 LinkedXxx:底层数据结构是链表,查询慢,增删快
 HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
 TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

 

1:Map集合(掌握)
 (1)Map集合存储的是键值对元素。键是唯一的,值可以重复。

 (2)Map和Collection的区别?
  A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。
  B:Collection是单列集合,存储的元素是单一的,List集合可以重复,Set集合元素唯一。
 (3)Map集合的功能
  A:添加功能
   V put(K key,V value)
  B:删除功能 
   remove(K key)
  C:判断功能
   containsKey(K key)
   containsValue(V value)
  D:获取功能
   V get(K key)
   Set<K> keySet()
   Collection<V> values()
   Set<Map.Entry<K,V>> entrySet()
    Map.Entry:
     getKey
     getValue
  E:长度功能
   int size()

 (4)Map集合的数据结构问题:
  Map集合的数据结构对键有效,跟值无关。

  它的底层数据结构和Set中讲解的一致。
   如果是哈希表结构,就需要重写hashCode()和equals()。
   如果是二叉树结构,就有两种方式:Comparable,Comparator
 (5)Map的遍历方式
  假设有一个HashMap集合,存储的键和值都是String类型。名称叫hm。

  A:根据键找值(掌握)
   a:获取所有键的集合
   b:遍历键的集合,获取到每一个键
   c:根据键找值

   代码体现:
   
   Set<String> set = hm.keySet();
   for(String key : set) {
    String value = hm.get(key);
    System.out.println(key+"---"+value);
   }

  B:根据键值对对象找键和值(理解)
   a:获取所有键值对对象的集合
   b:遍历键值对对象的集合,获取到每一个键值对对象
   c:根据键值对对象获取键和值

   代码体现:

   Set<Map.Entry<String,String>> set = hm.entrySet();
   for(Map.Entry<String,String> me : set) {
    String key  = me.getKey();
    String value = me.getValue();
    System.out.println(key+"---"+value);
   }
 (6)案例:
  A:统计一个字符串中每个字符出现的次数
  B:Map集合的嵌套存储和遍历
 (7)Map集合的体系
  Map
   |--HashMap
    |--LinkedHashMap
   |--Hashtable
   |--TreeMap

  A:HashMap和Hashtable的区别?
  B:LinkedHashMap的键的特点?


2:集合总结(什么时候使用谁?)
 是否键值对:
  是:Map
   是否排序:
    是:TreeMap
    否:HashMap
   不知道,HashMap
  否:Collection
   是否唯一:
    是:Set
     是否排序:
      是:TreeSet
      否:HashSet
     不知道,HashSet
    否:List
     增删多:LinkedList
     查询多:ArrayList

     不知道,ArrayList
  不知道,用ArrayList

3:集合体系总结
 集合:
  |--Collection
   |--List
    |--ArrayList
     底层数据结构是数组,查询快,增删慢。
     线程不安全,效率高。
    |--Vector
     底层数据结构是数组,查询快,增删慢。
     线程安全,效率低。
    |--LinkedList
     底层数据结构是链表,查询慢,增删快。
     线程不安全,效率高。
   |--Set
    |--HashSet
     底层数据结构是哈希表。
     如何保证唯一性?
      依赖hashCode()和equals()
     顺序:
      先判断hashCode()值是否相同:
       是:继续走equals(),看返回值
        true:元素重复。不添加
        false:元素不重复。添加
       否:直接添加
     |--LinkedHashSet
      底层数据结构是链表和哈希表。
       由链表保证有序(存储和取出一致)。
       由哈希表保证元素唯一。
    |--TreeSet
     底层数据结构是二叉树。
     如果保证唯一性?
      根据返回值是否是0。
     如何排序:
      自然排序:Comparable
      比较器排序:Comparator
  |--Map
   |--HashMap
    |--LinkedHashMap
   |--Hashtable
   |--TreeMap


  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值