Java中的数据结构 | 常用API

本文深入讲解Java中的核心概念和技术,包括面向对象编程、泛型、集合框架、字符串API等内容,并探讨了栈、队列等数据结构的实现及应用场景。

0.基石 | 机制

0.0 Java的流、I O

Steam

参考

常用方法

IO流

Scanner

0.1 Java中基本数据类型取值范围

Number类

Math类

0.2 Java中的强转和进制转换

0.3 Java中的泛型

介绍

Java中的泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。

在这里插入图片描述——来自:菜鸟教程

泛型方法

泛型方法,该方法在调用时可以接受不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

定义泛型方法的规则:

  • 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前
  • 每一个类型参数声明部分包含一个或多个类型参数,参数之间啊用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。。
  • 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
  • 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(比如 int、double、char 等)。

Java 中泛型标记符:

  • E-Element (集合中的元素)
  • T-Type (Java类)
  • K-Key (键)
  • V-Value (值)
  • N-Number (数值类型)
  • ?-表示不确定的Java类型

实例:

public class GenericMethodTest
{
	// printArray
	public static < E > void printArray ( E[] inputArray)
	{
	 	// 
	 	for( E element : inputArray){
	 		System.out.printf("%s",element);
	 		}
	 	System.out.println();
	 }

	public static void main (String args[]){

		//create diffrent type of arrarys : Integer, Double ,Character
		Integer [] intArray={1,2,3};
		Double [] doubleArrary = ……
		……
		and so on

		next we could print theses arrays by using printArray
		


	}
}

有界的类型参数

可能有时候,你会想限制那些被允许传递到一个类型参数的类型种类范围。例如,一个操作数字的方法可能只希望接受Number或者Number子类的实例。这就是有界类型参数的目的。

要声明一个有界的类型参数,首先列出类型参数的名称,后跟extends关键字,最后紧跟它的上界

实例:

public class MaximumTest
{
	//比较三个值返回最大值
	public static <T extends Comparable<T> > T maximum(T x,T y ,T z )
	{
		T max = x;
		if(y.compareTo(max) > 0 ){
	 		max = y;
	 	}
	 	if(z.compareTO(max) > 0){
	 		max = z;
		 }
		 
	 return max;
	 
	 }
	 
	 public static void main (String args[])
	 {
	
		sout( "%d, %d 和 %d 中最大的数为 %d\n\n",
                   3, 4, 5, maximum( 3, 4, 5 ))
	 }

}

0.4 Iterator 迭代器

介绍

Java迭代器是Java集合框架中的一种机制,用于遍历集合(如:列表、集合和映射等)的接口。它提供了一种统一的方式来访问集合中的元素,而不需要了解底层集合的具体实现细节。
Java Iterator 不是一个集合,是一种方法。Iterator是Java迭代器最简单的实现,ListIterator是CollectionAPI中的接口,扩展了Iterator接口。
在这里插入图片描述
迭代器接口定义了几个方法,最常用的是以下三个:

  • next() - 返回迭代器的下一个元素,并将迭代器的指针移到下一个位置。
  • hasNext() - 用于判断集合中是否还有下一个元素可以访问。
  • remove() - 从集合中删除迭代器最后访问的元素。
    Iterator 类位于java.util包中,使用前需要引入它。

通过迭代器,我们可以逐个访问集合中的元素,而不需要使用传统的for循环或者索引。这种方式更加简洁和灵活,并且适用于各种类型的集合。

获取一个迭代器

import java.util.ArrayList;
import java.tuil.Iterator;

