![](https://img-blog.csdnimg.cn/548c212f254344d48fbd8fe7343bde27.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java基础
文章平均质量分 70
# Java基础
征途黯然.
Hold me hard and mellow.
展开
-
一文详解Servlet 看这篇就够了
Servlet是什么?是做什么的?原创 2023-10-04 22:48:46 · 3015 阅读 · 8 评论 -
【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承
在`Maven`中,依赖范围`(Dependency Scope)`用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖范围,可以在不同的构建和执行环境中控制依赖项的加载和使用。原创 2023-08-07 22:30:00 · 3396 阅读 · 0 评论 -
【Java反序列化】@JsonAlias字段别名
注解,我们指定了两个别名:“first_name” 和 “firstName”。数据或与外部系统集成时很有用,可以使得字段或方法能够接受不同的命名约定。注解时,可以为字段或方法指定一个或多个别名。数据时,它将尝试使用给定的别名来匹配字段或方法的名称。数据时,为字段或方法指定多个可接受的名称或别名。库提供的一个注解,用于在反序列化。这个注解对于处理多个版本的。数据中包含这两个别名之一,原创 2023-07-17 19:44:20 · 3935 阅读 · 0 评论 -
【Java 8】Optional类与函数式编程
Optional类的用法。原创 2023-07-20 22:00:00 · 2950 阅读 · 2 评论 -
【Java】eclipse如何导入项目
【Java】eclipse如何导入项目1.第一步,打开eclipse,点击file->import2.第二步,选择general->existing projects into workspace (即常规-现有项目导入到工作空间)3.第三步,选择browse来选择被导入的文件。记住下方红框一定要勾选,才能把文件复制到eclipse的工作空间里面。...原创 2020-01-01 16:43:34 · 1485 阅读 · 0 评论 -
【Java】监听jframe窗口大小改变函数:addComponentListener
问题描述: 主要用于解决Jframe窗口大小变化时,里面的组件的位置也会自适应的移动。 相当于js里面的窗口大小改变监听函数:window.onresize = function(){ //js脚本接口 } 在java里面应该用的接口是://让窗口响应大小改变事件jframe.addComponentListener(new ComponentAdapter() {...原创 2019-11-07 21:41:33 · 4326 阅读 · 0 评论 -
【Java】Java连接Mysql数据库的demo示例
【Java】Java连接Mysql数据库的demo示例1.安装mysql数据库2.下载java-mysql-connector.jar包3.完成java配置4.写java代码运行测试1.安装mysql数据库这里不多重复,我主要讲解java连接mysql数据库并写代码运行,数据库请大家百度自己安装,网上教程也特别多。最后Mysql完成到如下界面就ok。2.下载java-mys...原创 2019-11-10 12:59:41 · 4807 阅读 · 4 评论 -
JDK SPI、Spring SPI、Dubbo SPI三种机制的细节与演化
首先在java中定义了接口。原创 2023-06-02 23:45:00 · 3260 阅读 · 1 评论 -
Java的Stream操作详解
接口中定义的方法,用于比较两个整数的大小,返回一个整数值,如果第一个整数小于第二个整数,返回负数;· 匹配操作(allMatch、anyMatch、noneMatch):使用给定的谓词测试数据源中的元素是否匹配。是一种基于流式处理的API,它提供了一种简洁而高效的方式来处理集合、数组或任何其他数据源中的元素。需要注意的是,由于基本类型无法为null,因此如果在映射过程中存在可能返回null的情况,需要先使用。· 统计操作(count、min、max、sum、average):统计数据源中的元素。原创 2023-02-25 13:19:24 · 3576 阅读 · 10 评论 -
使用HashMap的containsKey查找键,时间复杂度为什么是O(1)?
在最坏情况下,所有键都被映射到同一个桶中,导致链表或红黑树的长度变为N,此时插入、查找和删除的时间复杂度将变为O(N)。为了避免这种情况,需要使用一种好的哈希函数,使得键被平均分布到各个桶中,从而使得插入、查找和删除的平均时间复杂度保持为O(1)。同样,查找和删除操作的时间复杂度也是O(1),因为可以根据键的哈希值直接定位到对应的桶,然后在桶中查找或删除该键值对。在哈希表中,插入一个键值对的时间复杂度是O(1),因为只需要计算出键的哈希值,然后将它插入到对应的桶中。原创 2023-02-28 17:03:49 · 4600 阅读 · 5 评论 -
Java的长整型Long/long后面的数字什么情况下必须加L?
【注】由第一行的代码可以联想到,为什么每次定义byte、short、int类型可以直接写,定义long类型要注意加L的情况。2、使用构造器创建Long类型数字时,形参是long类型,int类型可以去向上转型,所以第3、4行正确;1、由于Java默认数字是int类型的,而int向上转型为long是安全的,所以第一句正确执行;1、自动装箱严格要求对应的基本类型要一致,所以第1行错误第2行正确;3、int能表示的数字有一定范围,超过这个范围必须加。定义时,当数字超过int类型的表示范围时必须要在数字后加。原创 2023-01-16 15:20:47 · 6348 阅读 · 4 评论 -
快慢指针法解决链表问题
快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表的尾部时,慢指针指向的就是链表的中间节点。这个原理也很简单,因为快指针走得快,所以当快指针到达链表的尾部时,慢指针刚好走了一半。使用快指针每次移动两个节点,慢指针每次移动一个节点,如果快指针追上了慢指针,那么链表就有环。另外,在使用快慢指针算法时,我们还需要考虑指针移动的范围,如果指针移动越界,就需要进行相应的处理。先让快指针先走 k 步,然后让慢指针和快指针一起移动,当快指针到达链表末尾时,慢指针就指向了倒数第 k 个节点。原创 2023-03-04 15:21:17 · 2806 阅读 · 5 评论 -
Java中的hashCode,真的很容易弄懂
假设我们有一个能存放1000个数这样大的内存中,在其中要存放1000个不一样的数字,用最笨的方法,就是存一个数字,就遍历一遍,看有没有相同得数,当存了900个数字,开始存901个数字的时候,就需要跟900个数字进行对比,这样就很麻烦,很是消耗时间,用hashcode来记录对象的位置,来看一下。是一个概念、是一个函数,该函数中的实现就是一种算法,就是通过一系列的算法来得到一个hash值(即hashCode),这个时候,我们就需要知道另一个东西,hash表。首先,说的是“建议”,其实是可以不重写的。原创 2023-01-24 13:54:38 · 3159 阅读 · 0 评论 -
双指针法将时间复杂度从 O(n^2) 优化到 O(n)
又如,给定一个链表和一个目标值,需要在链表中找到两个节点,使它们的值的和等于目标值,也可以使用双指针法,维护两个指针,一个指向当前节点,另一个指向前一个节点,通过指针的移动来寻找元素对。例如,给定一个有序数组和一个目标值,需要在数组中找到两个数,使它们的和等于目标值,可以使用双指针法,将指针分别指向数组的头和尾,通过指针的移动来寻找元素对。而如果使用双指针法,时间复杂度可以降到 O(n),因为我们可以将指针分别指向数组的头和尾,并根据当前元素之和与目标值的大小关系来移动指针,跳过不可能满足条件的元素对。原创 2023-03-03 20:10:12 · 3284 阅读 · 4 评论 -
JVM解释器与JIT编译器如何并存?
由于Java虚拟机规范并没有具体的约束规则去限制即使编译器应该如何实现,所以这部分功能完全是与虚拟机具体实现相关的内容,如无特殊说明,我们提到的编译器、即时编译器都是指Hotspot虚拟机内的即时编译器,虚拟机也是特指HotSpot虚拟机。解释器真正意义上所承担的角色就是一个运行时“翻译者”,将字节码文件中的内容“翻译”为对应平台的本地机器指令执行,当一条字节码指令被解释执行完成后,接着再根据PC寄存器中记录的下一条需要被执行的字节码指令执行解释操作。只有对频繁执行的代码,JIT编译才能保证有正面的收益。原创 2023-02-15 16:03:50 · 2845 阅读 · 1 评论 -
Web 容器、HTTP 服务器 、Servlet 容器区别与联系
而 Servlet 容器其实就是管理和加载这些 Servlet 类的,拿到 HTTP 请求之后找到对应的 Servlet 类这就是 Servlet 容器要做的事情。没必要把 Servlet 容器做的事情和具体的业务耦合起来,业务反正照着 Servlet 接口实现就行,这样 Servlet 容器就可以加载它和管理它。从我们的分析一层一层的剥离,一层一层的抽象,相信你对 Web 有了更进一步的认识,我再画个 Tomcat 的分析图,应该就很清晰了。原创 2023-02-15 16:26:25 · 4253 阅读 · 22 评论 -
排序Comparable 和 Comparator的区别
compareTo 方法接收的参数 p 是要对比的对象,排序规则是用当前对象和要对比的对象进行比较,然后返回一个 int 类型的值。然而这个时候,老板有一个需求:需要根据 Person 对象的年龄 age 属性进行倒序,也就是根据 age 属性从大到小进行排序,这个时候就可以请出,我们本文的主角:Comparable 出场了。从上图可以看出,当自定义类 Person 没有实现 Comparable 时,List 集合是没有排序的,只能以元素的插入顺序作为输出的顺序。是外部定义并实现排序的,实现。原创 2023-02-18 12:35:26 · 2725 阅读 · 11 评论 -
Thread、Runnable、线程池
DelayedWorkQueue(延迟阻塞队列): DelayedWorkQueue 的内部元素并不是按照放入的时间排序,而是会按照延迟的时间长短对任务进行排序,内部采用的是“堆”的数据结构,可以保证每次出队的任务都是当前队列中执行时间最靠前的。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。3、使用线程池:线程池是一种管理线程的机制,可以限制线程的数量,并对线程进行复用。原创 2023-03-21 22:25:51 · 2939 阅读 · 1 评论 -
【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化
如上图,8位负数-42的原码、反码、补码如图所示。假设我们在逻辑上认为Java中的byte类型的-42是一个无符号类型数字,那么它的实际数字应该是214,即它的补码的机器码大小。8位负数-42的无符号数 = 2^8 + (-42) = 214。Java中没有无符号数据类型(它就是这样设计的,我没查到为什么),[2] 举例说明无符号和有符号的区别。[3] 口算出无符号数。都是有符号数据类型。原创 2022-09-21 19:53:50 · 3267 阅读 · 0 评论 -
Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?
5、基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过。很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。的创建使用了自动装箱机制,自动装箱机制会调用指定包装类的。比较的是它们的引用,而一个是缓存中数据,一个在堆中,所以。1、如果比较的数据是基本类型,则比较它们的值;2、如果比较的是对象,则会比较对象的内存地址。包装类型存储的是堆中的引用。原创 2023-01-23 22:06:46 · 4143 阅读 · 0 评论 -
基本类型、包装类型、引用类型、String等作为实参传递后值会不会改变?
在局部变量表中,JVM 会为每个基本数据类型变量分配一定的存储空间,并将其存储在栈帧中。例如,一个 int 类型的变量需要 4 个字节的存储空间,JVM 会在局部变量表中分配 4 个字节的空间,并将其用于存储该变量的值。具体来说,引用类型变量在栈中分配一个固定大小的存储空间,用于存储指向堆中对象的地址。如果该引用类型变量没有被使用,那么在垃圾回收器执行垃圾回收时,该对象会被回收,其在堆中占用的存储空间会被释放。3、当方法执行完毕并返回时,会将方法返回值压入栈中,同时将栈帧出栈,方法的局部变量表也随之销毁。原创 2023-03-05 17:00:15 · 3551 阅读 · 12 评论 -
【剑指offer知识点】List转int[],List转String,String转int,char[]转String,String 转char[],List转String[]
5] String 转char[][4] char[]转String。[6] List转String[][2] List转String。[1] List转int[][1] List转int[][3] String转int。原创 2022-10-11 21:46:46 · 2891 阅读 · 0 评论 -
【剑指offer知识点】Java中数组、字符串的长度获取区别 length、length()、size()
由于String类是封装的char[]数组,length() 方法返回的正是字符数组 value 的长度(length),value 本身是 private 的,因此很有必要为 String 类提供一个 public 级别的方法来供外部访问字符的长度。在Java中,数组以有序的方式存储固定数量的相同类型的数据。Java 中的所有数组都有一个长度字段,用于存储为该数组的元素分配的空间。size() 方法用于跟踪元素的数量。该字段不会为我们提供数组中存在的元素数,而是可以存储的最大元素数(无论元素是否存在)。原创 2022-09-13 20:50:14 · 3024 阅读 · 0 评论 -
分析JDK、JRE、JVM、JIT 四者的关系与在代码运行时扮演的角色
所以,Java程序运行时相对来说还是高效的(不过,和 C++,Rust,Go 等语言还是有⼀定差距的),由于字节码并不针对⼀种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。JDK是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。由于JDK是通过C和C++实现的,因此在启动时需要引入一些C语言的头文件,所以include目录里面是一些供C语言使用的标题文件,其中C语言的头文件支持Java本地接口和Java虚拟机调试程序接口的本地编程技术。原创 2023-01-12 22:37:52 · 2907 阅读 · 0 评论 -
【剑指offer知识点】Java中位运算的5个常用技巧函数
若a ^ b = c, 则c ^ b = a, c ^ a = b。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。浮点数的移位没有意义,因为它的bits都有特殊含义,移位则直接改变本质了。返回true是奇数,返回false是偶数。[5] 不用临时变量交换整数n与整数m。4、不用临时变量交换整数n与整数m。[6] 求两个整数n和m的平均值。5、求两个整数n和m的平均值。[3] 整数n乘以2的m次方。2、整数n乘以2的m次方。[4] 判断整数n的奇偶。3、判断数字n的奇偶。[2] 整数n乘以2。原创 2022-09-22 20:49:39 · 2713 阅读 · 0 评论 -
【Java挠头】Java异常、捕获、处理、throw、throws等绝妙剖析
–本文摘要– 1、本文的目标读者:是接触过Java异常,但是仅限于书本和一些例题,某一天写着写着会突然觉得“‘异常’没什么意义,Java不是已经帮我们处理了嘛?”的这些朋友。 2、本文的内容摘要:讲述日常开发中如何看待‘异常’这个概念,讲述在一个中型web项目中,我们如何处理‘异常’。 【版权声明】归CSDN账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网.原创 2021-05-15 11:32:07 · 343 阅读 · 1 评论 -
【JVM】Java对象创建的流程步骤
· 本文摘要· 罗列Java创建对象的各种方式;· 讲解Java对象创建的流程步骤;一、Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = new StringBuffer(); · 2. 在单例模式(一种设计模式)中创建对象,本质上也是用关键字new,见下面的代码示例:/** * 单例模式 * 饿汉式(静态常量) */public cla.原创 2021-07-23 19:30:02 · 292 阅读 · 0 评论 -
一文详解JavaBean 看这篇就够了
一文详解JavaBean 看这篇就够了JavaBean的历史渊源JavaBean的定义(通俗版)JavaBean应用< jsp:useBean >< jsp:getProperty >< jsp:setProperty >JavaBean的历史渊源JavaBean最初是用来做可视化界面的,就像VB里面设计GUI界面那样。所以JavaBean的定义都是为了满足做Swing可视化界面的。我们将之称为可视化的JavaBean。我们在Java Web开发时,JavaBea原创 2021-03-25 19:34:43 · 1127 阅读 · 3 评论 -
【JDK源码】Iterator与Iterable的实现与区别
–本文前言– 在介绍Iterator与Iterable接口之前,需要了解Iterator与Iterable接口在Java类库家族谱中的地位。如下图0-1所示。 【版权声明】归CSDN账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网站与个人采集或转载。一、Iterable接口的地位 如图0-1所示,Iterable接口是List、Set、Collect.原创 2021-06-25 20:53:56 · 234 阅读 · 1 评论 -
【JVM】StackOverflowError与OutOfMemoryError
· StackOverflowError与OutOfMemoryError是JVM中常见的有关内存的异常,需结合JVM来;· 在理解、区分这两个异常前,需要知道JVM中运行时数据区的结构;【见图1的讲解】· 在了解JVM中运行时数据区的结构后,才能对以上两个异常从内存与线程层面有个好的认识;【见图2的讲解】一、前置知识:JVM运行时数据区 见图1,JVM运行时,数据区主要有5大类信息:方法区(JDK 8之后叫做元空间)、JVM栈、本地方法栈、堆、P.原创 2021-07-22 23:18:33 · 374 阅读 · 1 评论 -
【Java挠头】可变参、foreach、Annotation等特性
–本文摘要– 1、本文的目标读者:是了解Java基础,想进一步掌握项目中常使用的Java特性的读者。 2、本文的内容摘要:讲述Java中的一些特性,可变参、foreach循环、Annotation、@Override、@Deprecated、@SuppressWarning。 【版权声明】归CSDN账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网站与个人采.原创 2021-05-27 15:37:30 · 170 阅读 · 1 评论 -
注册HttpSessionListener失效原因
问题描述监听器:@WebListenerpublic class MyHttpSessionListener implements HttpSessionListener { /** * session创建 */ @Override public void sessionCreated(HttpSessionEvent e) { HttpSession session=e.getSession(); System.out.println("session创建===ID===="+原创 2021-10-16 15:37:54 · 933 阅读 · 0 评论 -
【Java挠头】继承、抽象、接口、多态、向上转型、向下转型等精妙干货
–本文摘要– 1、本文的目标读者:是了解Java基础,且对面向对象概念有所了解,但是对Java中继承、抽象类、接口、多态等等概念搞不清的初学者。 2、本文的内容摘要:讲述Java中的一些易混概念,static关键字、继承、重载、重写、多态、抽象类、接口、final关键字。 【版权声明】归CSDN账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网站与个人采集或.原创 2021-05-11 23:44:22 · 5242 阅读 · 44 评论 -
【JVM】类加载器:双亲委派机制、沙箱安全机制
· 双亲委派机制、沙箱安全机制是JVM中类加载器系统的相关术语· 在这之前,应该先了解JVM类加载器系统的相关概念一、类加载器基础知识 见下图1,java文件首先会被编译成class文件,class文件作为Java虚拟机的可识别文件,编译完成后,需要加载到内存。 我们针对不同的class文件,会相应用到不同的类加载器。· 引导类加载器:Bootstrap ClassLoader,也叫做启动类加载器/根.原创 2021-07-20 22:32:54 · 313 阅读 · 0 评论 -
【JVM】Java变量的种类(提高版)
· Java变量按数据类型分,有:①基本数据类型;②引用数据类型;· Java变量按声明位置分,有:①成员变量;②局部变量;见下图:一、按数据类型分1.1、基本数据类型 8种基本数据类型是Java语言内嵌的,这个最熟悉不过了,必须张口就来。主要区分一下各个数据类型的表示范围:类型长度表示范围byte1字节[-27 , 27-1]short2字节[-215 , 215-1]int4字节[-231 , .原创 2021-07-21 23:28:21 · 237 阅读 · 2 评论