Java基础学习笔记(六) - 数据结构和集合
一、认识数据结构
1.数据结构有什么用?
合理的使用数据结构,可以更方便的查找存储数据。
2.常见的数据结构
数据存储常用结构有:栈、队列、数组、链表和红黑树。
- 栈:堆栈(stack),它是运算受限的线性表,限制只允许在表(栈顶)的一端进行插入和删除操作。特点是先进后出,栈的入口和出口都在栈的顶端。
- 队列:简称队(queue),它和堆栈一样都是运算受限的线性表,限制只允许在表一端插入,一端删除。特点是先进先出,队列出口和入口各占一侧。
- 数组:Array,是有序的元素序列。数组是在内存中开辟一段连续的空间,并在此存放元素。特点是查找元素快(通过数组索引,可以快速定位元素),增删元素慢(每次增删元素都会创建新的数组)。
- 链表:linked list,由一系列节点(链表中每个元素都被称为节点)node组成,结点在运行时动态生成。每个节点包括两部分:存储数据的数据域和指向下一个节点的指针域。特点查找慢(只能通过节点依次往后查找),增删元素快(只需修改链接下个节点的内存地址即可)。
- 红黑树:属于二叉树的一种。二叉树,binary tree,是每个结点不超过2的有序树。红黑树的特点是根节点为黑色,叶子节点是黑色的,每个红色节点的子节点都是黑色,任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同。
二、集合
认识集合
集合是Java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
- 数组长度固定,集合长度可变。
- 数组只能存储同一类型元素。集合存储的是对象,对象的类型可以不一致。
1. Collection集合
Collection是单列集合类的根接口,用于存储一系列符合某种规则的元素。
它有两个重要的子接口,分别是java.util.List和java.util.Set。
List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。
| 单列集合通用方法 | 功能 |
| public boolean add(E e) | 添加指定对象到集合中 |
| public void clear() | 清空集合中的所有元素 |
| public boolean remove(E e) | 删除当前集合中的指定对象 |
| public boolean contains(E e) | 判断当前集合中是否包含指定对象 |
| public boolean isEmpty() | 判断集合是否为空 |
| public int size() | 返回集合中元素个数 |
| public Object[] toArray() | 集合转换数组 |
1.1 List 集合
| List 接口常用方法 | 功能 |
| public void add(int index, E element) | 将指定的元素,添加到该集合中的指定位置上 |
| public E get(int index) | 返回集合中指定位置的元素 |
| public E remove(int index) | 移除列表中指定位置的元素, 返回的是被移除的元素 |
| public E set(int index, E element) |
用指定元素替换集合中指定位置的元素,返回值的更新前的元素。 |
List接口的主要实现类有java.util.ArrayList和java.util.LinkedList。
public class TestList {
public static void main(String[] args) {
// 创建List集合对象
List<String> list = new ArrayList<String>();
// 尾部添加
list.add("1");
list.add("2");
list.add("3");
// 指定位置添加
list.add(1,"没头脑");
// 删除索引位置为2的元素
System.out.println(list.remove(1));
// 修改指定位置元素
list.set(0, "5");
}
1.11 ArrayList 集合
java.util.ArrayList集合数据存储的结构是数组结构。(见 https://www.cnblogs.com/lyxdw/p/11649759.html 第三节)
1.12 LinkedList集合
java.util.LinkedList集合数据存储的结构是链表结构。
| LinkedList 方法 | 功能 |
| public void addFirst(E e) | 将指定元素插入此列表的开头 |
| public void addLast(E e) | 将指定元素添加到此列表的结尾 |
| public E getFirst() | 返回此列表的第一个元素 |
| public E getLast() | 返回此列表的最后一个元素 |
| public E removeFirst() | 移除并返回此列表的第一个元素 |
| public E removeLast() | 移除并返回此列表的最后一个元素 |
| public E pop() | 从此列表所表示的堆栈处弹出一个元素 |
| public void push(E e) | 将元素推入此列表所表示的堆栈 |
| public boolean isEmpty() | 如果列表不包含元素,则返回true |
在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("1");
link.addFirst("2");
link.addFirst("3");
System.out.println(link);
// 获取元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
// 删除元素
System.out.println(link.removeFirst());
System.out.println(link.removeLast());
while (!link.isEmpty()) { //判断集合是否为空
System.out.println(link.pop()); //弹出栈顶元素
}
System.out.println(link);
}
}
1.2 set 集合
Set接口的主要实现类有java.util.HashSet。LinkedHashSet是HashSet子类。
区别:
HashSet存储元素无序。LinkedHashSet存储元素有序。HashSet集合存储数据的结构是哈希表,LinkedHashSet是链表和哈希表组合的一个数据存储结构。
什么是哈希表?
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