public class RunoobTest{
	public static void main(String []arg)
	{
		ArrayList <String> sites = new ArrayList<String>();
		sites.add("Google");
		sites.add("Baidu");
		
		//实例化集合的迭代器接口
		Iterator<String> it = sites.iterator();
		System.out.print(it.next());
		

返回所有集合中的元素:
代码:

while(it.hasNext())
{
 System.out.println(it.next());
 }
// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;

public class RunoobTest {
    public static void main(String[] args) {

        // 创建集合
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Zhihu");

        // 获取迭代器
        Iterator<String> it = sites.iterator();

        // 输出集合中的所有元素
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

删除操作

// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;

public class RunoobTest {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<Integer>();
        numbers.add(12);
        numbers.add(8);
        numbers.add(2);
        numbers.add(23);
        Iterator<Integer> it = numbers.iterator();
        while(it.hasNext()) {
            Integer i = it.next();
            if(i < 10) {  
                it.remove();  // 删除小于 10 的元素
            }
        }
        System.out.println(numbers);
    }
}

注意点

PS: 使用迭代器集合的时候,如果在遍历过程中对集合进行了修改比如增删,可能会导致一个异常:ConcurrentModificationException,为了避免这个问题,可以使用迭代器自身的 remove()方法进行删除操作。

而且迭代器是一种单向遍历机制,只能从前往后遍历集合中的元素,不能往回遍历。同时,在使用迭代器遍历集合时,不能直接修改集合中的元素,而是需要使用迭代器的remove()方法删除当前元素。

0.41 Iterable

iterator为迭代器对象,而Iterable则是对iterator的封装

0.5 循环结构(提炼重点)

关于 for 循环有以下几点说明:

  • 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
  • 然后,检测布尔表达式的值。如果为 true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
  • 执行一次循环后,更新循环控制变量。
  • 再次检测布尔表达式。循环执行上面的过程。

在 Java5 中引入了一种主要用于数组的增强型 for 循环。

for(声明语句 : 表达式)
{
   //代码句子
}

声明语句:声明新的局部变量该变量的类型必须和数组元素类型匹配。作用域限定在循环语句块,其值与此时数组元素的值相等。

表达式:访问的数组名,或者是返回值为数组的方法。

1.数组和集合API

在这里插入图片描述

1.0 Java数组 Array

1.1 Java集合 Collection And Map

  • 继承图

Collection---->Collections Map----->SortedMap------>TreeMap

Collection---->List----->(Vector \ ArryList \ LinkedList) Map------>HashMap

Collection---->Set------>(HashSet \ LinkedHashSet \ SortedSet)
在这里插入图片描述

通常来讲集合下面包含两大类:

  • 单列-Colletion 双列-Map
  • Collection-单列
    • 可重复 List
    • (ArrayList、LinkedList、Vector)
    • 不可重复 Set
    • (HashSet(无序)、LinkedHash(添加顺序)、TreeSet(自然顺序))
  • Map-双列(键值对)
    • HashTable
    • HashMap
    • LinkedHashMap
    • WeakHashMap
    • TreeMap
    • IdentifyHashMap

1.1.1 Collection接口

在这里插入图片描述

List集合

List中主要有ArrayList、LinkedList两个实现类;Set中则是有HashSet实现类;而Queue是在JDK1.5后才出现的新集合,主要以数组和链表两种形式存在。

  • List 常用方法
A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。

B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。

C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。

D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。

E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。

F:长度功能
int size():获取集合中的元素个数

G:把集合转换成数组
Object[] toArray():把集合变成数组。

asList
String[] arr = {"apple", "banana", "orange"};
List<String> list = Arrays.asList(arr);

1.1.2 Map接口

参考

1.2 工具类:Collections和Arrays

  • 它们提供提供了封装器实现(Wrapper Implementations)、数据结构算法和数组相关的应用

常用方法

  • binarySearch:二分查找

  • sort:归并排序

  • reverse:将线性表进行逆序操作

  • rotate:以某个元素为轴心将线性表“旋转”

  • swap:交换一个线性表中两个元素的位置

2.栈相关API(相关实现已由Deque负责)

2.1 Stack

创建一个栈,相关方法

 Stack<Object> stack = new Stack<>();
 stack.push(Object);
 stack.pop();
 stack.peek();//查看栈顶元素
 stack.size();
 stack.empty();//返回值为 true or false

2.x Deque 如何作为栈使用?-ArrayDeque

  • 特点
    • 容量不限(可变数组)
    • 线程不安全的,没有外部同步的情况下不能在多线程中使用
    • 作为栈来使用,效率比Stack高,作为队列使用,比LinkedList效率高
    • 不支持null值
  • 继承关系

在这里插入图片描述

3.队列相关API

3.1Queue

Queue是实现队列的接口
在这里插入图片描述首先,Queue接口是常用API,继承自Collection 接口

常用的实现类

  • LinkedList 和 PriorityQueue

常用六种方法

(不满足条件时:前者抛异常,后者返回特殊值):

  • 压入元素(添加):add()、offer()

    • 相同:未超出容量,从队尾压入元素,返回压入的那个元素。
    • 区别:在超出容量时,add()方法会对抛出异常,offer()返回false
  • 弹出元素(删除):remove()、poll()

    • 相同:容量大于0的时候,删除并返回队头被删除的那个元素。
    • 区别:在容量为0的时候,remove()会抛出异常,poll()返回false
  • 获取队头元素(不删除):element()、peek()

    • 相同:容量大于0的时候,都返回队头元素。但是不删除。
    • 区别:容量为0的时候,element()会抛出异常,peek()返回null。

每一个队列的实现必须指定其顺序属性(按先后顺序排;按递增(自然)顺序排)

并发情况

然而Queue接口并未定义阻塞队列的方法

BlockingQueue 定义了那些等待元素出现或者等待队列中有可用空间的方法

补充

1.null值通常不被允许插入,除了在少数实现中
2.Queue实现通常未定义equals和hashCode方法的基于元素的版本,而是从Object类中继承了基于身份的版本

3.1.2 双端队列-Deque

首先Deque 也是一个接口,继承自 Queue

Deque 实现类

  • LinkedList,ArrayDeque,LinkedBlockingDeque

Deque 方法

boolean add(E e);在队列尾部添加一个元素 成功返回true 失败抛出异常
boolean offer(E e);在队列尾部添加一个元素 成功返回true 失败返回false
E remove();取出队列的第一个元素,并从队列中移除该元素,成功返回该元素,失败返回false,如果指定元素为空,抛出NullPointerException
E poll();取出队列第一个元素,并从队列中移除该元素,成功返回该元素,失败返回null。
E element();取出队列第一个元素,不移除,成功返回该元素,失败抛出异常
E peek(); 取出队列第一个元素,不移除,成功返回该元素,失败返回null。

Deque的独有方法

void addFirst(E e);在队列头部 添加一个元素,失败抛出异常
void addLast(E e);在队列尾部 添加一个元素,失败抛出异常
boolean offerFirst(E e);在队列头部 添加一个元素,成功返回true ,失败返回false
boolean offerLast(E e);在队列尾部 添加一个元素,成功返回true ,失败返回false
E removeFirst();取出队列的第一个元素,并移除该元素,成功返回该元素,失败抛出异常
E removeLast();取出队列的最后一个元素,并移除该元素,成功返回该元素,失败抛出异常
E pollFirst();取出队列的第一个元素,并移除该元素,成功返回该元素,失败返回null
E pollLast();取出队列的最后一个元素,并移除该元素,成功返回该元素,失败返回null
E getFirst();取出队列的第一个元素,不移除,成功返回该元素,失败抛出异常
E getLast();取出队列的最后一个元素,不移除,成功返回该元素,失败抛出异常
E peekFirst();取出队列的第一个元素,不移除,成功返回该元素,失败返回null
E peekLast();取出队列的最后一个元素,不移除,成功返回该元素,失败返回null
boolean removeFirstOccurrence(Object o);移除双向队列中第一个出现的该元素,成功返回true,失败抛出异常
boolean removeLastOccurrence(Object o);移除双向队列中最后一个出现的该元素,成功返回true,失败抛出异常
void push(E e);在双向队列头部 添加一个元素 ,失败抛出异常
E pop();取出队列的第一个元素,并移除该元素,队列为空时 抛出NoSuchElementException
boolean contains(Object o);判断队列中是否包含指定元素,包含返回true 否则返回false

4.字符串 API

4.1 StringBudiler & StringBuffer & String

5.树 和 相关API

6.图 和 相关API

正则表达式

Java 8

Java 11

Java 17

Java 21

Spring 常用接口

Model

1.数据校验

2.数据拉取

3.数据存储

开发常用接口

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~Yogi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值