java基础
文章平均质量分 51
简洁不失深度
罗罗的1024
做个幸福的小吃货
展开
-
不了解下Math.round()吗
问题:Math.round(11.5)等於多少? Math.round(-11.5)等於多少?看到这个,我就知道百分之五十的机会没有了,不会啊,只有猜。先试试运行吧public class Test03 { public static void main(String[] args) { System.out.println(Math.round(11.5)); System.out.println(Math.round(-11.5)); }}.原创 2020-08-14 20:09:41 · 229 阅读 · 0 评论 -
MDC使用手册精讲
MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 中包含的内容可以被同一线程中执行的代码所访问,当前线程的子线程也会继承其父线程中的 MDC 的内容。我们日志用的是 slf4j + logback,看看。原创 2024-04-16 21:30:27 · 690 阅读 · 1 评论 -
线程池,我的异常呢?
线程池的异常处理,我们常用execute() 和 submit() 方法进行任务提交,submit 需要通过返回值手动去获取异常,而execute 则会把异常直接输出到控制台,所以在编写代码时,应避免异常逃逸出run() 方法之外。如果没有注意,异常逃逸,我们还是能够进行捕获的。通过实现Thread.UncaughtExceptionHandler接口,在线程由于未捕获的异常而即将消亡时,便会自动调用uncaughtException方法进行兜底。原创 2024-03-16 13:06:49 · 204 阅读 · 0 评论 -
Maven下载依赖的顺序及配置文件说明
如果依赖项在某个仓库中找到了,Maven 会将其下载到本地仓库,并在后续构建过程中直接使用本地仓库中的依赖,以加快构建速度和确保依赖项的一致性。私有仓库(私服):如果在本地仓库中未找到依赖项,Maven 会按照项目的 pom.xml 文件中配置的 元素指定的顺序依次搜索私有仓库。其他远程仓库:如果在项目的 pom.xml 文件中配置了其他远程仓库地址,并且中央仓库、私有仓库和本地仓库都没有所需的依赖项,Maven 会按照 中指定的顺序依次搜索这些自定义远程仓库。Maven的配置文件说明。原创 2023-07-19 18:30:52 · 5580 阅读 · 0 评论 -
简单的谈谈读写锁
什么是读写锁多个线程同时读一个资源类是没有任何问题的,所以在并发的情况下,读取共享资源应该是可以同时进行的;但是,如果一个线程想要去写共享资源,就不应该再有其他线程可以对该共享资源进行读或者是写操作了。前面提到的ReentrantLock就保证了只有一个线程可以执行临界区代码。但是有些时候,这种保护有点过头。因为我们发现,任何时刻,只要进入临界区,就必须获取锁,那么别的线程也就访问不到了。但是,我们有些时候只想读取数据,不修改数据,如此一来,就会消耗时间。实际上我们想要的是:允许多个线程同时读,但只要原创 2020-08-05 16:26:08 · 592 阅读 · 0 评论 -
ThreadLocal讲义
按照上面的流程,我们知道了,线程变量的值是存储在entry的value中,而threadlocal实例被WeakReference装饰,也就是当发生GC时,threadlocal实例将自动被清除,如果这个threadlocal实例被GC回收了,可是entry中的value属性值却和真实的内存对象存在。发现如果一直都是同一个threadlocal在get、set,是不会清除key为null的entry的,也就是说,是存在内存泄漏的可能的。问题二线程变量存储在哪里?...原创 2022-07-17 21:39:01 · 932 阅读 · 0 评论 -
重写equals为什么要重写hashcode
先了解下object 类实例假设在业务上,我们认为名字相同的便是同一个人猜想如果不重写 会发生什么下面看看map的put操作发生了什么?我们发现当有冲突时,判断的顺序如下由于我们认为名字相同的便是同一个人当 的时候,先比较 student1 和 student2 的 值,由于 student1 和 student2 是不同的对象,他们的 方法是调用的 方法,比较的是对象的地址,很明显,下面这个方法算出来的hash是不相等的hash值不相等,也不是T原创 2022-07-14 01:38:21 · 246 阅读 · 0 评论 -
设计模式之组合模式
组合(Composite Pattern)模式的定义:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式来处理个别对象以及对象的组合。属于结构型设计模式。在组合模式中,整个树形结构中的对象都属于同一种类型,带来的好处就是用户不需要辨别是树枝节点还是叶子节点,可以直接进行操作,给用户的使用带来极大的便利创建一个接口或者抽象类,作为根节点创建一个已经实现或者继承根节点的类,作为树枝节点(在某些情况下也是叶子节点),用来管理和组织树枝节点类图如下.........原创 2022-07-13 21:11:54 · 249 阅读 · 0 评论 -
Java基础之细说枚举
当我们使用关键字 创建一个枚举类型时,他具有如下特性编译后的代码通过汇编指令,发现了枚举类型除了我们自己定义的方法外,还有如下方法此外,默认是继承了 Enum 类型,并且用 final 修饰.....................原创 2022-06-26 22:12:36 · 356 阅读 · 0 评论 -
TCP的四次挥手过程
TCP的四次挥手过程客户端和服务端都可以主动释放连接这里以客户端示例情景一:还有数据存在(四次挥手)客户端发送FIN标识到服务端,告知服务端我要释放连接服务端收到FIN标识,知道了客户端想断开连接,于是马上检查是否还有数据发送给客户端,如果还有数据没有发送,就发送ACK标识告诉客户端:等一会,你还有数据在我这里待所有数据发送完毕后,服务端发送FIN标识给客户端,告诉客户端,现在已经没有数据了,我要关闭连接啦客户端收到服务端的FIN标识,知道服务端现在就要关闭连接了,于是就发送ACK标识,原创 2022-04-25 13:28:37 · 911 阅读 · 0 评论 -
拼接hql时,新增字段没有出现在构造方法中
问题描述在使用hibernate拼接hql时,新增字段竟然没有出现在构造方法中(下面是简化版,真实情况要复杂的多)//实体类public class Tmd { private String CBh; private Integer NSjzzaqxx; //private String CAjysly;//新加字段 public static final String cTmdConstructorFields = "(CBh,NSjzzaqxx)"; //public static fi原创 2022-04-18 13:24:30 · 605 阅读 · 0 评论 -
详解TCP的三次握手
前置条件在开始三次握手之前,我们先看看TCP头部结构,如下了解一下什么是序列号和确认号Sequence number表示的是我方(发送方)这边,这个packet的数据部分的第一位应该在整个data stream中所在的位置。(注意这里使用的是“应该”。因为对于没有数据的传输,如ACK,虽然它有一个seq,但是这次传输在整个data stream中是不占位置的。所以下一个实际有数据的传输,会依旧从上一次发送ACK的数据包的seq开始)Acknowledge number表示的是期望原创 2022-04-13 21:00:24 · 9791 阅读 · 5 评论 -
SPI 使用手册
什么是SPISPI的全名为Service Provider Interface,当服务的提供者,提供了服务接口的一种实现之后,在jar包的META-INF/services/目录里同时创建一个以服务接口命名的文件。该文件里就是实现该服务接口的具体实现类。而当外部程序装配这个模块的时候,就能通过该jar包META-INF/services/里的配置文件找到具体的实现类名,并装载实例化,完成模块的注入。public interface IService { String getServiceName原创 2021-12-23 23:17:13 · 675 阅读 · 0 评论 -
设计模式之观察者模式
定义观察者模式是一种对象行为模式,定义了对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式。被观察者public interface WeatherState { //注册天气显示板块 WeatherState register(WeatherDashborad weatherState); //移除天气显示板块 void remove(WeatherDashborad weathe原创 2021-11-25 12:22:32 · 199 阅读 · 1 评论 -
双括号初始化的影响
简介我们在开发中偶尔会遇到一些小伙伴使用双括号“{{}}”来进行map或者list的初始化,类似下面示例这样示例public class MapTest { Map<String,Object> map = new HashMap<String,Object>(){ { put("1","one"); } }; List<Integer> list = new ArrayList<原创 2021-11-10 21:57:41 · 755 阅读 · 0 评论 -
记一次线上问题:Unsupported major.minor 52.0
原因总结JDK版本的问题;编译时的jdk和线上的JDK版本不一致怎么解决把编译时的jdk版本号转换成线上的jdk版本确定编译jdk这里我介绍用class文件确定选择某一个class文件用notepad++打开,如果是下面这样,就安装 Hex editor 插件然后按Ctrl+Alt+Shift+H ,便会转换成16进制前8个字节 ca fe ba be 是固定的,挨着后面的4个字节 00 00 是次版本号,次版本号后面的4个字节00 32 是jdk的版本号便可以原创 2021-10-28 14:04:33 · 238 阅读 · 0 评论 -
设计模式之构造者模式
定义建造者模式(Builder Pattern)也叫做生成器模式,其定义如下:Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。)示例以构建一个人示例,灵魂是必须有的,肢体可有可无,哈原创 2021-10-15 00:43:09 · 363 阅读 · 0 评论 -
设计模式之门面模式
门面模式(Facade Pattern)定义门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如 下:Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.(要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个原创 2021-09-27 20:44:49 · 224 阅读 · 0 评论 -
设计模式之策略模式
策略模式定义策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(Policy Pattern)。策略模式指定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使用的就是面向对象的继承和多态机制。策略模式的三个角色Context封装角色它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。Strategy抽象策略角色策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性Concrete原创 2021-09-25 16:40:02 · 262 阅读 · 0 评论 -
设计模式之模板方法模式
模板方法模式定义Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重原创 2021-09-24 21:56:48 · 206 阅读 · 0 评论 -
guava常用类
google的guava工具包有很多好东西,其中Multimap就特别的好用public static void main(String[] args) { //HashMultimap ArrayListMultimap LinkedHashMultimap TreeMultimap Multimap<String,Double> multimap = HashMultimap.create(); multimap.put("java",18原创 2021-09-01 19:48:15 · 318 阅读 · 0 评论 -
volatile的内幕
volatile的定义Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。volatile的可见性我们都知道volatile可以保证可见性和禁止指令重排,那么volatile是如何保证可见性的呢volatile修饰的变量原创 2021-08-22 22:31:25 · 241 阅读 · 0 评论 -
class文件中的ConstantValue属性
先看下面的例子会输出什么,简单啊~~~然而不是这样的,正确的输出应该是tell me why? 怎么回事呢这里就得说说变量的赋值方式啦我们先来看看 Test.class 文件的字节码吧分析class文件,发现 static_final 经编译后已经存在于Test.class文件的常量池中,这也就是说不需要加载A.class就可以输出被static final 修饰的基本类型或者String查看A.class 文件的字节码目前由Oracle公司实现的Javac编译器的选择是,只有同时被final原创 2021-08-19 13:01:48 · 307 阅读 · 0 评论 -
Integer缓存的那些事儿
首先我们看看下面的输出会是什么public static void testIntegerCache(){ Integer a = 66; Integer b = 66; System.out.println(a == b); Integer c = 166; Integer d = 166; System.out.println(c == d); Integer e = 166;原创 2021-08-01 21:46:59 · 208 阅读 · 0 评论 -
一语道破,修改方法注解值
动态修改注解的值import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.Scheduled;import java.lang.reflect.Field;import java.lang.reflect.InvocationHandler;import java.l原创 2021-05-04 23:11:44 · 375 阅读 · 1 评论 -
快速排序
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。排序演示假设一开始序列{xi}是:5,3,7,6,4,1,0,2,9,10,8。此时,ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。此时i=1,j=8原创 2020-11-22 14:26:59 · 258 阅读 · 2 评论 -
重写和重载必要条件
Java 重写必须满足的条件(1)重写方法不能缩小访问权限;(2)参数列表必须与被重写方法相同(包括显示形式);(3)返回类型必须与被重写方法的相同或是其子类;(4)重写方法不能抛出新的异常,或者超过了父类范围的异常,但是可以抛出更少、更有限的异常,或者不抛出异常。Java 重载必须满足的条件1.方法名相同2.参数列表不同,即参数类型、个数、顺序至少有一项不相同3.返回值可以不同4.方法的修饰符可以不同...原创 2020-11-12 19:06:21 · 1338 阅读 · 0 评论 -
new String时到底创建了几个对象
String的考点问题一: String a = “a” + “b” + “c”;创建了几个对象答案:一个对象javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个对应常量相连的结果。问题一:String s = “aaa” + new String(“bbb”);创建了几个对象答案:4个对象“aa” 是一个对象new Sring() 是一个对象"bbb"是一个对象“aa” + new new原创 2020-10-29 18:25:53 · 1390 阅读 · 1 评论 -
byte的那些事儿
范围:-128 ~ 127public static void main(String[] args) { byte a = 1; byte b = 127;// -128 ~ 127,超过范围直接编译不通过 b+=1;// +=有自动装箱的能力 System.out.println(b); a = (byte)(a+127);// = 需要手动强制转换 System.out.println(a);.原创 2020-10-14 18:37:28 · 293 阅读 · 1 评论 -
运算符的先后顺序
计算下列的表达式public static void main(String[] args) { int i = 5; int j = i+++i+++i++; System.out.println(j); int k = 0; int o = ++k+k<<2+ ++k+k+1; System.out.println(o); }"C:\Program Files\Java\jdk1.8原创 2020-10-14 17:44:11 · 1221 阅读 · 0 评论 -
try-catch-finally 和 return的执行顺序
在方法返回前,finally子句的内容将被执行。不管有木有出现异常,finally块中代码都会执行当try和catch中有return时,finally仍然会执行如果 finally 子句中也有一个 return 语句,这个返回值将会覆盖原始的返回值。...原创 2020-10-14 16:03:44 · 175 阅读 · 0 评论 -
contextPath、URI、URL
环境:http://localhost:8080/panda + /web_url + ?id=121显示路径:${pageContext.request.contextPath} =/pandarequest.getContextPath() = /pandarequest.getRequestURI() = /panda + /web_urlrequest.getRequestURL() = http://localhost:8080/panda/ + web_url原创 2020-10-13 09:27:19 · 588 阅读 · 0 评论 -
POI的基本使用
在开发中,我们难免会遇到一些关于EXCEL、WORD的操作,这是我们可以使用阿帕奇的POI,当然你也可以使用阿里的EasyPOI,看个人爱好,下面我将介绍阿帕奇的POI了解一下,两个版本,一个是03版本,后缀是.xls,最多65535行,耗时时间短,07版本,后缀是.xlsx,最多无限制行,耗时间较长首先是进行写表操作,如果表不存在,会自动创建表。03版本/** * @Auther: luo * @Date: 2020/8/16 14:01 * @Description: */publi原创 2020-08-16 15:44:51 · 976 阅读 · 0 评论 -
最不想看到的词--Exception
我们写程序时难免会发生各种错误,可能是逻辑上的错误,也有可能是代码本身就有问题,还有就是系统问题等等,为了解决这些问题,Java就有了一套异常处理体系。如下:异常分为两大类:ExceptionError错误Error是程序无法避免的,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。通常有Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误),StackOverFlowError(栈溢出)等。比如说当jvm原创 2020-08-16 08:20:26 · 230 阅读 · 0 评论 -
歇斯底里的剖析HashMap
HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hash code)所以在查询上的访问速度比较快,HashMap最多允许一对键值对的Key为Null,允许多对键值对的value为Null。它是非线程安全的。在排序上面是无序的。进入正文之前先了解下关键字段static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //默认初始容量static f原创 2020-08-13 21:40:15 · 385 阅读 · 2 评论 -
看我!快速下载大文件呐
RandomAccessFile我们平常创建流对象关联文件,读文件或者写文件都是从文件头开始的,不能从中间开始,如果是开多线程下载一个文件我们之前学过的FileWriter或者FileReader等等都无法完成,而RandomAccessFile可以解决这个问题,因为它可以指定位置读,指定位置写,通常开发过程中,多用于多线程下载一个大文件。四种模式(Mode)“r”以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。“rw”打开以便读取和写入原创 2020-08-10 21:03:46 · 369 阅读 · 0 评论 -
怎么理解 Hash
什么是Hash参考自链接: https://www.cnblogs.com/s-b-b/p/6208565.html.哈希(hash)表的定义哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方。就是通过key值然后按照某种哈希函数 hash() 计算hash(key),得到的就是哈希值。什么是hash冲突呢?我们知道不同的数字通过一个函数结果可能会一样,那么不同的值通过hash()计算得到的hash值也可能是一样的,假如数组中的3号位有对象占着,此时 ,又转载 2020-07-15 18:08:34 · 504 阅读 · 0 评论 -
迷人的java反射机制
java的反射机制定义JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种 动态 获取信息以及动态调用对象方法的功能称为java语言的反射机制。java经编译后生成xxx.class文件,把一个类划分几块filedsconstructorsmethods话不多说,先做一个实体类 Personpublic class Person { private String name; private in原创 2020-07-09 20:30:11 · 305 阅读 · 0 评论 -
今日byte引发之尴尬
今日byte引发之尴尬今天遇到了一些问题,让我发现我基础还真挺弱的,哈哈~~~~~老师讲课,有个同学提了一个问题,老师突然点名问我,我竟然一脸懵逼,不知道该怎么回答,问题如下,哎。。。。。。byte i = 8;//问题: 8是int类型,转换byte类型,怎么没有错呢我不知怎么回答,老师充满爱意的说,没事,错了也不要紧,结局就是我回答不上。尴尬啊byte的大小为8bits,占一个字节, byte类型数值范围是 -128 ~ 127,而数字8属于这个范围,所以是可以的,如果i = 128,超过原创 2020-07-08 18:13:27 · 981 阅读 · 0 评论 -
序列化和反序列化
序列化和反序列化序列化和反序列化的定义Java序列化: 就是指把Java对象转换为字节序列的过程Java反序列化: 就是指把字节序列恢复为Java对象的过程。序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)实现序列化的必备要求:只有原创 2020-07-09 08:34:44 · 331 阅读 · 0 评论