​​Java基础复习笔记 第12章:集合框架

1、集合与数组的对比

  • 数组的特点、弊端
数组存储多个数据方面的特点:

    > 数组中存储的多个元素是有序的、可以重复的的数据,紧密排列的
    > 数组在内存中使用一整块连续的内存空间进行存储
    > 数组一旦初始化,其长度就确定了。
    > 数组一旦声明,其元素的类型就确定了。不能添加非此类型的元素。
      Person[] arr = new Person[4];
      Object[] arr1 = new Object[5];

   数组存储多个数据方面的弊端:
    > 数组一旦初始化,其长度就不可变。
    > 数组可用的方法基本没有。涉及到的增删改查操作都需要自己编写代码
    > 对于无序的、不可以重复的多个数据,就不适合使用数组存储
  • 集合框架结构
Java集合框架体系(java.util包下)

java.util.Collection接口:存储一个一个的数据
    |----java.util.List子接口:有序的、可以重复的数据  ("动态"数组)
          |--- ArrayList(主要实现类) \ LinkedList \ Vector

    |----java.util.Set子接口:无序的、不可以重复的数据 (高中讲的集合)
          |--- HashSet(主要实现类) \ LinkedHashSet \ TreeSet

java.util.Map接口:存储一对一对(key-value)的数据 (高中讲的映射、函数 (x1,y1)、(x2,y2)  )
    |---- HashMap(主要实现类) \ LinkedHashMap \ TreeMap \ Hashtable \ Properties

2、Collection中的常用方法

1. 常用方法:(Collection中定义了15个抽象方法。这些方法需要大家熟悉!)


2. 集合与数组的相互转换:
Collection集合 ----> 数组: toArray()
数组 ----> Collection集合的子接口:List : 调用Arrays的静态方法asList(Object ... objs)


3. 向Collection中添加元素的要求:

添加的元素所在的类要重写equals(Object obj)

原因:因为Collection中的一些方法在调用时,要使用到元素所在类的equals()。
      比如:constais(Object obj) / remove(Object obj) ..
学习的程度把握:
> 第1层次:针对要存储的多个数据的特点,选择相关的接口的主要实现类,完成对象的创建、相关方法的调用
> 第2层次:需要熟悉接口的不同的实现类之间的区别,进而熟悉不同的场景下应该选择哪个实现类。

> 第3层次:熟悉不同的实现类的底层源码实现。--->间接考查数据结构。放到14章中讲。
         比如:HashMap、ArrayList/LinkedList/Vector、LinkedHashMap、HashSet

3、迭代器Iterator

1. 迭代器(Iterator)的作用?
用于遍历Collection集合元素。

2. 如何获取迭代器(Iterator)对象?
使用集合的iterator(),返回一个迭代器的对象

3. 如何实现遍历(代码实现)
while(iterator.hasNext()){
    //next():①指针下移 ② 将下移以后集合位置上的元素返回
    Object obj = iterator.next();
    System.out.println(obj);
}


4. 增强for循环(foreach循环)的使用(jdk5.0新特性)
4.1 作用
用于遍历集合元素、遍历数组元素

4.2 格式:
增强for循环格式:for(集合元素的类型 临时变量 : 要遍历的集合)


4.3 说明:
我们不要使用增强for循环来修改集合或数组中的元素。因为此操作常常失败。

4、Collection的子接口1:List接口

List及其实现类特点

java.util.Collection接口:存储一个一个的数据
    |----java.util.List子接口:有序的、可以重复的数据  ("动态"数组)
          |--- ArrayList:主要实现类;线程不安全的,效率高;底层使用Object[]存储
                         对于频繁的查找、尾部添加,性能较高,时间复杂度O(1)
          |--- LinkedList:使用双向链表存储数据;
                         对于频繁的删除、插入操作,性能较高,时间复杂度为O(1)
          |--- Vector:古老的实现类;线程安全的,效率低;底层使用Object[]存储
小结:
    增:add(Object obj) / addAll(Collection coll)

    删:remove(Object obj) / remove(int index)

    改:set(int index, Object ele)

    查:get(int index)

    插:add(int index, Object ele) / addAll(int index, Collection eles)

    长度:size()

    遍历:① 迭代器 ② 增强for ③ 一般的for

5、Collection的子接口2:Set接口

  • Set的实现类的特点
1. Set及其实现类特点
java.util.Collection接口:存储一个一个的数据
    |----java.util.Set子接口:无序的、不可以重复的数据 (高中讲的集合)
          |--- HashSet:主要实现类;底层使用数组+链表+红黑树结构进行存储(jdk8.0)
                |--- LinkedHashSet:是HashSet的子类;在底层使用Haset结构进行存储之外,又增加了一对
                                    双向链表,用于记录添加元素的先后顺序。对应频繁的遍历操作,性能较高。
          |--- TreeSet:底层使用红黑树进行存储。可以按照添加的元素的指定属性的大小顺序进行遍历。


