Java基础--数据结构
数据结构
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中是一个对象) 2. 元素之间的关系如何实现存储 (java中也是一个对象) 另外在java中, 已经可以把跟数据结构有关的一些 ...
- Java基础——数据结构总结
目的 : 加强类与对象的内存分配理解,加强操作能力.理解数据结构. 结构 : 数据元素之间的关系. 数据结构 : 带有结构的数据对象. 线性结构: 各数据元素之间的逻辑以用一个线性序列简单的表达出现. ...
- java 基础数据结构源码详解及数据结构算法
http://www.cnblogs.com/skywang12345/category/455711.html http://www.cnblogs.com/liqiu/p/3302607.html
- Java基础-JAVA中常见的数据结构介绍
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...
- Java实现的基础数据结构
Java实现的基础数据结构 0,常用的基础数据结构 图1 基础数据结构&相关特性 图2 Java自带的类集框架&继承关系图 1,数组[Array] 特点:长度固定.查找方便[直接使用i ...
- [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- java之数据结构之链表及包装类、包
链表是java中的一种常见的基础数据结构,是一种线性表,但是不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针.与线性对应的一种算法是递归算法:递归算法是一种直接或间接的调用自身算法的过 ...
- 万能的林萧说:一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础”。
来历 本文来自于一次和群里猿友的交流,具体的情况且听LZ慢慢道来. 一日,LZ在群里发话,"招人啦." 然某群友曰,"群主,俺想去." LZ回之,"你 ...
- Java基础应用
Java集合类解析 List.Map.Set三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.Set 无法拥有重复元素,内部排序.Map 保存key-value值,v ...
随机推荐
- JavaWeb笔记第一弹
一.MYSQL的安装 1.MYSQL的安装 可以去官网找到与自身计算机向对应的版本进行下载 网址如下: MySQL :: Download MySQL Community Server 2.MYSQL ...
- 2020 Multi-University Training Contest 1 . Fibonacci Sum 水题改编
题意很简单,就是让你求这个东西,这个时候你发现,原题???? https://blog.csdn.net/acdreamers/article/details/23039571 哦,只是原来写过的哪一 ...
- 使用 Agora SDK 开发 React Native 视频通话App
在 React Native 的应用中,从头开始添加视频通话功能是很复杂的.要保证低延迟.负载平衡,还要注意管理用户事件状态,非常繁琐.除此之外,还必须保证跨平台的兼容性. 当然有个简单的方法可以做到 ...
- 人人皆可虚拟,直播还能这么玩?声网推出 MetaLive 元直播解决方案
视频群聊.在线社交.电商带货.游戏竞技.......越来越多的场景融入了直播这一功能.无可厚非,直播可以拉近人与人间的距离,让彼此间的交流更具象.但传统直播场景更为强调主播个人的表现,用户多以围观.刷 ...
- Python类的继承,你了解多少?
"三人行必有我师焉!"."不耻下问",中国的圣人先师孔子留下的文化瑰宝传承在生活中的每个角落. 孔子是中国古代最伟大的思想家.教育家.如果说中国有一种根本的立国 ...
- Schillace 定律 背后的 Sam Schillace
微软semantic-kernel(SK)团队发布了一篇博客文章:Early Lessons From GPT-4: The Schillace Laws[1] ,微软的CVP , Deputy CT ...
- Postman抓包浏览器请求--傻瓜式操作
1.安装chrome插件(postmanInterceptor插件,在任意插件网站都可搜到,下载安装到浏览器即可),该插件可协助postman捕获https请求 2.安装postman postman ...
- Vue指令:内置指令和自定义指令
Vue指令 Vue指令指的是,以v-开头的一组特殊语法 内置指令 v-text v-text指令的作用是:设置标签的内容 默认写法会替换全部内容,差值表达式{{ }}只会替换指定内容 内部支持写表达式 ...
- python-爬虫-css提取-写入csv-爬取猫眼电影榜单
猫眼有一个电影榜单top100,我们将他的榜单电影数据(电影名.主演.上映时间.豆瓣评分)抓下来保存到本地的excle中 本案例使用css方式提取页面数据,所以会用到以下库 import time i ...
- [UML]PlantUML安装使用指南
1 概述 PlantUML 支持在多个平台上安装使用,比如 Eclipse,NetBeans,oneline servlet 等,它也支持多种语言的编辑,例如 C/C++, PHP,Java ...