Java学习笔记----关于集合框架

集合框架的概述

集合、数组都是多个数据进行存储操作的结构,简称java容器

说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储

数组在存储多个数据方面的特点

一旦初始化以后,长度就确定 --------> 不可修改长度

数组一旦定义好,其元素的类型也就确定了 -----------> 只能操作指定类型的数据

缺点

一旦初始化以后,其长度就不可修改

数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便

获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用

数组存储数据的特点:有序、可重复,对于无序、不重复的需求,无法满足

集合框架

  • Collection接口 :单列数据,定义了存取一组对象的方法的集合
    • List接口:元素有序、可重复的集合 -----> “动态”数组
      • ArrayList \ LinkedList \ Vector
    • Set接口:元素无序、不可重复的集合
      • HashSet \ LinkedHashSet \ TreeSet
  • Map接口:双列数据,保存具有映射关系"key - value对"的集合
    • HashMap \ LinkedHashMap \ TreeMap \ Hashtable \ Properties

Collection接口中方法的使用

向Collection接口的实现类的对象中添加obj时,要求obj所在类要重写equals()

  •   Collection coll = new ArrayList();
      add(Object e):将元素e添加到集合coll中;
      size():获取添加的元素的个数;
      addAll(Collection coll1):将coll1集合中所有元素添加到当前的集合中;
      clear():清空所有元素;
      isEmpty():判断当前集合是否为空;
    
  •   contains():判断当前集合中是否包含obj;
      // 判断时会调用obj对象所在类的equals();
      containsAll(Collection coll2):判断形参coll2中所有元素是否都存在于当前集合中
    
  •   remove(Object obj):移除当前集合中obj元素;
      removeAll(Collection coll1):从当前集合中移除coll1集合中所包含的元素;
      retainAll(Collection call1):获取当前集合中和coll1集合的交集,并返回给当前集合
    
  •   hashCode():返回当前对象的哈希值;
      // 集合 ------------>  数组
      toArray():
      Object[] arr = coll.toArray();
      // 拓展: 数组 -----------> 集合
      asList():
      //例子
      List<String> list = Array.asList(new String[]{"aa", "bb"});
      iterator():返回Iterator接口的实例,用于遍历集合元素,放在IteratorTest.java中测试
    

集合元素的遍历操作:使用迭代器接口

Itetator iterator = coll.iterator();

方式一:iterator.next()

方式二:for循环

方式三(推荐):

while(iterator.hasnext()){
    System.out.println(iterator.next());
}

迭代器执行原理

image-20230130151329180

Iterator迭代器remove()的使用

内部定义了remove(),可以删除遍历的时候,删除集合中的元素,此方法不同于集合直接调用remove();

Iterator iterator = coll.interator();
while(iterator.hasnext){
    Object obj = iterator.next();
    if("Tom".equals(obj)){
        iterator.remove();
    }
}

Collection子接口之一:List接口

List集合类中元素有序、且可重复

ArrayList:作为List接口的主要实现类

线程不安全,效率高

底层使用Object[] elementData存储

LinkedList

对于频繁的插入、删除操作,使用此类效率比ArrayList效率高

底层使用双向链表存储

Vector:作为List接口的古老接口

线程安全,效率低

底层使用Object[] elementData存储

面试题:ArrayList \ LinkedList \ Vector 三者的异同

同:三者类都是实现了List接口,存储数据的特点相同:存储有序、可重复的数据

异:分析三者的特点

List子接口之二:LinkedList

常用方法

image-20230131182736161

总结:常用方法

增:add(Object obj)

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

改:set(int index, Object obj)

查:get(int index)

插入:add(int index, Object)

长度:size()

遍历:

  1. Iterator迭代器方式
  2. 增强for循环
  3. 普通的循环

Collection子接口之二:Set接口

存储无序、不可重复的数据

无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值

不可重复性:保证添加的元素按照equals()判断时,不能返回ture,即相同的元素只能添加一个

要求

  • 对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode()方法,以实现对象相等规则,即相等的对象必须具有相等的散列码

Set实现类之一:HashSet

线程不安全,可以存储null值

Set实现类之二:LinkedHashSet

作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历

双链点,一个结点两端是指针域,中间是数据域

LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个和后一个数据

优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet

Set实现类之三:TreeSet

自然排序(实现Compare接口)

可以按照添加对象的指定属性,进行排序

自然排序中,比较两个对象是否相同的标准为:compareTo()返回0,不再是equals().

不能添加不同类的对象

定制排序(Comparator)
Comparator com = new Comparator(){
    @Override
    public int compare(Object obj1, Object obj2){
        return 0;
    }
};
TreeSet set = new TreeSet(com);

Map接口

双列数据,存储key - value 对数据

HashMap

  • 作为Map的主要实现类
  • 线程不安全的,效率高
  • 能存储null的key和value

linkedHashMap

  • 保证遍历map元素时,可以按照添加的顺序实现遍历
  • 对于频繁的遍历操作,此类执行效率高于HashMap

原因

在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素

========================

TreeMap

保证按照添加的key - value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序,底层使用红黑树

========================

Hashtable

  • 线程安全的,效率低
  • 不能存储null的key和value

Propertise

  • 常用于处理配置文件
  • key和value都是String类型

HashMap的底层

数组 + 链表 JDK 7 以及之前

数组 + 链表 + 红黑树 jdk8

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();
boolean containKey(Object key);
boolean containValue(Object value);
int size();
boolean isEmpty();
boolean equals(Object obj);

元视图操作的方法

Set keySet(); // 返回所有key构成的Set集合
Collection values(); // 返回所有value构成的Collection集合
Set entrySet(); // 返回所有key - value对构成的Set集合

遍历所有的key - value

方式一:entrySet()

Set set = map.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext){
    Object obj = iterator.next();
    Map.Entry entry = (Map.Enter) obj;
    System.out.println(entry.getKey() + "," + entry.getValue);
}

方式二:

Set keySet = map.keySet();
Iterator iterator = set.iterator();
while(iterator.hasNext){
    Object key = iterator.next();
    Object value = map.get(key);
}

增:put(Object key, Object value);

删:remove(Object key);

改:put(Object key, Object value);

查:get(Object key)

长度:size()

遍历:keySet() \ values() \ entrySet()

TreeMap两种添加方式

想TreeMap中添加key - value ,要求key必须是由用一个类创建的对象

因为要按照key进行排序:自然排序、定制排序

posted @   Dezenady  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示