Java基础–数据结构

数据结构

Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:
枚举(Enumeration)、位集合(BitSet)、向量(Vector)、栈(Stack)、字典(Dictionary)、哈希表(Hashtable)、属性(Properties)
以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection)

Java 集合框架

Java基础--数据结构
Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。
Collection 接口又有 3 种子类型,List、Set 和 Queue,再下面是一些抽象类,最后是具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

List、Map、Set的区别与联系

结构特点

List Set Map
存储单列数据 存储单列数据 存储键值对
有顺序的,并且值允许重复 无顺序的,并且不允许重复 无序的,它的键是不允许重复的,但是值是允许重复的

实现类
List接口:

LinkedList ArrayList Vector
基于链表实现 基于数组实现 基于数组实现
链表内存是散列的,增删快,查找慢 效率高,增删慢,查找快 效率低,增删慢,查找慢
非线程安全 非线程安全 线程安全

Set接口:

HashSet LinkedHashSet TreeSet
基于HashMap 实现 继承于 HashSet、基于LinkedHashMap实现
重写 equals()和 hash Code()方法
允许有 null 值
非线程安全 非线程安全 非线程安全

Map接口:

HashMap HashTable LinkedHashMap SortMap
支持 null 值和 null 键 不支持 null 值和 null 键 HashMap 的一个子类 接口 TreeMap
高效 低效 保存了记录的插入顺序 能够把它保存的记录根据键排序
非线程安全 线程安全 非线程安全 非线程安全

List

ArrayList

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。

初始化

import java.util.ArrayList; // 引入 ArrayList 类
ArrayList<E> objectName =new ArrayList<>();  // 初始化

常用方法

方法 描述
add(int index,E element) 将元素插入到指定位置的 arraylist 中
clear() 删除 arraylist 中的所有元素
clone() 复制一份 arraylist
contains(Object obj) 判断元素是否在 arraylist
get(int index) 通过索引值获取 arraylist 中的元素
set(int index, E element) 替换 arraylist 中指定索引的元素
indexOf(Object obj) 返回 arraylist 中元素的索引值
remove(Object obj) 删除 arraylist 里的单个元素
size() 返回 arraylist 里元素数量
isEmpty() 判断 arraylist 是否为空
subList(int fromIndex, int toIndex) 截取部分 arraylist 的元素
sort(Comparator c) 根据指定的顺序对 arraylist 元素进行排序
toArray(T[] arr【可选参数】) 将 arraylist 转换为数组【无参数返回类型为Object】
toString() 将 arraylist 转换为字符串
lastIndexOf() 返回指定元素在 arraylist 中最后一次出现的位置
trimToSize() 将 arraylist 中的容量调整为数组中的元素个数
removeRange(int fromIndex, int toIndex) 删除 arraylist 中指定索引之间存在的元素

LinkedList

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
链表可分为单向链表和双向链表。

继承与实现:

继承了 AbstractSequentialList 类。
实现了 Queue 接口,可作为队列使用。
实现了 List 接口,可进行列表的相关操作。
实现了 Deque 接口,可作为队列使用。
实现了 Cloneable 接口,可实现克隆。
实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输。

常用方法

方法 描述
boolean add(E e) 链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
void add(int index, E element) 向指定位置插入元素。
void addFirst(E e) 元素添加到头部。
void addLast(E e) 元素添加到尾部。
boolean offer(E e) 向链表末尾添加元素,返回是否成功,成功为 true,失败为 false。
boolean offerFirst(E e) 头部插入元素,返回是否成功,成功为 true,失败为 false。
boolean offerLast(E e) 尾部插入元素,返回是否成功,成功为 true,失败为 false。
void clear() 清空链表。
E removeFirst() 删除并返回第一个元素。
E removeLast() 删除并返回最后一个元素。
boolean remove(Object o) 删除某一元素,返回是否成功,成功为 true,失败为 false。
E remove(int index) 删除指定位置的元素。
E poll() 删除并返回第一个元素。
E remove() 删除并返回第一个元素。
boolean contains(Object o) 判断是否含有某一元素。
E get(int index) 返回指定位置的元素。
E getFirst() 返回第一个元素。
E getLast() 返回最后一个元素。
int indexOf(Object o) 查找指定元素从前往后第一次出现的索引。
int lastIndexOf(Object o) 查找指定元素最后一次出现的索引。
E peek() 返回第一个元素。
E element() 返回第一个元素。
E peekFirst() 返回头部元素。
E peekLast() 返回尾部元素。
E set(int index, E element) 设置指定位置的元素。
int size() 返回链表元素个数。
Object[] toArray() 返回一个由链表元素组成的数组。
T[] toArray(T[] a) 返回一个由链表元素转换类型而成的数组。

Java Collections框架的Stack类提供了堆栈的实现。但是,建议Deque用作堆栈而不是Stack类。这是因为Stack的方法是同步的。
以下是Deque接口提供的用于实现堆栈和队列的方法:
栈(后进先出):

Deque que = new LinkedList();
que.push(e);//在双端队列的开头添加元素
que.pop();//弹出栈顶
que.peek();//查看栈顶

队列(先进先出)

