![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
JAVASE
深入浅出讲解JAVASE相关基础知识,帮助开发者熟悉JAVA基础编程,了解常见JAVASE面试题型
mischen520
JAVA高级架构师
展开
-
spring bean如何保证并发安全
request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听;在不改变bean的作用域的情况下,可以避免在bean中存在可变状态的声明。prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;每次从容器中获取该bean时,都会创建一个新的实例,避免了多线程共享同一个对象实例化的问题。默认情况下,spring bean创建的都是单例的。原创 2023-06-24 09:45:13 · 903 阅读 · 0 评论 -
内存泄露和内存溢出的区别
内存泄露是指分配出去的内存没有被回收回来,由于失去了对该内存区域的控制,因而造成了资源的浪费。Java中一般不会产生内存泄露,因为有垃圾回收器自动回收垃圾,但这也不绝对,当我们new了对象,并保存了其引用,但是后面一直没用它,而垃圾回收器又不会去回收它,这边会造成内存泄露,内存溢出是指程序所需要的内存超出了系统所能分配的内存(包括动态扩展)的上限。原创 2023-06-24 09:15:37 · 273 阅读 · 0 评论 -
详述java的类加载机制
原创 2023-06-24 09:08:08 · 148 阅读 · 0 评论 -
详解java内存模型
原创 2023-06-24 09:05:31 · 100 阅读 · 0 评论 -
java解压zip文件
【代码】java解压zip文件代码实现。原创 2023-02-25 08:13:17 · 3275 阅读 · 0 评论 -
java读取图片的大小、高度、宽度
java读取图片一般分为两种,一种是直接读取文件地址,一种是从前端传送过来的。原创 2023-02-22 19:23:43 · 5430 阅读 · 1 评论 -
java判断日期是否合法
虽然绝大多数会在前台处理,但是也有需要从文件流读入的情况,如果日期不合格就需要抛异常,这时候就需要禁止SimpleDateFormat的自动计算功能。SimpleDateFormat.setLenient(false):严格解析日期,如果日期不合格就抛异常,不会自动计算。SimpleDateFormat.setLenient(true) : 默认值true,不严格解析日期,会自动计算。有时候我们需要判断用户的日期格式是否正确,这时候就需要用到setLenient。...原创 2022-08-05 06:59:34 · 2731 阅读 · 0 评论 -
利用jfreechart生成柱状图(代码示例)
1.引入maven依赖。原创 2022-10-30 10:21:04 · 940 阅读 · 1 评论 -
Integer a=100,b=100,a==b的运行结果?Integer c=1000,d=1000,c==d的运行结果?
比较得到的结果必然是true。而第二个问题,因为不在-128-127之间,则指向的内存地址都不一样,故用==比较必然为false。Integer a=100,b=100时候a。原创 2022-10-14 20:10:27 · 1000 阅读 · 0 评论 -
java保证线程安全的方式有哪些?
同时,针对不同的应用场景,还可以使用分布式锁来实现线程安全,比较常用的分布式锁实现方式有,基于数据库实现的分布式锁(不常用,除非是单数据库,但是不便于后期扩展),基于redis实现的分布式锁、基于zookeeper实现的分布式锁。让这些变量在多线程环境下访问(get/set)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal采⽤了“以空间换时间”的⽅式,为每⼀个线程都提供⼀份变量的副本,从⽽实现同时访问⽽互不影响,但因为每个线程都维护着⼀份副本,对内存空间的占⽤会增加。原创 2022-10-05 13:31:27 · 3981 阅读 · 0 评论 -
一个空的Java object 对象占多大内存?
对象头: 1.MakeOop :存储hashcode 垃圾回收时候的分代年龄 synchronized锁升级过程中的锁标记 (无锁、偏向锁、轻量级锁、重量级锁) 32位操作系统占4个字节 64位操作系统占8个字节。在开启了压缩指针的情况下,Object默认会占用12个字节,但是为了避免伪共享问题,JVM会按照8个字节的倍数进行填充,所以会填充4个字节变成16个字节长度。在关闭压缩指针的情况下,Object默认会占用16个字节,16个字节正好是8的整数倍,因此不需要填充。原创 2022-10-03 20:06:14 · 2675 阅读 · 3 评论 -
Springboot中的定时任务是否会发生阻塞?
不同的定时任务之间互不影响,同一个定时任务(方法)依然会有被阻塞的机制。如果任务执行时间超过定时任务间隔时间,不管是同一个定时任务还是不同的定时任务,下一个任务都会被阻塞。首先需要知道:定时任务默认是单线程的。所以默认情况下,上一个定时任务没有执行完,下一个定时任务是不会开始的。3.在需要定时任务方法上增加注解@Scheduled,注解的参数是定时任务执行时机。Springboot中上一个定时任务没执行完,是否会影响下一个定时任务执行?3.如果定时任务交给线程池处理,则下一个任务不会被阻塞。原创 2022-09-07 22:02:10 · 1260 阅读 · 0 评论 -
java判断两个日期之间是否超过n年?
【代码】java判断两个日期之间是否超过n年?原创 2022-09-03 09:10:09 · 1474 阅读 · 0 评论 -
java获取用键盘输入常用的两种方法
方法 2:通过 BufferedReader。方法 1:通过 Scanner。原创 2022-09-02 00:30:34 · 2168 阅读 · 0 评论 -
Java序列化中如果有些字段不想进行序列化怎么办
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。对于不想进行序列化的变量,使用 transient 关键字修饰。transient 只能修饰变量,不能修饰类和方法。原创 2022-09-02 00:28:07 · 1913 阅读 · 0 评论 -
import java 和 和 javax 有什么区别?
API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组。刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏。因此,最终决定 javax 包将成为标准 API 的一部分。所以,实际上 java 和 javax 没有区别。原创 2022-09-02 00:22:38 · 411 阅读 · 0 评论 -
在 Java 中定义一个不做事且没有参数的构造方法的作用
Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定。义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类。中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没。的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定。有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数。原创 2022-09-02 00:20:26 · 93 阅读 · 0 评论 -
Oracle JDK 和 OpenJDK 的区别?
答:非常接近 - 我们的 Oracle JDK 版本构建过程基于 OpenJDK 7 构建,只添加了几个部分,例如部署代码,其中包括 Oracle 的 Java 插件和 Java WebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如 Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源 Oracle JDK 的所有部分,除了我们考虑商业功能的部分。此外,OpenJDK 被选为 Java 7 的参考实现,由 Oracle 工程师维护。原创 2022-09-02 00:15:13 · 354 阅读 · 0 评论 -
List 和 Set 的区别
List , Set 都是继承自 Collection 接口List 特点:元素有放入顺序,元素可重复Set 特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(元素虽然无放入顺序,但是元素在set中的位置是有该元素的 HashCode 决定的,其位置其实是固定的,加入Set 的 Object 必须定义 equals ()方法,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)Set和List对比Set:检索元素效率原创 2021-11-18 07:20:16 · 367 阅读 · 0 评论 -
map实现快速排序
比较BigDecimal的值大小,根据BigDecimal值取不同的key,代码如下:package com.user.controller;import java.math.BigDecimal;import java.util.*;/** * @ClassName Test * @Description DOTO 比较BigDecimal的值大小,根据BigDecimal值取不同的key * @Author mischen * @Date 2021/11/14 0014 17:24原创 2021-11-14 19:23:13 · 433 阅读 · 0 评论 -
java中垃圾收集的方法有哪些?
1)引用计数法 应用于:微软的COM/ActionScrip3/Python等a) 如果对象没有被引用,就会被回收,缺点:需要维护一个引用计算器2)复制算法 年轻代中使用的是Minor GC,这种GC算法采用的是复制算法(Copying)a) 效率高,缺点:需要内存容量大,比较耗内存b) 使用在占空间比较小、刷新次数多的新生区3)标记清除 老年代一般是由标记清除或者是标记清除与标记整理的混合实现a) 效率比较低,会产生碎片。4)标记压缩 老年代一般是由标记清除或者是标记清除与标记原创 2021-09-10 00:11:10 · 368 阅读 · 0 评论 -
简述Java的类加载过程
Java类加载需要经历一下几个过程:1)加载加载时类加载的第一个过程,在这个阶段,将完成一下三件事情:a.通过一个类的全限定名获取该类的二进制流。b.将该二进制流中的静态存储结构转化为方法去运行时数据结构。 c.在内存中生成该类的Class对象,作为该类的数据访问入口。2)验证验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成以下四钟验证:a.文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是原创 2021-09-10 00:07:48 · 1715 阅读 · 0 评论 -
如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?
使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。...原创 2021-09-04 01:34:22 · 420 阅读 · 0 评论 -
HV000030: No validator could be found for constraint ‘javax.validation.constraints.Pattern‘ validati
错误原因:数字类型不能使用javax.validation.constraints.Pattern注解解决办法方法一:.将字段类型设置为String类型;方法二:使用其他验证注解验证,数子的有 @Size,@Min,@Max,@Range现将@Valid常用注解介绍如下:Bean Validation 中内置的 constraint@Null 被注释的元素必须为 null@NotNull 被注释的元素必须不为 null@AssertTrue 被注释的元素必须为 true原创 2021-08-20 10:17:10 · 9294 阅读 · 0 评论 -
JAVA循环删除文件夹以及文件夹下面的文件(已通过sonar扫描,直接复制即可)
package com.mischen.it.utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;/** * @ClassName FileDemo * @Description 删除文件夹以及文件夹下面的文件 *原创 2021-08-14 09:32:43 · 689 阅读 · 0 评论 -
java压缩文件夹以及下面的所有文件(支持递归压缩)
直接上代码:package com.mischen.it.utils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.*;import java.util.Date;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;/** * @ClassName TestCreateZip * @Description D原创 2021-07-24 14:48:42 · 1606 阅读 · 0 评论 -
Runnable和Callable的区别
1)Runnable接口中的方法没有返回值;Callable接口中的方法有返回值2)Runnable接口中的方法没有抛出异常;Callable接口中的方法抛出了异常3)Runnable接口中的落地方法是call方法;Callable接口中的落地方法是run方法...原创 2021-07-08 21:00:35 · 124 阅读 · 0 评论 -
String buffer和String builder的区别
1、StringBuffer与StringBuilder中的方法和功能完全是等价的。2、只是StringBuffer中的方法大都采用了synchronized关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的。3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要判断锁,效率相对更低...原创 2021-07-03 15:08:29 · 3993 阅读 · 0 评论 -
TreeSet和HashSet的区别
HashSet是采用hash表来实现的。其中的元素没有按顺序排列,add()、remove()以及contains()等方法都是复杂度为O(1)的方法。TreeSet是采用树结构实现(红黑树算法)。元素是按顺序进行排列,但是add()、remove()以及contains()等方法都是复杂度为O(log (n))的方法。它还提供了一些方法来处理排序的set,如first(),last(),headSet(),tailSet()等等。...原创 2021-07-03 14:57:43 · 394 阅读 · 0 评论 -
HashMap和HashTable的区别?(高频面试题)
1.线程安全性不同HashMap是线程不安全的,HashTable是线程安全的,其中的方法是Synchronize的,在多线程并发的情况下,可以直接使用HashTable,但是使用HashMap时必须自己增加同步处理。2.是否提供contains方法HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。3.key和原创 2021-07-03 14:55:30 · 424 阅读 · 0 评论 -
Java自带哪几种线程池?
)newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。这种类型的线程池特点是:工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。在使用CachedThreadPool时原创 2021-07-03 14:47:26 · 352 阅读 · 0 评论 -
java如何判断一个对象是否存活?(GC回收的依据)
判断一个对象是否存活有2种方法:1.引用计数法 所谓引用计数法其实就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器+1,引用失效时,就将计数器-1.当一个对象的引用计数器为0时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收。 引用计算法有一个缺陷就是无法解决循环引用问题,也就是说当对象A引用B,对象B又引用A,那么此时A、B对象的引用计数器都不为0,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。2.可达性算法(引用链法)...原创 2021-04-06 23:31:45 · 715 阅读 · 0 评论 -
java.util.LinkedHashMap cannot be cast to ...entity(记一次开发中map类型转换为实体类报错的现象以及解决思路)
需求是这样的,我从前端组装了一个map对象,后台用controller层来接收,在map中组装的对象比较多,里面涉及到一个很大的实体类,当我用User user = (User) inMap.get("account");这个去接收的时候,提示上面的报错信息,因为我后台接收到的map是这样定义的,是一个post请求,@RequestBody (Map<String,Object> inMap),开始没有看出来,为啥会是一个LinkedHashMap,打断点调试才发现后台接收的是一个Lin原创 2021-03-24 20:55:04 · 1597 阅读 · 1 评论 -
hashmap的扩容机制原理解析以及设置合适大小的初始值(java代码性能优化)
通过Hashmap中源码发现,有三个常量,static final int DEFAULT_INITIAL_CAPACITY = 16;static final int MAXIMUM_CAPACITY = 1 << 30;static final float DEFAULT_LOAD_FACTOR = 0.75f;三个常量中可以看出,默认的容器大小是16,最大长度是2的30次方,load factor默认是0.75,扩充的临界值是16*0.75=12当我们往HashMap中put元素原创 2020-12-29 23:53:40 · 426 阅读 · 0 评论 -
java集合面试重点总结
集合介绍List Set Map 都是接口 List Set继承Collection(Collections是工具类)List子类(有序,可重复)---ArrayList、Vector、LinkedListArrayList、Vector 底层是数组(查找快,增删慢)前者线程不安全,后者线程安全Linkedlist 底层是链表查找慢,增删快Set(无序,唯一)---HashSet TreeSet LinkedHashSetHashSet 底层是哈希表(hashcode equals.原创 2020-12-29 23:48:55 · 147 阅读 · 0 评论 -
java中为什么要定义枚举?以及定义枚举的好处?枚举代码示例/* * ================================================================
枚举的本质实际上是一种多例模式,枚举中可以定义各种类型,在开发中使用枚举主要是考虑到线程安全,代码如下:package com.mischen.pay.common.core.enums;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/...原创 2020-03-29 09:07:13 · 1062 阅读 · 0 评论 -
什么是AIO,BIO,NIO?
原创 2020-03-27 22:41:19 · 636 阅读 · 0 评论 -
怎样快速拿到list中的最小值
本文使用jdk1.8中的流式算法,代码简洁,比之前for效率提高了不少,代码如下:package com.itmuch.cloud.test;import java.util.ArrayList;import java.util.List;/** * @author:mischen * @date:2020/3/27 22:02 */public class TestLis...原创 2020-03-27 22:18:13 · 5469 阅读 · 0 评论 -
java1.8使用stream流快速拿到集合中的最大值或者最小值或者某个对象的案例分析
直接上代码,截图如下:package com.itmuch.cloud.test;import java.util.ArrayList;import java.util.List;/** * @author:mischen * @date:2020/3/27 22:02 */public class TestList { public static void ma...原创 2020-03-27 22:15:30 · 12584 阅读 · 0 评论 -
java快速查看接口实现类的快捷键
idea快捷键:ctrl+alt+beclipse快捷键:ctrl+t原创 2020-03-27 21:59:26 · 3579 阅读 · 0 评论