数据结构

Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:

枚举(Enumeration)、位集合(BitSet)、向量(Vector)、栈(Stack)、字典(Dictionary)、哈希表(Hashtable)、属性(Properties)

以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection)

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教程

Java基础--数据结构的更多相关文章

  1. java 基础数据结构

    数据结构, 需要考虑两个方面: 1. 每个元素具体的存储方法 (java中是一个对象) 2. 元素之间的关系如何实现存储 (java中也是一个对象) 另外在java中, 已经可以把跟数据结构有关的一些 ...

  2. Java基础——数据结构总结

    目的 : 加强类与对象的内存分配理解,加强操作能力.理解数据结构. 结构 : 数据元素之间的关系. 数据结构 : 带有结构的数据对象. 线性结构: 各数据元素之间的逻辑以用一个线性序列简单的表达出现. ...

  3. java 基础数据结构源码详解及数据结构算法

    http://www.cnblogs.com/skywang12345/category/455711.html http://www.cnblogs.com/liqiu/p/3302607.html

  4. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  5. Java实现的基础数据结构

    Java实现的基础数据结构 0,常用的基础数据结构 图1 基础数据结构&相关特性 图2 Java自带的类集框架&继承关系图 1,数组[Array] 特点:长度固定.查找方便[直接使用i ...

  6. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  7. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  8. java之数据结构之链表及包装类、包

    链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...

  9. 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。

    来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...

  10. Java基础应用

    Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...

随机推荐

  1. JavaWeb笔记第一弹

    一.MYSQL的安装 1.MYSQL的安装 可以去官网找到与自身计算机向对应的版本进行下载 网址如下: MySQL :: Download MySQL Community Server 2.MYSQL ...

  2. 2020 Multi-University Training Contest 1 . Fibonacci Sum 水题改编

    题意很简单,就是让你求这个东西,这个时候你发现,原题???? https://blog.csdn.net/acdreamers/article/details/23039571 哦,只是原来写过的哪一 ...

  3. 使用 Agora SDK 开发 React Native 视频通话App

    在 React Native 的应用中,从头开始添加视频通话功能是很复杂的.要保证低延迟.负载平衡,还要注意管理用户事件状态,非常繁琐.除此之外,还必须保证跨平台的兼容性. 当然有个简单的方法可以做到 ...

  4. 人人皆可虚拟,直播还能这么玩?声网推出 MetaLive 元直播解决方案

    视频群聊.在线社交.电商带货.游戏竞技.......越来越多的场景融入了直播这一功能.无可厚非,直播可以拉近人与人间的距离,让彼此间的交流更具象.但传统直播场景更为强调主播个人的表现,用户多以围观.刷 ...

  5. Python类的继承,你了解多少?

    "三人行必有我师焉!"."不耻下问",中国的圣人先师孔子留下的文化瑰宝传承在生活中的每个角落. 孔子是中国古代最伟大的思想家.教育家.如果说中国有一种根本的立国 ...

  6. Schillace 定律 背后的 Sam Schillace

    微软semantic-kernel(SK)团队发布了一篇博客文章:Early Lessons From GPT-4: The Schillace Laws[1] ,微软的CVP , Deputy CT ...

  7. Postman抓包浏览器请求--傻瓜式操作

    1.安装chrome插件(postmanInterceptor插件,在任意插件网站都可搜到,下载安装到浏览器即可),该插件可协助postman捕获https请求 2.安装postman postman ...

  8. Vue指令:内置指令和自定义指令

    Vue指令 Vue指令指的是,以v-开头的一组特殊语法 内置指令 v-text v-text指令的作用是:设置标签的内容 默认写法会替换全部内容,差值表达式{{ }}只会替换指定内容 内部支持写表达式 ...

  9. python-爬虫-css提取-写入csv-爬取猫眼电影榜单

    猫眼有一个电影榜单top100,我们将他的榜单电影数据(电影名.主演.上映时间.豆瓣评分)抓下来保存到本地的excle中 本案例使用css方式提取页面数据,所以会用到以下库 import time i ...

  10. [UML]PlantUML安装使用指南

    1 概述 PlantUML 支持在多个平台上安装使用,比如 Eclipse,NetBeans,oneline servlet 等,它也支持多种语言的编辑,例如 C/C++,​ ​PHP​​​,Java ...