
Java
文章平均质量分 89
语言只是实现目标的工具,而不是目标本身。
swadian2008
不积跬步,无以至千里;不积小流,无以成江海
展开
-
Java 基于 UDP 的 Socket 编程
UDP 是 User Datagram Protocol 的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。Java 主要提供了两个类来实现基于 UDP 的 Socket 编程。原创 2023-03-11 23:17:38 · 2280 阅读 · 0 评论 -
Java 基于 TCP 的 Socket 编程
服务器端会主动监听某个指定的端口,客户端必须主动连接服务器的 IP 地址和指定端口,如果连接成功,服务器端和客户端就成功地建立了一个 TCP 连接,双方后续就可以随时发送和接收数据。TCP 协议,指传输控制协议(TCP,Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。注意:服务端需要先于客户端启动,否则客户端因连接不到指定的进程而报错。实际场景中,一个服务端往往可以支持多个客户端的连接,为多个客户端提供服务。原创 2023-03-12 12:24:56 · 4251 阅读 · 0 评论 -
NIO编程
NIO(New I/O)是Java中一种提供了非阻塞式I/O操作的编程模型。它引入了一组新的Java类,用于取代传统的Java I/O类(如InputStream和OutputStream),以提供更高效、更灵活的I/O操作。// 部分NIO API实际上是阻塞的,例如File APIJava NIO允许执行非阻塞的IO。例如,线程可以请求通道将数据读入缓冲区。当通道将数据读入缓冲区时,线程可以做其他事情。一旦数据被读入缓冲区,线程就可以继续处理它。将数据写入通道也是如此。原创 2023-06-02 16:17:19 · 1484 阅读 · 1 评论 -
【Java8】Java 中新的日期和时间 API
Java 旧的日期时间类 java.util.Date 和 java.util.Calendar 存在可变性,导致在多线程环境下使用时会存在线程安全问题。在新的 API 中,几乎所有的类都是不可变的,从而保证了线程安全性。此外,旧的 API 命名不清晰,使得日期时间处理相对困难。新的 API 使用了更清晰和直观的命名,使得代码更易读、更易写。原创 2023-12-28 14:14:42 · 1175 阅读 · 0 评论 -
【Java8】Java 中的 Stream 流收集器
Java 中 Stream 流用来帮助处理集合,类似于数据库中的操作。在 Stream 接口中,有一个抽象方法collect,你会发现 collect 是一个归约操作(高级规约),就像reduce一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法可以通过Collector接口来定义。// collect和reduce都是Stream接口中的汇总方法,collect方法接收一个Collector(收集器)作为参数收集器(Collector。原创 2023-12-22 14:41:54 · 1746 阅读 · 0 评论 -
【Java】Java 中的 final 关键字和 static 关键字
这两个关键字编写代码时会经常用,正确的使用这些关键字,可以形成良好的编程习惯,保护好代码的封装性。原创 2023-12-15 15:17:43 · 1424 阅读 · 0 评论 -
Java 内存泄露问题详解
内存泄露指的是程序运行时未能正确释放不再使用的内存资源,导致这些内存资源无法被垃圾回收器回收和重新利用。内存泄露会导致程序占用越来越多的内存,最终可能导致内存耗尽和程序崩溃。在Java中,当一个对象不再被引用时,Java的垃圾回收器会自动将其标记为可回收,并在合适的时机释放其占用的内存。然而,如果存在内存泄露的情况,这些不再使用的对象仍然被保留在内存中,无法被垃圾回收器回收。内存泄露可能是由于编程错误、资源管理不当或设计问题引起的。原创 2023-05-22 15:01:54 · 4753 阅读 · 1 评论 -
Java JDBC 详解
Java JDBC (Java Database Connectivity)是Java语言中用于访问数据库的API。JDBC API提供了一组标准的接口,允许Java应用程序通过使用标准SQL查询语言访问和操作关系型数据库。使用JDBC API,开发人员可以编写可以在各种关系数据库上运行的Java应用程序。JDBC API的核心是java.sql包,它包含了一组接口和类,(1)允许开发人员连接到数据库、(2)执行SQL查询和更新、(3)检索结果并管理数据库连接。原创 2023-04-27 10:33:35 · 1487 阅读 · 0 评论 -
Java EE 和 Java EE 规范的简要描述
JavaEE和JavaEE规范的区别是,JavaEE是一种技术平台和运行环境,而JavaEE规范则是一系列的标准和规范文档,它定义了JavaEE平台的各种API和服务的具体实现方式和标准。JavaEE规范定义了这些API和工具的标准,供不同厂商实现。,JavaEE规范定义了JavaEE平台所需的各种API和服务,这些API和服务是JavaEE开发中的基础,如Servlet API、JDBC API、EJB API等,开发者在使用JavaEE平台进行应用程序开发时需要遵守JavaEE规范。原创 2023-04-17 22:55:26 · 703 阅读 · 0 评论 -
Java I/O 流详解(Basic I/O)
一个 I/O 流代表一个输入源或输出目的地。一个流可以表示许多不同类型的输入源和输出目的地,比如磁盘文件、设备、其他程序和存储阵列。流支持许多不同类型的数据,比如字节(字节流)、基本数据类型(数据流)、字符串(字符流)和对象(对象流)。有些流只是简单地传递数据;而有些流则能以有效的方式使用和转换数据。不管流在内部是如何工作的,所有流在程序中都是一个数据序列。原创 2023-01-30 09:21:36 · 439 阅读 · 0 评论 -
【Java】Java 中的自动装箱和拆箱
自动装箱和拆箱可以让开发人员编写更加清晰的代码,使代码更加易于阅读。基本类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble自动装箱和拆箱的实现是通过 Java 编译器在编译时进行的。具体来说,Java 编译器会将自动装箱和拆箱操作转换为对应的方法调用,以实现基本数据类型和包装类型之间的转换。但这在性能方面是要付出代价的。原创 2023-01-09 09:13:16 · 6275 阅读 · 3 评论 -
Java 泛型的类型擦除和使用限制详解
所以在某些情况下不能使用非具体化类型:例如,在表达式的实例中,或作为数组中的元素。在编译时或在运行时,无法验证涉及参数化类型的操作的正确性(例如,强制转换或方法调用),则会生成未检查的警告。我们知道,当编译一个继承参数化类或实现参数化接口的类或接口时,编译器可能会需要创建一个合成方法,该方法称为桥接方法,它是类型擦除过程的一部分。在类型擦除过程中,Java 编译器会擦除所有的类型参数,如果类型参数是有界的,则用它的边界类型替换每个类型参数,如果类型参数是无界的,则用 Object 替换每个类型参数。原创 2023-01-09 10:13:07 · 1284 阅读 · 0 评论 -
Java 泛型中的通配符详解
可以使用上界通配符来放宽对变量的限制。例如,你想编写一个方法,该方法适用于List, List 和 List;就可以通过使用上界通配符来实现这一点。声明一个上界通配符,需要使用通配符 ('?'),跟上 extends 关键字,然后再跟它的上界。比如,编写用于 Number 列表和 Number 子类型(如 Integer、Double 和 Float)的方法,可以指定 List原创 2023-01-09 10:11:42 · 8203 阅读 · 4 评论 -
Java 中的接口定义和继承规则详解
在 Java 中,接口是一种引用类型,类似于 class,它只能包含常量、方法签名、默认方法、静态方法和嵌套类型。方法体只存在于默认方法和静态方法中。接口不能被实例化——它们只能由 class 实现或由其他接口继承。按照惯例,implements 子句跟在 extends 子句后面。接口中的所有抽象方法、默认方法和静态方法都是隐式的 public 方法,因此可以省略 public 修饰符。此外,接口可以包含常量声明。在接口中定义的所有常量值都是隐式的 public、static 和 final。原创 2022-12-28 13:42:52 · 2790 阅读 · 2 评论 -
Java中lambda表达式及其应用
用函数式接口可以干什么呢? Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。具体说来,就是函数式接口一个具体实现的实例。原创 2022-12-27 10:49:06 · 1233 阅读 · 0 评论 -
Java中的访问修饰符:public/protected/private
在 Java 中,有许多用于控制等访问行为的修饰符,这些访问修饰符包括:和private。//访问修饰符用于对类和成员的访问控制访问级别的修饰符可以决定其他类是否可以使用类中特定的字段或调用特定的方法。无修饰符。原创 2022-12-26 09:48:12 · 850 阅读 · 0 评论 -
什么是 Java 泛型?怎样使用 Java 泛型?
泛型类是指通过对参数类型进行泛化的类或接口。下面的 Box.class 可以演示这个概念。该方法接受或返回 Object,所以除了基本的数据类型外,可以传入任何类型的对象。但是,当上边程序在进行编译时,没有办法去验证这个类是如何使用的。比如,一开始可能会往 Box 中放置一个Integer 对象,而接下来有可能会错误地传入一个String 对象,如果此时仍然期望从 Box 中获得一个 Integer 对象,会导致运行时错误。类型参数部分,用尖括号()进行分隔,并跟在类名后面。原创 2023-01-09 10:10:30 · 2477 阅读 · 0 评论 -
Java 语言的组成部分:变量、操作符、代码块和控制流
Java 还支持一些针对 char 和 String 字面值的特殊转义序列:\b(退格)、\t(制表符)、\n(换行)、\f(换行)、\r(回车)、\"(双引号)、\'(单引号)和\\(反斜杠)。在创建之后,它的长度是不可变的。这种数据类型表示一个 bit 的信息,但它的“大小”并不是精确定义的。如果局部变量不能在声明的地方进行初始化,那么要确保在使用它之前对它进行赋值,访问未初始化的局部变量将导致编译不通过。Arrays 类中的方法还提供了的其他一些有用的操作,详情请阅读 Arrays 类的 API。原创 2022-12-26 09:36:30 · 606 阅读 · 0 评论 -
Java 异常(Exceptions)
定义:异常是在程序执行过程中发生的一种事件,它会中断程序指令的正常流程。当方法中发生错误时,该方法会创建一个对象并将其移交给运行时系统。该对象称为异常对象,包含有关错误的一些信息,比如错误的类型和错误发生时程序的状态等。创建异常对象并将其交给运行时系统的行为称为抛出异常。方法抛出异常后,运行时系统会尝试寻找处理异常的方法。这些处理异常的方法可能是一个有序的方法集合,通过调用这些方法来获取错误抛出的位置。原创 2022-12-21 18:05:08 · 477 阅读 · 0 评论 -
Java 提供了哪些IO方式? NIO如何实现多路复用?
/ java.io(同步阻塞) \ NIO(同步非阻塞) \ NIO2(异步非阻塞)Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。第一,传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。java.io 包的好处是代码比较简单、直观,原创 2022-09-29 09:45:35 · 462 阅读 · 0 评论 -
Java 面向对象设计的基本思想
接口和抽象类是 Java 面向对象设计的两个基础机制。接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口不能实例化;不能包含任何非常量成员,任何 Field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如。//Java8后接口中还可以有默认方法。原创 2022-09-29 09:42:36 · 464 阅读 · 0 评论 -
Java 集合之 SortedSet 和 SortedMap
如果直接修改了支持的排序集,排序集的范围视图仍然有效。因为排序集的范围视图的端点是元素空间中的绝对点,而列表范围视图的端点是支持集合(list)中的特定元素。因为TreeSet采用了它以前的做法,所以它还提供了一个构造函数,该构造函数接受SortedSet并返回一个新的TreeSet,其中包含按照相同条件排序的相同元素。SortedSet 接口有一个访问比较器的 comparator 方法,该方法返回用于对集合排序的comparator,如果集合根据其元素的自然顺序排序,则返回null。原创 2022-09-13 22:24:15 · 1198 阅读 · 0 评论 -
Java 数据结构之队列(Queue)详解
但需要注意的是,由于数组的容量是固定的,当队列已满时,无法再添加新的元素,除非进行元素的出队操作。通过enqueue()方法将元素入队,dequeue()方法将元素出队,peek()方法返回队列头部元素,size()方法返回队列当前元素个数,isEmpty()方法和isFull()方法检查队列是否为空或已满。Deque接口还提供了一些其他方法,如size()用于返回双端队列中的元素个数,isEmpty()用于判断双端队列是否为空,clear()用于清空双端队列中的所有元素等。原创 2022-09-11 12:04:45 · 31642 阅读 · 0 评论 -
Java 集合之 List
List是一个有序的集合,列表可能包含重复的元素。除了继承自Collection的操作外,List接口还包括以下操作:根据位置操作——根据元素在列表中的下标位置操作元素。如 get、set、add、addAll和remove等方法。搜索——在列表中搜索指定的对象并返回其数字位置。搜索方法包括 indexOf 和 lastIndexOf迭代——利用列表的顺序特性,扩展了Iterator语义。listIterator方法提供了这种行为。范围操作——Thesublistmethod performs原创 2022-09-11 12:03:42 · 1407 阅读 · 0 评论 -
Java 集合之 Set
Set 集合是一个的集合。Set接口只包含从Collection继承的方法,并添加了禁止重复元素的限制。Set还为equals和hashCode操作的行为添加了更强的约定,允许对Set实例进行有意义的比较,即使它们的实现类型不同。如果两个Set实例包含相同的元素,则它们是相等的。Java平台包含三种通用的集合实现:HashSet、TreeSet 和 LinkedHashSet。如果想要通过一个集合创建另一个包含相同元素的集合,但要消除所有重复项。原创 2022-09-08 18:07:16 · 431 阅读 · 0 评论 -
Java 集合之 Map
Map是一个将键映射到值的对象。map不能包含重复的键,它模拟数学函数的抽象。Java平台包含三种通用Map实现:HashMap、TreeMap和LinkedHashMap。它们的行为和性能完全类似于HashSet、TreeSet和LinkedHashSet。例如,Map常见的应用场景,按部门对员工进行分组或者按部门计算工资总和。原创 2022-09-08 16:35:07 · 1379 阅读 · 0 评论 -
Java 对象排序(Object Ordering)
Comparable接口由以下方法组成}compareTo 方法将接收对象与指定对象进行比较,并根据接收对象是小于、等于还是大于指定对象返回负整数、0或正整数。示例代码,如 Name.class 实现了Comparable 接口,定义了自己类的 compareTo() 逻辑/*** 名称对象是不可变的。* 在一些情况下,需要类型是不可变的,比如作为set集合中的元素,或者在map中用作键的对象。*/// 在构造函数中检查参数是否为空。原创 2022-09-07 18:36:53 · 4031 阅读 · 0 评论 -
Java 使用 Optional 取代 Null 的实践
Java 8中引人了一个新的类用于解决在编程中可能出现的空指针异常问题。它的主要目的是表示一个值可能存在,也可能不存在的情况,并提供一些方法来安全地处理这些可能为 null 的值。下边,使用Optional重新定义//此模型默认Insurance的name不能为null//以上数据模型都省略了get/set方法比较之前的两处代码,我们可以看到,处理潜在可能缺失的值时,使用 Optional 具有明显的优势。原创 2022-08-05 10:36:39 · 835 阅读 · 0 评论 -
AutoCloseable接口的使用
jdk1.7 引入了资源自动关闭的AutoCloseable接口。从AutoCloseable的注释可知它的出现是为了更好的管理资源,准确说是资源的释放。当一个资源类实现了该接口close方法,在使用try-catch-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。像数据库链接类Connection,IO类InputStream或OutputStream都直接或者间接实现了该接口。使用的时原创 2021-12-24 15:21:38 · 1281 阅读 · 0 评论 -
Java中break使用标签中断循环
在Java中,break语句有三种用法,第一种是用于终止switch语句中的语句序列 第二种是用于退出循环 第三种是用作goto语句的“文明”形式我们知道,goto语句会破坏程序的结构,所以我们一般不会去使用这种功能。但是在某些情况下,goto语句对于流程控制很有价值并且结构合法。比如当退出深度嵌套的一系列循环时,goto语句很好用。虽然Java中保留了goto关键字,但是没有goto语句,也没有任何用到这个关键字的地方,所以为了能够使用类似像goto语句这样的功能,Java定义了break语句的原创 2021-11-22 22:44:33 · 834 阅读 · 0 评论 -
Java8函数式接口详解
Java8函数式接口接口 参数 返回 中文 实例 Supplier None T 提供者 工厂方法创建对象 Consumer T None 消费者 Predicate T boolean 判断/谓词 Function T R 函数 一、Supplier 接口Supplier 接口代表一个结果的提供者。Supplier 接口是用来生成数据的,数据原创 2021-08-24 11:16:02 · 1542 阅读 · 0 评论 -
Arrays.asList 为何不能添加和删除元素?
java.util.Arrays.ArrayList和 java.util.ArrayList实现的接口不同java.util.ArrayList实现了java.util.List接口java.util.Arrays.ArrayList继承的java.util.AbstractList方法没有实java.util.List接口中remove方法的逻辑原创 2021-09-03 13:47:39 · 1800 阅读 · 0 评论 -
深入浅出 Java8 lambda 表达式(官方文档翻译)
Lambda 表达式是一个匿名函数。简单地说,它是一个没有声明的方法,它即没有访问修饰符、也没有返回值以及名字。你可以将其想象成一种速记方式,只在你需要使用的方法中编写它。尤其当方法只使用一次且方法定义较短的情况下,将会很有用,它省去了声明类和编写单独方法的工作。Java 中的 Lambda 表达式通常使用() -> 42在 Java 中,Marker(标记)类型的接口是一种没有方法或属性声明的接口,简单地说,Marker 接口是空接口。相似地,函数式接口是只包含一个抽象方法声明的接口。翻译 2021-08-18 10:56:57 · 484 阅读 · 0 评论 -
Java方法参数的传递方式:值调用
在程序设计语言中将参数传递给方法(或函数)有以下两种方式:按值调用//Java按引用调用// C++方法可以修改按引用传递的变量的值,而不能修改按值传递的变量的值。“按……调用”(call by)是一个标准的计算机科学术语,事实上,以前还有按名调用(call by name),Algol 程序设计语言是最古老的高级程序设计语言之一,它使用的就是这种参数传递方式。不过,这种传递方式已经成为历史。Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个副本。原创 2021-08-17 16:35:40 · 955 阅读 · 0 评论 -
【Java代理】静态代理、动态代理、cglib代理
需要注意的是,由于模块系统(introduced in Java 9)和一些类加载器的变化,CGLIB 可能需要一些额外的配置或对模块进行开放访问,以确保代理生成能够顺利进行。因为 CGLIB 代理是通过生成目标类的子类来实现的,所以被代理类不能是 final 类。,动态生成的代理类已经继承了Proxy类的,就不能再继承其他的类,所以只能靠实现被代理类的接口的形式,故JDK的动态代理必须有接口。代码冗余:每个目标对象都需要编写对应的代理类,如果接口增加方法,代理类需要同步修改,容易导致代码膨胀。原创 2021-07-24 22:44:21 · 831 阅读 · 4 评论 -
Java 各种 I/O 流操作示例——修改中...
IO流一般有以下几种,主要是用来操作相关文件,其中设计的文件类有File类。主要熟悉字节流和字符流就可以了,没有啥难度,这里只是简单的介绍了下基本的步骤,完整的应用可以查看我的另一篇文章。原创 2021-04-21 15:51:43 · 764 阅读 · 0 评论 -
JAVA基础——泛型和通配符——修改中...
一、泛型概念的提出当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常代码程序:public class Demo { public static void main(String[] args) { // 不使用泛型 ArrayList arr = new ArrayList(); arr.add(new Tiger("华南虎")); arr.add(new Tiger("东北虎"));原创 2021-04-17 10:06:00 · 421 阅读 · 0 评论 -
Java IO 流基本操作示例——修改中...
一、流的使用示例1、使用本地文件流读取和写入数据(1)字节流的操作:FileInputStream/FileOutputStream基本文件流可以用来读取和写入所有类型的文件(操作字节流),包括音频、图片、视频等补充知识点://new String(bytes,0,h) 字符串构造方法public String(byte bytes[], int offset, int ...原创 2020-03-09 22:08:32 · 1107 阅读 · 1 评论 -
Java 中的集合接口详解
理解Java Collection接口,可以更好地使用和管理集合对象,并了解集合框架的常用操作和特性。此外,Java提供了许多实现Collection接口的类,包括ArrayList、LinkedList、HashSet、TreeSet等,它们提供了不同的数据结构和特性,可以根据实际需求选择合适的实现类来操作和管理集合。原创 2021-08-17 11:12:55 · 1056 阅读 · 1 评论 -
Java发送邮件详解
目录一、关于电子邮件电子邮件传输协议SMTP协议POP3协议邮件收发原理二、发送纯文本邮件二、发送带图片和附件的邮件一、关于电子邮件电子邮件要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。SMTP服务器地址:一般是 smtp.xxx.c...原创 2019-10-16 11:42:39 · 2351 阅读 · 0 评论