add(E);//boolean 在队尾添加元素,添加成功返回true,如果队列已满无法添加则抛出异常。
offer(E);//boolean 在队尾添加元素,添加成功返回true,如果队列已满无法添加则返回false。
remove();//E 删除队头元素,并返回删除的元素,如果队列为null,抛出异常。
poll();//E 删除队头元素,并返回删除的元素,如果队列为null,返回null。
element();//E 获取队头元素,如果队列为null将抛出异常。
peek();//E 获取队头元素,如果队列为null将返回null。

Set

HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
创建对象:

HashSet<String> sites = new HashSet<String>();

常用方法

方法 描述
add(E) 添加元素
contains(E) 判断元素是否存在
remove() 删除元素;删除成功返回 true,否则为 false
size() 计算大小;

LinkedHashSet

TreeSet

Map

HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
创建对象:

HashMap<Integer, String> Sites = new HashMap<Integer, String>();

常用方法

方法 描述
put(key,E) 添加元素
get(key) 访问元素
remove(key) 删除元素
clear() 删除所有键值对
size() 计算大小
isEmpty() 判断 hashMap 是否为空
containsKey(Object key) 检查 hashMap 中是否存在指定的 key 对应的映射关系
containsValue(Object value) 检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace(K key, V newValue) 替换 hashMap 中是指定的 key 对应的 value
getOrDefault(Object key, V defaultValue) 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
values() 返回 hashMap 中存在的所有 value 值。

LinkedHashMap

参考

Java教程

原文链接:https://www.cnblogs.com/yunshalee/p/17317941.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础–数据结构 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • java 如何读取远程主机文件

    下面是针对”java 如何读取远程主机文件”的完整攻略,包含两条示例。 1. 使用Java的URLConnection读取远程文件 通过Java语言的URL和URLConnection类,我们可以方便地读取远程文件。具体步骤如下: 1.1 建立URL对象 使用URL类的构造方法,传入需要读取的远程文件路径(包括协议、主机、端口、文件路径等信息),新建一个UR…

    Java 2023年5月19日
    00
  • Java enum的用法详细介绍及实例代码

    Java中的枚举类型是一种特殊的类,它具有固定数量和固定名称的常量。枚举类型可以让代码更加清晰易懂,避免了使用数字或字符串表示常量时出现的错误。 声明枚举类型 在Java中,声明枚举类型需要使用关键字enum。下面是一个最简单的例子: enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, S…

    Java 2023年5月23日
    00
  • 一篇文章带你入门Java基本概念

    一篇文章带你入门Java基本概念 Java是一个广泛应用的高级编程语言,它是一种面向对象的语言,体现了一些在C++中经过多年开发和实践所获得的经验,避免了其它更早的面向对象的语言的一些不足,是一个功能强大且通用性很高的编程语言。 基本概念 Java具有丰富的基本概念,其中一些需要初学者掌握: 类 Java中的类是一个蓝图或者模板,它定义了对象包含的属性和方法…

    Java 2023年5月23日
    00
  • Java详解使用线程池处理任务方法

    Java详解使用线程池处理任务方法 线程池 线程池是一种重复利用线程资源的机制,线程池中预先创建一定数量的线程,当有任务需要执行时,直接使用一个线程来执行任务,当任务执行完毕后,线程不会立即销毁,而是返回线程池中,等待下一次任务的执行。这样可以避免线程频繁创建和销毁带来的开销,提高程序的运行效率。 线程池的使用 创建线程池 Java中提供了线程池的实现,我们…

    Java 2023年5月18日
    00
  • Java数组队列及环形数组队列超详细讲解

    Java数组队列及环形数组队列超详细讲解 什么是队列 队列(Queue)是一种先进先出(FIFO, first in first out)的数据结构,常见的队列有数组队列和链式队列两种实现方式。 数组队列 数组队列是一种线性结构,底层使用静态数组来存储数据。队列的头部(front)指向队列头部元素,队列尾(rear)指向队列尾部元素。当有新元素入队时,队列尾…

    Java 2023年5月26日
    00
  • maven assembly打包生成Java应用启动脚本bat和sh的方法

    下面是详细讲解“maven assembly打包生成Java应用启动脚本bat和sh的方法”的完整攻略。 1. 简介 Maven 是一个基于项目对象模型(POM),可以通过一小段描述文件来管理项目的构建、报告和文档的工具。Maven assembly插件为开发者提供了制作可独立运行的发行版(Distribution)的能力,可以通过配置在项目构建时产生必要的…

    Java 2023年5月20日
    00
  • JavaSpringBoot报错“DataIntegrityViolationException”的原因和处理方法

    原因 “DataIntegrityViolationException” 错误通常是以下原因引起的: 数据库约束问题:如果您的数据库约束存在问题,则可能会出现此错误。在这种情况下,您需要检查您的数据库约束并确保它们正确。 数据库操作问题:如果您的数据库操作存在问题,则可能会出现此错误。在这种情况下,您需要检查您的数据库操作并确保它们正确。 数据库连接问题:如…

    Java 2023年5月4日
    00
  • Java日常练习题,每天进步一点点(40)

    下面是Java日常练习题的完整攻略: 1. 确定目标 我们的目标是通过做Java练习题来提高自己的编程能力,每天进步一点点。 2. 获取练习题 可以通过互联网上的Java编程练习网站,如Java编程练习网站等获取练习题。 3. 分析题目 在开始解题之前,请认真阅读题目并分析,确定题目的输入、输出、边界条件和算法思路。 4. 用Java代码实现 在分析完题目后…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部