表、栈和队列
前言表、栈和队列是三种最基本、最简单的数据结构,此后的很多算法与数据结构都是要基于这三种结构。其实从定义来说栈和队列也是表,只不过它们是操作受限的表,为了以防后续混淆先声明一下位序和索引的不同,位序是从 1 开始的,而索引是从 0 开始的,在后续的实现中一般的操作都是基于索引的,如果是基于位序的会在注释中标明。
表(List)表是一个可以存储多个元素的线性数据结构,通常可以通过索引访问。基础操作:
插入:在特定位置添加元素。
删除:从特定位置移除元素。
查找:通过索引或值查找元素。
遍历:访问表中的每个元素。
根据其物理结构(存储结构)的不同,分为:
顺序表
链表
顺序表(Sequence List)顺序表的存储是在一片连续的空间中的,在程序中使用数组来实现,由于数组是静态的,在程序像操作系统申请分配后其大小就无法改变了,所以要实现一个扩容的动态顺序表就要在扩容申请另一片空间并将原来的数据拷贝到新的空间中,然后释放原来的空间。
以下是一个动态可扩容的顺序表的代码实现:
1234567891011121314151617181920212223242526272829303132 ...
数据结构与算法
前言数据结构与算法是计算机学习的一个重要方面,对数据结构与算法进行研究可以提升自己的问题解决能力,优化程序性能,并且更加深入的理解计算机系统。
数据结构对一个数据结构进行研究主要有以下三个方面:
逻辑结构
数据运算
物理结构(存储结构)
算法对一个算法进行研究有以下几个方面:
时间复杂度
空间复杂度
对于复杂度的表示一般使用大 O 表示法,n 为数据规模,比如:
$T(n) = 520 = O (1) $$T(n) = n + 520 = O(n)$$T(n) = n^2 + 4n + 5 = O(n^2)$$T(n) = nlog_2n + n + 99999 = O(nlogn)$$T(n) = n^3 + n^2 = O(n^3)$$T(n) = O(n^3 + n^2) = O(n^3)$
所以,使用大 O 表示法可以让我们忽略那些低阶的因子,把精力放在那些高阶的因子上,毕竟当 n 的规模足够大时,影响运行效率的往往是那些高阶的因子。
对于复杂度的比较 ...
时间类
简介在 Java 中,日期和时间的处理经历了重要的变化,特别是在 Java 8 引入了全新的日期时间 API。使用这些工具可以很方便的进行时间日期相关的运算和处理。
Java8 以前的时间类Java 8 之前,主要使用的日期时间类包括 Date 和 Calendar 以及时间格式化类 SimpleDateFormat。但由于设计缺陷和线程不安全,它们在 Java 8 之后逐渐被新的日期时间 API 所替代。
DateDate类表示特定的瞬时点(时间戳),可以精确到毫秒。
12345678import java.util.Date;public class DateExample { public static void main(String[] args) { Date date = new Date(); System.out.println("Current Date: " + date); }}
CalendarCalendar是一个抽象类,用于操作日期和时间。它支持多种日历系 ...
后端开发基础(二)- Java基础
后端开发导航 🌏后端开发基础(一)- 简介后端开发基础(二)- Java基础后端开发基础(三)- maven后端开发基础(四)- SQL
前言Java 是一种高级、面向对象的编程语言,以其可移植性、健壮性和可扩展性而闻名。 Java 由 Sun Microsystems(现为 Oracle)开发,遵循”一次编写,随处运行”的原则,允许代码在任何具有 Java 虚拟机 (JVM) 的设备上运行。它广泛用于构建大型企业应用程序、Android 移动应用程序和 Web 服务。 Java 具有自动内存管理(垃圾收集)、庞大的标准库和强大的安全功能,使其成为后端系统、分布式应用程序和基于云的解决方案的流行选择。学习 Java 语言也是为之后深入学习企业常用的后端开发框架 SSM 打好基础。
学习路线1. 环境准备JDK安装与配置
了解JDK、JRE和JVM的区别与关系
选择适合的JDK版本(如LTS版本:JDK 8、JDK 11、JDK 17)
下载与安装JDK
配置JAVA_HOME、PATH等环境变量
验证安装成功(使用java -version命令)
开发工具选择
Eclipse I ...
网络编程
简介Java 网络编程主要是通过套接字 (Socket) 来实现的,它允许程序在网络上进行通信。Java 提供了丰富的网络编程 API,特别是 java.net 包,其中包括一些核心类,如 Socket、ServerSocket、InetAddress 等。根据使用的传输协议的不同将我们将网络编程分为以下两大类:
UDP (用户数据报协议):无连接协议,适合对速度要求高但不一定需要可靠传输的应用场景。
TCP (传输控制协议):面向连接,提供可靠的数据传输。
UDPUDP 是一种无连接协议,适合需要快速传输而不要求可靠性的应用场景。在客户端使用 DatagramSocket 将 DatagramPacket 发送至指定 IP 的指定端口,在服务器端使用 DatagramSocket 监听指定端口。
UDP 服务器示例:
123456789101112131415161718192021222324252627import java.net.*;public class UDPServer { public static void main(String[] args ...
反射
简介Java 反射(Reflection)是 Java 语言中的一个功能强大的特性,允许程序在运行时检查或修改自身的结构(类、方法、字段等)。通过反射,开发者可以在程序运行时动态地访问类和对象的属性、调用方法,甚至修改其行为。反射主要用于框架开发、工具类库、动态代理等场景。
Java 反射的常见用途:
在运行时获取类信息:可以获取一个类的名称、构造方法、字段、方法、父类等信息。
动态创建对象:通过反射动态地创建类的实例,甚至可以调用私有构造方法。
调用方法:可以在运行时调用对象的公开或私有方法。
访问和修改字段:可以在运行时访问或修改对象的公开或私有字段。
动态代理:使用反射机制可以实现动态代理,特别是 AOP(面向切面编程)和其他框架中的功能。
常用的反射类
Class<?>:代表一个类,提供了很多用于获取类信息的方法,比如 getDeclaredFields()、getDeclaredMethods()。
Constructor<?>:代表构造方法,可以通过反射创建对象。
Field:代表类的字段,可以用来访问和修改对象的字段。
Method:代表类的方法 ...
代理
简介在 Java 中,代理(Proxy)模式是一种设计模式,它允许你为对象提供一个替身或占位符,以控制对该对象的访问。代理模式可以用于各种场景,比如延迟加载、访问控制、日志记录、事务处理等。
Java 中有两种常见的代理方式:
静态代理
动态代理
静态代理静态代理类在编译期间就已经确定,需要手动编写代理类,通常,静态代理类实现与被代理对象相同的接口,并且在代理类中可以对方法的调用进行增强处理。
在下面的例子中,ServiceProxy 是 RealService 的代理,它在调用 performAction 方法之前和之后做了一些额外的工作。
123456789101112131415161718192021222324252627282930313233343536// 定义接口public interface Service { void performAction();}// 实现接口的真实对象public class RealService implements Service { @Override public void ...
Thread
简介Java 的多线程编程是一个非常强大的部分 😎,它使得我们能过在一个程序中并发的执行多个任务。合理使用多线程,可以提高 Java 应用程序的性能,尤其是在处理 I/O 操作或计算密集型任务时。
多线程以下是一些在 Java 中实现多线程的主要方式和相关概念:
继承 Thread 类
通过继承 Thread 类并重写 run()方法,可以创建一个新线程。
12345678910111213141516class MyThread extends Thread { public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + " - " + i); } }}public class Main { public static void main(String[] ar ...
IO流
简介Java I/O 流(Input/Output Stream)是 Java 中进行数据输入和输出的核心组件,分为字节流和字符流两大类。它们可以处理文件、内存、网络、管道等不同的 I/O 源。
IO 流IO 流层次结构图
1234567891011121314151617181920212223242526272829java.io.InputStream ├── FileInputStream ├── BufferedInputStream ├── DataInputStream ├── ObjectInputStream ├── ByteArrayInputStream └── PipedInputStreamjava.io.OutputStream ├── FileOutputStream ├── BufferedOutputStream ├── DataOutputStream ├── ObjectOutputStream ├── ByteArrayOutputStream ...
Error
简介在 Java 中,异常处理是一种应对程序运行过程中可能出现的错误或异常事件的机制。Java 提供了一套强大的异常处理框架,确保程序能够优雅地处理错误,而不会导致程序崩溃 😎
异常类异常类层次结构图
123456789101112131415java.lang.Throwable ├── java.lang.Exception │ ├── java.lang.RuntimeException │ │ ├── NullPointerException │ │ ├── ArithmeticException │ │ ├── IndexOutOfBoundsException │ │ └── ... │ ├── IOException │ ├── SQLException │ └── ... └── java.lang.Error ├── OutOfMemoryEr ...








