首页 > 编程语言 >Java数组与集合

Java数组与集合

时间:2024-11-25 10:33:42浏览次数:11  
标签:存储 Set Java HashMap 元素 数组 集合 数据结构

数组(array)

概念 :同一种类型数据的集合。其实数组就是一个容器。  

定义格式1 :  

元素类型[] 数组名 = new 元素类型\[元素个数或数组长度\];  

示例:int[] arr = new int[x];  

**定义格式2** :  

元素类型[] 数组名 = new 元素类型\[\]{元素,元素,......};  

int[] arr = new int[]{3,5,1,7};  

int[] arr = {3,5,1,7};  

数组的内存分析 :  

栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈中运行  

堆(Heap):凡是new出来的东西都在堆中,堆内存里面的东西都有一个地址值  

方法区(Method Area):存储.class相关信息,包含方法的信息  

注意:  

1.给数组分配空间时,必须指定数组能够存储的元素个数来确定数组大小。创建数组之后不能修改数组的大小。  

2.数组可以装任意类型的数据,虽然可以装任意类型的数据,但是定义好的数组只能装一种元素, 也就是数组一旦定义,那么里边存储的数据类型也就确定了。  

3.数组静态分配内存,在内存中连续  

4. 数组下标从0开始

补充:  

1.数组的优点:  

随机访问性强(通过下标进行快速定位)  

查找速度快  

2.数组的缺点:  

插入和删除效率低(插入和删除需要移动数据)  

内存空间要求高,必须有足够的连续内存空间。  

数组大小固定,不能动态拓展

集合

-----------

集合(Collection)

图片

  • List下有ArrayList,Vector,LinkedList

  • Set下有HashSet,LinkedHashSet,TreeSet

  • Collection接口下还有个Queue接口,有PriorityQueue类

集合中只能存储引用类型的对象,所以集合元素不能是基本数据类型(基本数据类型不是对象),但是可以存放对应的包装类。

List

List 接口存储一组不唯一,有序(插入顺序)的对象。

ArrayList : 底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素  

LinkedList: 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素  

Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素  

图片

Set

Set 接口存储一组唯一,无序的对象。

HashSet :底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,允许包含值为null的元素,但最多只能一个。  

元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。  

LinkedHashSet:底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。  

TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。  

小结:Set 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

List和Set的区别

1. List 接口实例存储的是有序的,可以重复的元素。Set 接口实例存储的是无序的,不重复的数据。

2. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector> Set 接口存储一组唯一,无序的对象。

3. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。  

图片

 图(Map)

Map 接口存储一组键值对象,提供key(键)到value(值)的映射。尽管 Map 不是集合,但是它们完全整合在集合中。  

Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组 key-value 映射。  

Map下有Hashtable,LinkedHashMap,HashMap,TreeMap  

HashMap:效率较高,不是线程安全的,允许null值(key和value都允许)  

Hashtable:效率较低,是线程安全的,不允许null值  

TreeMap:通过红黑树(R-B tree)实现,TreeMap中的元素默认按照keys的自然排序排列。(对Integer来说,其自然排序就是数字的升序;对String来说,其自然排序就是按照字母表排序)

HashMap和HashSet的区别

HashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。  

区别:  

HashMap存储键值对,HashSet仅存储对象。  

HashMap使用put方法将元素添加到Map中,HashSet使用add方法将元素添加到Set中。  

存储对象的过程不同:HashMap(数组+链表/红黑树),HashSet(数组)。

数组和集合的区别

1.数组:数组的大小是固定的,并且只能存放同一种类型的数据(基本类型数据或引用类型数据)  

2.集合:可以对数据数量不固定的数组进行存储和操作。如果程序中不清楚到底有多少对象,需要在容量不足的时候进行自动扩充,则需要使用集合,而不选择数组。

总结

在集合中常见的数据结构

  • ArrayXxx:底层数据结构是数组,查询快,增删慢

  • LinkedXxx:底层数据结构是链表,查询慢,增删快

  • TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

  • HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()