2. 开发中的使用频率及场景:
> 使用频率较低;
> 使用场景:用于过滤重复数据
  • Set中的常用方法
Set中常用方法
就是Collection中定义的15个方法。
  • Set的实现类:HashSet
1. Set中无序性、不可重复性的理解(以HashSet及其子类为例说明)

> 无序性:!= 随机性, != 添加的顺序和遍历的顺序不一致。

> 不可重复性:哈希算法。  
以两个元素的比较来说,
    如果两个元素根据hashCode()方法计算得到的哈希值相同,且equals()判断时也返回true,则认为两个元素是相同的。
    如果两个元素根据hashCode()方法计算得到的哈希值不同,或者哈希值相同,但equals()判断时返回false,则认为两个元素是不同的。


2. 添加到HashSet/LinkedHashSet中元素的要求:
元素所在的类要重写两个方法:equals() 、 hashCode()。 使用IDEA自动生成即可。
重写时,要尽量保证equals() 、 hashCode()的一致性。
  • Set的实现类:TreeSet
1. 底层的数据结构:红黑树

2. 添加数据后的特点:可以按照添加的元素的指定的属性的大小顺序进行遍历

3. 向TreeSet中添加的元素的要求:
> 添加的多个元素,必须是同一个类的对象,即不能是不同类的对象。


4. 判断数据是否相同的标准
> 不再是equals() 和 hashCode()了。
> 应该是:
     自然排序,实现了Comparable接口,是否相同的标准在于compareTo()是否返回0
     定制排序,实现了Comparator接口,是否相同的标准在于compare()是否返回0

6、Map接口的使用

  • Map的实现类的对比
java.util.Map接口:存储一对一对(key-value)的数据 (高中讲的映射、函数 (x1,y1)、(x2,y2)  )
    |---- HashMap:主要实现类;线程不安全的,效率高;jdk7:数组+单向链表,jdk8:数组+单向链表+红黑树
    			   可以添加null的key或value
        |---- LinkedHashMap:继承于HashMap;在底层使用HashMap数据结构的基础上,又增加了一对双向链表,用于
                             记录添加元素的先后顺序。当遍历此集合时,就可以按照添加的顺序实现遍历。
                             对于频繁的遍历操作,建议使用此类。
    |---- TreeMap:底层使用红黑树结构存储;可以按照添加的key-value对的key的指定的属性的大小进行排序。
                   进而遍历时,也是按照key的指定的属性的大小顺序进行遍历的。
    |---- Hashtable:古老的实现类;线程安全的,效率低;数组+单向链表
    				不可以添加null的key或value
        |---- Properties:继承于Hashtable。key、value都是String类型,常用来处理属性文件。


[面试题]
HashMap的底层源码实现
HashMap和Hashtable的区别
HashMap、LinkedHashMap的区别
  • HashMap的存储数据的特点
HashMap中元素的特点
> HashMap中的所有的key彼此之间不相同,且无序。多个key构成一个Set。--->key所在的类要重写equals()、hashCode()
> HashMap中的所有的value彼此之间可以相同,且无序。多个value构成一个Collection。--> value所在的类要重写equals()
> HashMap中的一个key-value构成一个Entry。
> HashMap中的所有的entry彼此之间不相同,且无序。多个entry构成一个Set。
  • Map中的常用方法
Map中的常用方法
- 添加、修改操作:
  - Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
  - void putAll(Map m):将m中的所有key-value对存放到当前map中
- 删除操作:
  - Object remove(Object key):移除指定key的key-value对,并返回value
  - void clear():清空当前map中的所有数据
- 元素查询的操作:
  - Object get(Object key):获取指定key对应的value
  - boolean containsKey(Object key):是否包含指定的key
  - boolean containsValue(Object value):是否包含指定的value
  - int size():返回map中key-value对的个数
  - boolean isEmpty():判断当前map是否为空
  - boolean equals(Object obj):判断当前map和参数对象obj是否相等
- 元视图操作的方法:
  - Set keySet():返回所有key构成的Set集合
  - Collection values():返回所有value构成的Collection集合
  - Set entrySet():返回所有key-value对构成的Set集合

小结:
增:put(Object key,Object value)
删:remove(Object key)
改:put(Object key,Object value)
查:get(Object key)
长度:size()
遍历:keySet() \ values() \ entrySet()
  • Map的实现类:TreeMap
TreeMap的使用
> 可以按照添加的key-value对的key的指定的属性的大小进行排序。
   进而遍历时,也是按照key的指定的属性的大小顺序进行遍历的。
> 针对于key-value对中的key进行自然排序或定制排序即可。

  • Map的实现类:Hashtable与Properties
Hashtable与Properties的使用
> Properties:继承于Hashtable。key、value都是String类型,常用来处理属性文件。

7、操作集合的工具类:Collections

1. Collections概述
Collections操作集合框架(Collection、Map)的工具类。


2. 常用方法


3. 面试题:区分Collection 和 Collections
Collection:集合框架中提供的一个用于存储一个一个数据的顶级接口。下面提供了List和Set等子接口。
  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值