public class TestHashSet{
public static void main(String[] args) {
//创建 Set集合
HashSet<String> set = new HashSet<String>();
//添加元素
set.add(new String("1"));
set.add("1");
set.add("2");
//遍历
for (String name : set) {
System.out.println(name);
}
}
}
public class TestLinkedHashSet {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("1");
set.add("2");
set.add("3");
set.add("4");
//迭代器
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
2 . Collections 集合工具类
| public static <T> boolean addAll(Collection<T> c, T... elements) | 往集合中添加一些元素 |
| public static void shuffle(List<?> list) | 打乱集合顺序 |
| public static <T> void sort(List<T> list) | 将集合中元素按照默认规则排序 |
| public static <T> void sort(List<T> list,Comparator<? super T> ) | 将集合中元素按照指定规则排序 |
java.utils.Collections是集合工具类,用来对集合进行操作。
public class TestCollections {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//添加元素
Collections.addAll(list, 1, 2, 3,4);
//排序
Collections.sort(list);
}
}
//Comparator
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator; public class TestCollections {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cbae");
list.add("abafaa");
list.add("sba");
list.add("nb");
//排序方法 按照长度排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.length() - o1.length();
}
});
System.out.println(list);
}
}
//Comparable
public class TestStudent implements Comparable<Student>{
@Override
public int compareTo(Student o) {
return this.age-o.age;//升序
}
}
- Comparable:强行对实现它的每个类的对象进行整体排序。通过实现类 重写 compareTo 方法实现,直接使用Collections.sort(list)即可。
- Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
3. Map集合
map 集合属于双列集合。存储的数据是多个键值对,并且键不可以重复,值可以。
| 常用方法 | 功能 |
| public V put(K key, V value) | 把指定的键与指定的值添加到Map集合中。 |
| public V remove(Object key) | 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 |
| public V get(Object key) | 根据指定的键,在Map集合中获取对应的值。 |
| boolean containsKey(Object key) | 判断集合中是否包含指定的键。 |
| public Set<K> keySet() | 获取Map集合中所有的键,存储到Set集合中。 |
| public Set<Map.Entry<K,V>> entrySet() | 获取到Map集合中所有的键值对对象的集合(Set集合)。 |
HashMap集合
HashMap集合是无序的,存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。可以实现有序存取。
import java.util.HashMap;
public class TestMap {
public static void main(String[] args){
//创建HashMap
HashMap<String, String> map = new HashMap<String, String>();
//添加键值对
map.put("1","张三");
map.put("2","李四");
map.put("3","张三");
//获取键对应值
System.out.println(map.get("3"));
//删除键,返回删除键的值
System.out.println(map.remove("2"));
}
}
Map中存在两种对象,key和value,Entry(项)将键值对封装成了对象。
public K getKey():获取Entry对象中的键。public V getValue():获取Entry对象中的值。
public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
遍历Map集合
import java.util.HashMap;
import java.util.Map.Entry;
public class TestMap {
public static void main(String[] args){
//创建HashMap
HashMap<String, String> map = new HashMap<String, String>();
//添加键值对
map.put("1","张三");
map.put("2","李四");
map.put("3","张三"); for (Entry<String, String> entry : map.entrySet()) {
// 解析
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"的值:"+value);
}
}
}
温馨提示
- 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
- 如果本文帮助了您,也请评论关注,作为对我的一份鼓励。
- 如果您感觉我写的有问题,也请批评指正,我会尽量修改。
Java基础学习笔记(六) - 数据结构和集合的更多相关文章
- Java基础学习笔记六 Java基础语法之类和ArrayList
引用数据类型 引用数据类型分类,提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类.我们可以把类的类型为两种: 第一种,Java为我们提供好的类,如Scanner ...
- java基础学习笔记六(继承)
继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java IO学习笔记六:NIO到多路复用
作者:Grey 原文地址:Java IO学习笔记六:NIO到多路复用 虽然NIO性能上比BIO要好,参考:Java IO学习笔记五:BIO到NIO 但是NIO也有问题,NIO服务端的示例代码中往往会包 ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- java基础学习笔记五(抽象类)
java基础学习总结——抽象类 抽象类介绍
- Java基础学习笔记二十八 管家婆综合项目
本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...
- Java基础学习笔记二十 IO流
转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStre ...
随机推荐
- 【Offer】[46] 【把数字翻译成字符串】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成"a",1翻译成"b",..... 1 ...
- moco 入门及问题解决
废话不多说 下载: http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/ 选择最新版本下载jar包 启动: 1:在本地jar包 ...
- eclipse中SpringBoot的maven项目出现无法解析父类的解决办法
在eclipse中建立SpringBoot的maven项目时,继承父类,添加如下代码: <parent> <groupId>org.springframework.boot&l ...
- CVE-2018-14418 擦出新火花
笔者<Qftm>原文发布:https://xz.aliyun.com/t/6223 0x00 前言 最近,一次授权的渗透测试项目意外的撞出了(CVE-2018-14418)新的火花,在这里 ...
- .Net基础篇_学习笔记_第六天_for循环的几个练习
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- a149: 乘乘樂
题目: 你拿到一个整数,却忍不住想把每个位数都乘在一起.例如看到356就会想要知道3 * 5 * 6的值为何.快写个程序帮帮为了乘数字而快发疯的自己吧! 思路:把这个数每一位%10,并且再将它每次/1 ...
- Git客户端下载
链接:http://pan.baidu.com/s/1eRXsITO 密码:4i6e
- Visual Studio Code 安装美化合集
这是一个关于VSCode编辑器的各种配置. 你可以在这里找到VSCode 的各种操作,如果这里找不到,请移步官方文档C++ programming with Visual Studio Code以及各 ...
- Elastic Stack 笔记(二)Elasticsearch5.6 安装 IK 分词器和 Head 插件
博客地址:http://www.moonxy.com 一.前言 Elasticsearch 作为开源搜索引擎服务器,其核心功能在于索引和搜索数据.索引是把文档写入 Elasticsearch 的过程, ...
- 在64系统里执行32位程序出现/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
安装下glic即可 sudo yum install glibc.i686