自学Java基础知识第六天

85 阅读9分钟

一.学习内容

1.数组 2.数据结构 3.集合框架 4.ArrayList、LinkedList、HashSet、HashMap、Iterator 。

二.学习内容

1.Java 数组

数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。 Java 语言中提供的数组是用来存储固定大小的同类型元素。

可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number0,number1,....,number99。

创建数组 Java语言使用new操作符来创建数组,语法如下: arrayRefVar = new dataType[arraySize];上面的语法语句做了两件事:

(1)、使用 dataType[arraySize] 创建了一个数组。

(2)、把新创建的数组的引用赋值给变量 arrayRefVar。

处理数组 数组的元素类型和数组的大小都是确定的,所以当处理数组元素时候,我们通常使用基本循环或者 For-Each 循环。

For-Each 循环 JDK 1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。

多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

Arrays 类 java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。具有以下功能:

给数组赋值:通过 fill 方法。

对数组排序:通过 sort 方法,按升序。

比较数组:通过 equals 方法比较数组中元素值是否相等。

查找数组元素:通过 binarySearch 方法能对排序好的数组进行二分查找法操作。

2.Java 数据结构

Java 提供了丰富的数据结构来处理和组织数据。 Java 的 java.util 包中提供了许多这些数据结构的实现,可以根据需要选择合适的类。以下是一些常见的 Java 数据结构:

数组(Arrays)

数组(Arrays)是一种基本的数据结构,可以存储固定大小的相同类型的元素。

特点: 固定大小,存储相同类型的元素。

优点: 随机访问元素效率高。

缺点: 大小固定,插入和删除元素相对较慢。

列表(Lists) Java 提供了多种列表实现。

特点: 动态数组,可变大小。

优点: 高效的随机访问和快速尾部插入。

缺点: 中间插入和删除相对较慢。

LinkedList:

特点: 双向链表,元素之间通过指针连接。

优点: 插入和删除元素高效,迭代器性能好。

缺点: 随机访问相对较慢。

集合(Sets)

集合(Sets)用于存储不重复的元素,常见的实现有 HashSet 和 TreeSet。

特点: 无序集合,基于HashMap实现。

优点: 高效的查找和插入操作。

缺点: 不保证顺序。

TreeSet:

特点:TreeSet 是有序集合,底层基于红黑树实现,不允许重复元素。

优点: 提供自动排序功能,适用于需要按顺序存储元素的场景。

缺点: 性能相对较差,不允许插入 null 元素。

映射(Maps)

映射(Maps)用于存储键值对,常见的实现有 HashMap 和 TreeMap。

特点: 基于哈希表实现的键值对存储结构。

优点: 高效的查找、插入和删除操作。

缺点: 无序,不保证顺序。

TreeMap:

特点: 基于红黑树实现的有序键值对存储结构。

优点: 有序,支持按照键的顺序遍历。

缺点: 插入和删除相对较慢。

栈(Stack)

栈(Stack)是一种线性数据结构,它按照后进先出(Last In, First Out,LIFO)的原则管理元素。在栈中,新元素被添加到栈的顶部,而只能从栈的顶部移除元素。这就意味着最后添加的元素是第一个被移除的。

Stack 类: 特点: 代表一个栈,通常按照后进先出(LIFO)的顺序操作元素。

队列(Queue)

队列(Queue)遵循先进先出(FIFO)原则,常见的实现有 LinkedList 和 PriorityQueue。

Queue 接口:

特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。

实现类: LinkedList, PriorityQueue, ArrayDeque。 堆(Heap) 堆(Heap)优先队列的基础,可以实现最大堆和最小堆。

树(Trees)

Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。

图(Graphs) 图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。

3.Java 集合框架

早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。

集合框架被设计成要满足以下几个目标。 该框架必须是高性能的。 基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。 对一个集合的扩展和适应必须是简单的。

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

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

接口:是代表集合的抽象数据类型。例如 Collection、List、Set、Map 等。之所以定义多个接口,是为了以不同的方式操作集合对象

实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。

算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序,这些算法实现了多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

除了集合,该框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

Set和List的区别

  1. Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

  2. Set 检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>。

  3. List 和数组类似,可以动态增长,根据实际存储的数据的长度自动增长 List 的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。

集合算法

集合框架定义了几种算法,可用于集合和映射。这些算法被定义为集合类的静态方法。 在尝试比较不兼容的类型时,一些方法能够抛出 ClassCastException异常。当试图修改一个不可修改的集合时,抛出UnsupportedOperationException异常。 集合定义三个静态的变量:EMPTY_SET,EMPTY_LIST,EMPTY_MAP的。这些变量都不可改变。

4.Java ArrayList

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

ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下: import java.util.ArrayList; // 引入 ArrayList 类 ArrayList objectName =new ArrayList<>();  // 初始化E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。 objectName: 对象名。

ArrayList 是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。

Linked list

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

Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。 与 ArrayList 相比,LinkedList 的增加和删除的操作效率更高,而查找和修改的操作效率较低。 以下情况使用 ArrayList :

频繁访问列表中的某一个元素。 只需要在列表末尾进行添加和删除元素操作。

以下情况使用 LinkedList : 你需要通过循环迭代来访问列表中的某些元素。 需要频繁的在列表开头、中间、末尾等位置进行添加和删除元素操作。

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

HashSet

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。 HashSet 实现了 Set 接口。

HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。 HashMap 是无序的,即不会记录插入的顺序。 HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。

Java Iterator

ava迭代器(Iterator)是 Java 集合框架中的一种机制,是一种用于遍历集合(如列表、集合和映射等)的接口。

它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。 Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。 Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。

迭代器接口定义了几个方法,最常用的是以下三个: next() - 返回迭代器的下一个元素,并将迭代器的指针移到下一个位置。 hasNext() - 用于判断集合中是否还有下一个元素可以访问。 remove() - 从集合中删除迭代器最后访问的元素(可选操作)。