Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别
数组:
.长度固定
.可以存储基本类型,也可以存储引用类型
.存储元素类型一致
数组可以在内存中连续存储多个元素的构造,在内存中的分配也是连续的
数组中的元素通过数组的下标进行访问的,下标从0开始的
优点 :
按照索引查询元素速度快
按照索引遍历数组方便
缺点:
数组的大小固定后就不能扩容了
数组只能存储一种类型的数据
添加,删除的操作慢,因为要移动其他的元素
适用场景:
频繁查询,对存储空间要求不大,很少增加和删除的情况
集合:
特点
长度可变
只可以存储引用类型
可以存储多种类型
List:有序、可以有重复的集合
List 接口的三个典型实现:
①、List list1 = new ArrayList();
底层数据结构是数组,查询快,增删慢;线程不安全,效率高
②、List list2 = new Vector();
底层数据结构是数组,查询快,增删慢;线程安全,效率低,几乎已经淘汰了这个集合
③、List list3 = new LinkedList();
底层数据结构是链表,查询慢,增删快;线程不安全,效率高
Set
HashSet:要保证元素唯一性,需要覆盖掉Object中的equals和hashCode方法(因为底层是通过这两个方法来判断两个元素是否是同一个)。
**TreeSet:**以二叉树的结构对元素进行存储,可以对元素进行排序。
排序的两种方式:
1、元素自身具备比较功能,元素实现Comparable接口,覆盖compareTo方法。
2、建立一个比较器对象,该对象实现Comparator接口,覆盖compare方法,并将该对象作为参数传给TreeSet的构造函数(可以用匿名内部类)。
Map接口其特点是:元素是成对出现的,以键和值的形式体现出来,键要保证唯一性:常用类有:HashMap,Hashtable ,TreeMap。
HashMap:线程不安全等的,允许存放null键null值。
Hashtable:线程安全的,不允许存放null键null值。
TreeMap:可以对键进行排序(要实现排序方法同TreeSet)。
链表:
通过一个链子把多个结点(元素)连接起来,由数据和地址组成的一个元素,
节点本身必须有一个地址值(就是下一个元素的地址值)
优点:
链表是很常用的一种数据结构,不需要初始化容量,
可以任意加减元素;
添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,
所以添加,删除很快;
缺点:
因为含有大量的指针域,占用空间较大;
查找元素需要遍历链表来查找,
非常耗时。
适用场景:
数据量较小,需要频繁增加,删除操作的场景
队列:
是一种先进先出的数据构造,也是运算受限制的线性表,只可以在对头删除元素,在队尾插入元素
线性表是同一类型数据的一个有限序列
元素之间的先后排列次序蕴涵着其线性关系。线性表中的第一个元素a1称为表头元素,an称为表尾元素
队列可以分为顺序队列和链式队列,根据不同的存储方式,定义的结构也不同。
顺序队列包含一个数组成员,有二端包含一个数组成员 我们把删除一端叫头
插入一端叫尾
链接存储的有序线性表类需要继承链接线性表类LinkList和实现有序线性表接口SortedList
区别:
1.占用的内存空间
链表存放的内存空间可以是连续的,也可以是不连续的,数组则是连续的一段内存空间。一般情况下存放相同多的数据数组占用较小的内存,而链表还需要存放其前驱和后继的空间。
2.长度的可变性
链表的长度是按实际需要可以伸缩的,而数组的长度是在定义时要给定的,如果存放的数据个数超过了数组的初始大小,则会出现溢出现象。
3.对数据的访问
链表方便数据的移动而访问数据比较麻烦;数组访问数据很快捷而移动数据比较麻烦。
链表和数组的差异决定了它们的不同使用场景,如果需要很多对数据的访问,则适合使用数组;如果需要对数据进行很多移位操作,则设和使用链表。
Java中数组、集合、链表、队列的数据结构和优缺点和他们之间的区别的更多相关文章
- java中的集合链表
java中的集合类有很多种,每个都有自己的一些特点,推荐你专门在这方面研究一下,比方Vector,ArrayList,,LinkedList,Hashtable等,其中你问到的链表,是不是指Linke ...
- java中数组以及集合
java中数组: 数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象.但实际数组也是一种对象类型,int[]a = new int[5] a是在java栈中分配的引用变量,类型是int[ ...
- java中数组、集合、字符串之间的转换,以及用加强for循环遍历
java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...
- java中的集合操作类(未完待续)
申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...
- JAVA中的集合容器操作类
目录 JAVA中的集合容器操作类 List集合 ArrayList的操作方法说明 LinkedList Stack Set Map Queue 总结 JAVA中的集合容器操作类 Java容器类库总共分 ...
- Java中的集合(五)继承Collection的List接口
Java中的集合(五)继承Collection的List接口 一.List接口简介 List是有序的Collection的,此接口能够精确的控制每个元素插入的位置.用户能够根据索引(元素在List接口 ...
- Java中的集合(三)继承Collection的Queue接口
Java中的集合(三)继承Collection的Queue接口 一.Queue介绍 Queue接口继承自Collection接口,是Java中定义的一种队列数据结构,元素是有序的(按插入顺序排序),先 ...
- 万字长文深入理解java中的集合-附PDF下载
目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fail- ...
- Java中的集合概述
Java中的集合类有两个重要的分支,分别是接口Collection(包括List,Set等)和接口Map. 由于HashSet的内部实现原理使用了HashMap,所以我们先来了解Map集合类. 1.H ...
- Java中各种集合(字符串类)的线程安全性!!!
Java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...
随机推荐
- 【Android】无法通过drawable下的selector类型改变背景颜色?
举例 我在darwable目录下创建了selector文件,并设置了如下内容 <?xml version="1.0" encoding="utf-8"?& ...
- .NET开源的处理分布式事务的解决方案
前言 在分布式系统中,由于各个系统服务之间的独立性和网络通信的不确定性,要确保跨系统的事务操作的最终一致性是一项重大的挑战.今天给大家推荐一个.NET开源的处理分布式事务的解决方案基于 .NET St ...
- 明解Java第二章练习题答案
练习2-1 请对代码清单2-6的2处进行修改,将带有小数部分的实数值赋给x和y,查看结果如何? 答案:编译器会报错,因为小数的默认类型double是比int更大的类型.如果给double类型的变量赋值 ...
- TIOBE 12月榜单: C# 即将成为2023 年度编程语言
TIOBE 公布了 2023 年 12 月的编程语言排行榜. 2022年C# 在挑战成为年度编程语言,但在最后一刻,C++出人意料地夺得了冠军.今年,我们确信 C# 将获胜成为2023年度编程语言.它 ...
- [AGC003D] Anticube
Problem Statement Snuke got positive integers $s_1,...,s_N$ from his mother, as a birthday present. ...
- 【Dotnet 工具箱】推荐一个 Flutter 和 .NET 开源的实时聊天 APP
1. 推荐一个 Flutter 和 .NET 开源的实时聊天 APP Heyy-chat-app Heyy-chat-app 是一个开源的聊天应用,使用 Flutter.Asp.Net Core We ...
- Golang实现JAVA虚拟机-运行时数据区
原文链接:https://gaoyubo.cn/blogs/8ae1f4ca.html 前置 Golang实现JAVA虚拟机-解析class文件 一.运行时数据区概述 JVM学习: JVM-运行时数据 ...
- 华企盾DSC由于半透明软件设置了需要管理员权限打开导致半透明打不开加密文件
解决方法: 1.右键该应用程序->属性->兼容性,去掉[以管理员权限运行此程序] 2.也可以打开控制面板->系统和安全->用户账户控制设置调至最低
- pycharm插件离线安装
给不能联网的电脑或者不能访问外网的云桌面安装pycharm插件,需要离线安装 首先在能访问网络的电脑上打开插件主页,如下: 下载插件安装文件
- python异步编程之asyncio高阶API
asyncio 高阶API列表 asyncio中函数可以分为高阶函数和低阶函数.低阶函数用于调用事件循环.linux 套接字.信号等更底层的功能,高阶函数是屏蔽了更多底层细节的任务并发,任务执行函数. ...