首页 > 编程语言 >Java学习笔记----关于集合框架

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

时间:2023-02-20 19:12:24浏览次数:44  
标签:Java iterator Object 笔记 ---- value key 集合 obj

集合框架的概述

集合、数组都是多个数据进行存储操作的结构,简称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进行排序:自然排序、定制排序

标签:Java,iterator,Object,笔记,----,value,key,集合,obj
From: https://www.cnblogs.com/LruiBlog/p/17138531.html

相关文章

  • Intel汇编语言程序设计笔记
    ⦁2^8=2562^10=10242^16=65536[二进制]1111=F[16进制]⦁ 有符号二进制整数的最高有效位[MSB]表示数的符号,0=正数1=负数⦁ 数据的意义,由其数据类型决定,单纯的数字没......
  • 【技术分享】线程本地存储(Thread Local Storage, TLS)
    开源项目:https://girakoo.com/官方文档:https://learn.microsoft.com/en-us/windows/win32/procthread/using-thread-local-storage简介线程本地存储(TLS),可以使多个线程,通......
  • kubeadm部署k8s集群(云原生)
    内容预知架构说明1.环境准备2.所有节点安装docker3.所有节点安装kubeadm,kubelet和kubectl4.部署Dashboard5.安装部署与k8s集群对接的Harbor仓库内核参数......
  • 装饰器
    装饰器装饰器(Decorators)是Python的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic(Python范儿)。大多数初学者不知道......
  • 【Azure 事件中心】Azure Event Hub客户端遇见 Expired Heartbeat 错误
    问题描述AzureEventHub在消费数端中,经常性遇见ExpiredHeartbeat错误(consumer-xxxxxxxxxxxxx-c84873c6c828e8df6c843861ad36affb fromgroupxxxxxxxxxxxxdueto......
  • Docker的初步认识,安装与基本操作
    一、Docker概述1、Docker的概念•Docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源•Docker是在Linux容器里运行应用的开源工具,是一种轻量级......
  • 项目开发软件架构选择指南
    从系统的组织和部署结构方面来看,软件架构的演化进程显然有着从简单到复杂的趋势。那是否最新最复杂的架构就是目前业界选择的最佳架构呢?非也。没有最好的架构,只有最合适的......
  • SpringBoot的开启缓存@EnableCaching 和 使用缓存@Cacheable
    springboot中的缓存注解支持Spel表达式,因此这里展示常用的SpEL表达式1、开启缓存@EnableCachingimportorg.springframework.boot.SpringApplication;importorg.sp......
  • JQuery实现全选、全不选和反选功能
    首先,根据勾选框来全选的话,使用这个,this.checked表示选中状态chenked是一种属性,是否被选中的属性$("#all").click(function(){$(".ids").prop("checked",this.......
  • 使用FTPClient封装FtpUtil
    1.新增POM依赖<!--文件上传--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.......