数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)

线性链表:对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂度为O(n)

二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,平均复杂度均为O(logn)。

哈希表:相比上述几种数据结构,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为O(1)。

数据结构的物理存储结构只有两种:顺序存储结构和链式存储结构(像栈,队列,树,图等是从逻辑结构去抽象的,映射到内存中,也这两种物理组织形式)

标签:存储,Set,Java,HashMap,元素,数组,集合,数据结构
From: https://blog.csdn.net/cgk_ALEM/article/details/144020656

相关文章

  • Java动态代理
    理解Java中的动态代理是一种在运行时创建代理对象的机制。动态代理允许程序在运行时决定代理对象的行为,而不需要在编译时确定。它通过代理模式为对象提供了一种机制,使得可以在不修改目标对象的情况下对其行为进行增强或调整。代理可以看作是调用目标的一个包装,通常用来在调......
  • 什么情况发生栈溢出?思维导图 代码示例(java 架构)
    栈溢出(StackOverflow)的认识定义栈溢出是指程序在执行过程中,由于栈空间不足而引发的一种错误。栈是用于存储方法调用时的局部变量和方法调用信息的数据结构。当栈的空间被耗尽时,JVM将抛出StackOverflowError。常见原因递归调用过深:递归函数没有正确的终止条件,导致......
  • 多维数组与特殊矩阵:存储与压缩
    多维数组与特殊矩阵:存储与压缩一、多维数组的存储(一)基本概念多维数组是线性表的推广,例如二维数组可以看作是元素为一维数组的线性表,三维数组可以看作是元素为二维数组的线性表,以此类推。在内存中,多维数组需要按照一定的顺序进行存储,常见的存储方式有行优先存储和列优先存......
  • JavaScript有几种类型值?能否画出它们的内存图?
    JavaScript有七种原始数据类型和一种引用类型:原始数据类型(PrimitiveDataTypes):存储在栈(Stack)内存中,值直接存储在变量访问的位置。Boolean:true或falseNull:只有一个值null,表示空或不存在的值。Undefined:变量声明了但未赋值时的默认值undefined。Number:所......
  • [Java]微服务配置管理
    介绍代码拆分为微服务后,每个服务都有自己的配置文件,而这些配置文件中有很多重复的配置,并且配置变化后需要重启服务,才能生效,这样就会影响开发体验和效率配置管理服务可以帮助我们集中管理公共的配置,并且nacos就可以实现配置管理服务配置共享我们可以把微服......
  • 深入解析 Java LinkedList:从基本特点到常用方法的全面介绍
    LinkedList是Java集合框架中非常常用的一种实现类,主要用于存储有序元素的链式结构。与ArrayList这种基于数组的实现不同,LinkedList使用双向链表来管理数据。在本文中,我们将从LinkedList的基本特点、继承关系、扩容机制、常用方法源码介绍、增删改查等多个方面详细解读......
  • Java项目实战II基于SPringBoot的玩具销售商城管理系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、核心代码五、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着儿童娱乐与教育需求的日益增长,玩具市场呈现出蓬勃......
  • C++20中的Concepts 与 Java/C#中的范型约束
    C++20中的Concepts与Java/C#中的范型约束大家好!最近对C++20中的Concepts非常上头,上一篇聊了C++20中的Concepts与TypeScript,那么今天,就索性连Java和C#中的相似特性一起聊了算了。C++20引入了概念(Concepts),它是一种用来对模板参数进行约束的机制,能够提升模板编程的类型安......
  • Java基于微信小程序的校园跑腿平台(V2.0)
    博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌......
  • 【分享】这篇教程助力你成为 JavaScript 糕手!(十一)
    第十一章:异步编程11.1异步编程的概念在JavaScript中,异步编程是一种非常重要的编程模式,它用于处理那些不会立即完成的操作,而是在一段时间后才会返回结果的任务。传统的同步编程模式下,代码是按照从上到下的顺序依次执行的,每一行代码都必须等待前一行代码执行完毕后才会......