自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(165)
  • 资源 (10)
  • 收藏
  • 关注

原创 什么是 fail-fast? 什么是fail-safe?

在了解了之后,不知道大家会不会有这样的疑问:他的add/remove等方法都已经加锁了,还要 copy 一份再修改干嘛?多此一举?同样是线程安全的集合,这玩意和Vector有啥区别呢?Copy-On-Write 简称 COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容 Copy 出去形成一个新的内容然后再改,这是一种延时懒惰策略。CopyOnWrite 容器即写时复制的容器。

2023-08-28 01:00:00 310

原创 遍历的同时修改一个 List 有几种方式?

【代码】遍历的同时修改一个 List 有几种方式?

2023-08-28 01:00:00 941

原创 char 能存储中文吗?

虽然 Unicode 字符集也在一直不断的迭代更新,但对于一些非常罕见的生僻字,它们可能因为版本问题,或者时间问题,暂时不在 Unicode 字符集中。在 Java 中,char 类型是用来表示一个 16 位的 Unicode 字符,它可以存储任何 Unicode 字符集中的字符,当然也包括中文字符。因为 Unicode 字符集包含了几乎所有的字符,包括常见字符、生僻字、罕见字以及其它语言的字符。但是,有人说,Java 中的 char 是没办法表示生僻字的,这么说其实有点绝对了。

2023-08-27 01:00:00 367

原创 你能说出几种集合的排序方式?

这里说的是两个语境的不同,Set 的无序,指的是插入顺序是无序的。并不是,Set 有一个实现类是 LinkedHashSet,它引入了 LinkedHashMap,通过双向链表记录了每个 node 的插入顺序和查询顺序(可选),以此来达到 Set 的插入有序性。Java.util 包中的 List 接口继承了 Collection 接口,用来存放对象集合,所以对这些对象进行排序的时候,要么让对象类自己实现同类对象的比较,要么借助比较器进行比较排序。如上述代码中对不具备排序能力的 Student 进行排序。

2023-08-27 01:00:00 151

原创 什么是 UUID,能保证唯一吗?

可以简单总结一下,Version 1 和 Version 2 这两个版本的 UUID,主要基于时间和 MAC 地址,所以比较适合应用于分布式计算环境下,具有高度唯一性。Version 3 和 Version 5 这两种 UUID 都是基于名称空间的,所以在一定范围内是唯一的,而且如果有需要生成重复 UUID 的场景的话,这两种是可以实现的。Version 4 这种是最简单的,只是基于随机数生成的,但是也是最不靠谱的。适合数据量不是特别大的场景下。

2023-08-26 01:00:00 1429

原创 Java 中的集合类有哪些?如何分类的?

从功能上讲,List 代表一个容器,可以是先进先出,也可以是先进后出。而 Set 相对于 List 来说,是无序的,同时也是一个去重的列表,既然会去重,就一定会通过 equals,compareTo,hashCode 等方法进行比较。后者代表的是是否可以迭代,如果可以迭代,会返回 Iterator 接口,即返回迭代方式。从实现上讲,List 可以有链表实现或者数组实现,两者各有优劣,链表增删快,数组查询快。其中,前四种数据结构都是单一元素的集合,而最后的 Map 则是以 KV 对的形式使用。

2023-08-26 01:00:00 254

原创 SimpleDateFormat 是线程安全的吗?使用时应该注意什么?面试回答

但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。由于不同的时区的时间是不一样的,甚至同一个国家的不同城市时间都可能不一样,所以,在 Java 中想要获取时间的时候,要重点关注一下时区问题。是 Java 提供的一个格式化和解析日期的工具类。默认情况下,如果不指明,在创建日期的时候,会使用当前计算机所在的时区作为默认时区,这也是为什么我们通过只要使用。来实现其实是有点类似于缓存的思路,每个线程都有一个独享的对象,避免了频繁创建对象,也避免了多线程的竞争。

2023-08-25 01:00:00 325

原创 JDK 新版本中都有哪些新特性?

可以看到,这里使用了很多 if-else,其实,Java 中给我们提供了一个多路比较的工具,那就是 switch,而且从 Java 14 开始支持 switch 表达式,但 switch 的功能一直都是非常有限的。虽然我们在代码中使用 var 进行了定义,但是对于虚拟机来说他是不认识这个 var 的,在 java 文件编译成 class 文件的过程中,会进行解糖,使用变量真正的类型来替代 var。在这之后,switch 中就多了一个关键字用于跳出 switch 块了,那就是 yield,他用于返回一个值。

2023-08-25 01:00:00 191

原创 什么是 AIO、BIO和NIO?

线程发起 IO 请求后,不需要阻塞,立即返回。AIO 方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂,JDK 7 开始支持。NIO 方式适用于连接数目多且链接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK 1.4 开始支持。线程发起 IO 请求后,一直阻塞,直到缓冲区数据就绪后,再进入下一步操作。,线程发起 IO 请求后,不需要阻塞,立即返回,也不需要定时轮询检查结果,异步 IO 操作之后会回调通知调用方。

2023-08-24 01:00:00 163

原创 什么是深拷贝和浅拷贝?

这种方式就能实现深拷贝,但是问题是如果我们在 User 中有很多个对象,那么 clone 方法就写的很长,而且如果后面有修改,在 User 中新增属性,这个地方也要修改。之后,在执行一下下面的测试代码,就可以发现,这时候 newUser 中的 address 对象就是一个新的对象了。因此,如果我们修改复制对象中的属性或者元素,原始对象中对应的属性或元素不会受到影响。因此,如果我们修改了复制对象中的属性或元素,原始对象中对应的属性或元素也会被修改。方法,这个方法其实在不重写的情况下,其实也是浅拷贝的。

2023-08-24 01:00:00 162

原创 以下关于异常处理的代码有哪些问题?

异常,千万不能捕获了之后什么也不做。javac 使用了语法糖进行优化。

2023-08-23 01:00:00 60

原创 ava 中的枚举有什么特点和好处?

枚举类型是指由一组固定的常量组成合法的类型。Java 中由关键字 enum 来定义一个枚举类型。枚举的 equals 方法底层用的还是 ==,所以两者都可以。通过反编译后代码我们可以看到,

2023-08-23 01:00:00 123

原创 Java中异常分哪两类,有什么区别?

ThrowableException和Error,二者都是 Java 异常处理的重要子类,各自包含大量子类。自定义异常就是开发人员自己定义的异常,一般通过继承 Exception 的子类的方式实现。编写自定义异常实际上是继承一个 API 标准异常类,用新定义的异常处理信息覆盖原有信息的过程。这种用法在 Web 开发中也比较常见,一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义,更容易让上层理解和处理。

2023-08-22 09:34:40 640

原创 你知道fastjson的反序列化漏洞吗?

因为 fastjson 自己定义了序列化工具类,并且使用 asm 技术避免反射、使用缓存、并且做了很多算法优化等方式,大大提升了序列化及反序列化的效率。

2023-08-22 09:33:39 206

原创 serialVersionUID 有何用途?如果没定义会有什么问题?

这样,当再次需要这个对象的时候,从文件中读取出二进制流,再从二进制流中反序列化出对象。在序列化之后,由于某些原因,我们对该类做了变更,重新启动应用后,我们相对之前序列化过的对象进行反序列化的话就会报错。进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是。序列化是将对象的状态信息转换为可存储或传输的形式的过程。但是,如果发生了变化,那么这个文件对应的。在进行反序列化时,JVM 会把传来的字节流中的。作序列化版本比较用,这种情况下,如果。的堆内存中的,也就是说,如果。

2023-08-22 08:00:00 262

原创 Java 序列化的原理是什么?

不支持无默认构造函数的类,反序列化时需用户自己初始化序列化后的对象,其只负责将该对象进行赋值;几乎所有的商用编程语言都有序列化的能力,不管是数据存储到硬盘,还是通过网络的微服务传输,都需要序列化能力。同时,也可以通过反序列化机制将磁盘中的字节码再转换成内存中的类。如果要序列化的类有父类,要想同时将在父类中定义过的变量持久化下来,那么父类也应该集成。如果没有在这两个方法中定义序列化实现细节,那么序列化之后,对象内容为空。的序列化机制,将类序列化为符合编码的数据流,然后通过。Kryo:速度快,序列化后体积小;

2023-08-22 01:00:00 139

原创 Java 的动态代理如何实现?

一旦需要代理的类中方法比较多,或者需要同时代理多个对象的时候,这无疑会增加很大的复杂度。的动态代理有一个限制,就是使用动态代理的对象必须实现一个或多个接口。Java 的动态代理,在日常开发中可能并不经常使用,但是并不代表他不重要。动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。最大的区别就是静态代理是编译期确定的,但是动态代理却是运行期确定的。,是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,是通过继承的方式做的动态代理,因此如果某个类被标记为。

2023-08-21 01:00:00 133

原创 Java 注解的作用是什么?

说简单点,就是定义其他注解的注解。比如Override这个注解,就不是一个元注解。而是通过元注解定义出来的。这里面的@Target@Retention就是元注解。@Target(表示该注解可以用于什么地方),@Retention(表示在什么级别保存该注解信息)、(将此注解包含在 javadoc 中)、@Inherited(允许子类继承父类中的注解)。

2023-08-21 01:00:00 115

原创 什么是反射机制?为什么反射慢?

Java.lang.Class 是一个比较特殊的类,它用于封装被装入到 JVM 中的类(包括类和接口)的信息。当一个类或接口被装入的 JVM 时便会产生一个与之关联的 java.lang.Class 对象,可以通过这个 Class 对象对被装入类的详细信息进行访问。在有些场景下,要知道可以使用反射解决部分问题。Java 的 Class 类是 java 反射机制的基础,通过 Class 类我们可以获得关于一个类的相关信息。在 java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

2023-08-20 01:00:00 185

原创 Java 中创建对象有哪些方式?

这是我们最常用的、也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的构造函数(无参的和有参的)。类是 Java 的内部 API,它并不属于 Java 标准库的一部分,也不建议直接在生产环境使用。类来进行直接的内存操作,包括内存分配和对象实例化。然而,需要注意的是,会给我们创建一个单独的对象。就会创建一个新的对象,将前面对象的内容全部拷贝进去。通过使用方法句柄,可以间接地调用构造函数来创建对象。方法获取构造函数的方法句柄,然后通过。方法调用有参数的和私有的构造函数。方法调用无参的构造函数创建对象。

2023-08-20 01:00:00 145

原创 什么是 SPI,和API有什么区别?

步骤1、定义一组接口(假设是),并写出接口的一个或多个实现,(假设是@Override@Override步骤2、在下建立目录,新增一个以接口命名的文件(文件),内容是要应用的实现类(这里是和,每行一个类)。步骤3、使用 ServiceLoader 来加载配置文件中指定的实现。s.shout();代码输出:wang wangmiao miao。

2023-08-19 01:00:00 3400

原创 泛型中上下界限定符 extends 和 super 有什么区别?

如果要从集合中读取类型 T 的数据,并且不能写入,可以使用

2023-08-19 00:45:00 129

原创 什么是泛型?有什么好处?

Java 泛型(generics)是 JDK 5 引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用时在 JDK 5 中的新集合类框架中。转换的阶段,将 List 擦除调转为 List 的手段。换句话说,Java 的泛型只在编译期,JVM 是不会感知到泛型的。的方式来实现,通俗点理解,就是通过语法糖的形式,在。Java 中的泛型通过。

2023-08-18 07:45:00 138

原创 什么是类型擦除?

这种擦除的过程,被称之为 —— 类型擦除。所以类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清楚类型参数的相关信息,并且在必要的时候添加类型检查和类型转换的方法。所以说泛型技术实际上是 Java 语言的一个语法糖,因为泛型经过编译器处理之后就被擦除了,编译器根本不认识泛型。也就是说,在代码中的 Main 和 Main 使用的类,经过编译后都是同一个类。

2023-08-18 05:15:00 181

原创 泛型中 K T V E?Object 等分别代表什么含义?

Object - 是所有类的根类,任何类的对象都可以设置给该 Object 引用变量,使用的时候可能需要类型强制转换,但是用使用了泛型 T、E 等这些标识符后,在实际用之前类型就已经确定了,不需要进行类型强制转换。E - Element(在集合中使用,因为集合中存放的是元素)- 表示不确定的 java 类型(无限制通配符类型)T - Type(Java 类)N - Number(数值类型)V - Value(值)K - Key(键)

2023-08-18 00:45:00 186

原创 常见的字符编码有哪些?有什么区别?

就像电报只能发出“滴”和“答”声一样,计算机只认为 0 和1 两种字符,但是,人类的文字是多种多样的,如何把人类的文字转换成计算机认识的 0、1 字符呢,这个过程同样需要通过字符。对于常用的汉字,在 UTF-8 中采用 3 字节进行编码,但是如果有一种只包含中文和 ASCII 的编码的话,就不需要使用 3 个字节,可能 2 个字节就够了。和摩尔斯电码功能类似,上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定,这被称为 ASCII 码,一直沿用至今。

2023-08-17 07:00:00 162

原创 说几个常见的语法糖

前面介绍了 9 种 Java 中常用的语法糖。所谓语法糖就是提供给开发人员便于开发的一种语法而已。但是这种语法只有开发人员认识。想要被执行,需要进行解糖,即转成 JVM 认识的语法。当我们把语法糖解糖之后,你就会发现其实我们日常使用的这些方便的语法,其实都是一些其他更简单的语法构成的。有了这些语法糖,我们在日常开发的时候可以大大提升效率,但是同时也要避免过度使用。使用之前最好了解下原理,避免掉坑。

2023-08-17 07:00:00 323

原创 RPC接口返回中,使用基本类型还是包装类?

建议使用过第一种:首先,作为接口的返回对象的参数,这个字段不应该有不确定的 null 值,而 Boolean 类型的默认值是 null,而 boolean 的默认值是 false,所以,建议使用 boolean 来定义参数。【强制】POJO 类中的任何布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。反例:定义为基本数据类型 boolean isSuccess;

2023-08-16 14:23:29 179

原创 String 有长度限制吗?是多少?

运行期,String 的 length 参数 int 类型的,那么也就是说,String 定义的时候,最大支持的长度就是 int 的最大范围值。可以看到,这里面的参数 length 是使用 int 类型定义的,那么也就是说,String 定义的时候,最大支持的长度就是 int 的最大范围值。这个值约等于 4G,在运行期,如果 String 的长度超过这个范围,就可能会抛出异常。编译期需要用 CONSTANT_Utf8_info 结构用于表示字符串常量的值,而这个结构是有长度限制,他的限制是 65535。

2023-08-16 14:22:36 488

原创 String为什么设计成不可变的?

为什么要把 String 设计成不可变的呢?有什么好处呢?这个问题,困扰过很多人,甚至有人直接问过 Java 的创始人 James Gosling。在一次采访中 James Gosling 被问到什么时候应该使用不可变变量,他给出的回答是:那么,他给出这个答案背后的原因是什么呢?是基于哪些思考呢?其实,主要是从缓存、安全性、线程安全和性能等角度触发的。

2023-08-13 07:00:00 181

原创 String 有长度限制吗?是多少?

运行期,String 的 length 参数 int 类型的,那么也就是说,String 定义的时候,最大支持的长度就是 int 的最大范围值。可以看到,这里面的参数 length 是使用 int 类型定义的,那么也就是说,String 定义的时候,最大支持的长度就是 int 的最大范围值。这个值约等于 4G,在运行期,如果 String 的长度超过这个范围,就可能会抛出异常。编译期需要用 CONSTANT_Utf8_info 结构用于表示字符串常量的值,而这个结构是有长度限制,他的限制是 65535。

2023-08-13 04:15:00 743

原创 String、StringBuilder和StringBuffer的区别?面试回答

通过查看反编译以后的代码,我们可以发现,原来字符串常量在拼接过程中,是将 String 转成了 StringBuilder 后,使用其 append 方法进行处理的。使用+拼接字符串,其实只是 Java 提供的一个语法糖,那么,我们来解一解这个语法糖,看看他的内部原理到底是如何实现的。而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。其次,String 中存储的 char[] 也是被 final 修饰的,表示他也是不能修改的。

2023-08-12 07:00:00 214

原创 String str=new String(“tango“) 创建了几个对象?

Java 是一种面向对象的语言,而 Java 对象在 JVM 中的存储也是有一定的结构的,在 HotSpot 虚拟机中,存储的形式就是 oop-klass model,即 Java 对象模型。方法时,Java 查找常量池中是否有相同 Unicode 的字符串常量,如果有,则返回其的引用,如果没有,则在常量池增加一个 Unicode 等于 str 的字符串并返回它的引用。那就是很多时候,我们在程序中得到的字符串只有在运行期才能确定的,在编译期是无法确定的,那么也就没办法在编译期被加入到常量池中。

2023-08-12 06:15:00 209

原创 为什么不能用BigDecimal的equals方法做等值比较?

因为 BigDecimal 的 equals 方法和 compareTo 并不一样,equals 方法会比较两部分内容,分别是值(value)和标度(scale),而对于 1.0 和 1 这两个数字,他们的值虽然一样,但是精度是不一样的,所以在使用equals比较的时候会返回 false。所以,因为 BigDecimal(1.0) 和 BigDecimal(1.00)的标度是一样的,所以使用 equals 方法比较的时候,得到的结果就是 true。其他的浮点数也同样的道理。那么,为什么会出现这样的情况呢?

2023-08-11 07:00:00 194

原创 为什么对 Java 中的负数取绝对值结果不一定是正数?

Java 中整型主要包含 byte、short、int 和 long 这四种,表示的数字范围也是从小到大的,之所以表示范围不同,主要和他们存储数据时所占的字节数有关。既然是因为越界了导致最终结果变成负数,那就解决越界的问题就行了,那就是在取绝对值之前,把这个 int 类型转成 long 类型,这样就不会出现越界了。上面说过了,整型中,每个类型都有一定的表示范围,但是,在程序中有些计算会导致超出表示范围,即溢出。所以,在程序中,使用同类型的数据进行运算的时候,虽然,这种情况发生的概率很低,

2023-08-11 07:00:00 110

原创 为什么不能用浮点数表示金额?

IEEE 754 规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。至于一个数对应的 IEEE754 浮点数应该如何计算,不是本文的重点,这里就不再赘述了,过程还是比较复杂的,需要进行对阶、尾数求和、规格化、舍入以及溢出判断等。其实,大家也不用大过于纠结这个公式,大家只需要知道对于单精度浮点数,最多只能用32位字符表示一个数字,双精度浮点数最多只能用64位来表示一个数字。

2023-08-10 07:00:00 269

原创 BigDecimal(double)和BigDecimal(String)有什么区别?

因为计算机采用二进制处理数据,但是很多小数,如 0.1的二进制是一个无限循环小数,而这种数字在计算机中是无法精确表示的。所以,人们采用了一种通过近似值的方式在计算机中表示,于是就有了单精度浮点数和双精度浮点数等。所以,作为单精度浮点数的 float 和双精度浮点数的 double,在表示小数的时候只是近似值,并不是真实值。所以,当使用 BigDecimal(Double) 创建一个数的时候,得到的 BigDecimal 是损失了精度的。而使用一个损失了精度的数字进行计算,得到的结果也是不精确的。

2023-08-10 02:45:00 353

原创 接口和抽象类的区别,如何选择?

一般实际开发中,我们会把接口暴露给外部,然后在业务代码中实现接口。如果多个实现类中有相同可复用的代码,则在接口和实现类中间加一层抽象类,将公用部分代码抽出到抽象类中。可以参考下模板方法模式,这是一个很好的理解接口、抽象类和实现类之间关系的设计模式。抽象类中的抽象方法可以有 public、protected和default这些修饰符,而接口中默认修饰符是 public。接口和抽象类,最明显的区别就是接口只定义了一些方法而已,在不考虑Java8中的default方法情况下,接口中是没有实现的代码的。

2023-08-09 07:00:00 180

原创 Java 中有了基本类型为什么还需要包装类?

如:int 的自动装箱都是通过 Integer.valueOf() 方法来实现的,Integer 的自动拆箱都是通过 integer.intValue() 来实现的。为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。可以看到,包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的。包装类是对基本类型的包装,所以,把基本数据类型转换成包装类的过程就是。

2023-08-09 07:00:00 490

原创 Strinng a=“ab“;String b=“a“+“b“;a==b 吗?

因为 a 和 b 都是由字面量组成的字符串,它们的引用地址在编译时就已经确定了,并且在编译之后,会把字面量直接合在一起。因此,a==b 的结果为 true,因为它们指向的是同一个字符串对象。在 Java 中,对于字符串使用 == 比较的是字符串对象的引用地址是否相同。

2023-08-08 14:14:15 150

最好用的远程桌面控制工具——向日葵

最好用的远程桌面控制工具——向日葵

2022-03-22

PHP 最好用的开发 IDE PhpStorm

PHP 最好用的开发 IDE PhpStorm

2022-03-22

Java 开发语言 open jdk8

Java 开发语言 open jdk8

2022-03-22

goland 在 windows 上最好用的 IDE

goland 在 windows 上最好用的 IDE

2022-03-22

mongodb 在 windows 上的可视化工具

mongodb 在 windows 上的可视化工具

2022-03-22

Jitsi Meet 的 Web 组件的 docker 镜像,支持私网部署

Jitsi Meet 的 Web 组件的 docker 镜像,支持私网部署

2022-03-22

java8 的docker镜像,支持私网部署

java8 的docker镜像,支持私网部署

2022-03-22

Elasticsearch 的 Docker 镜像

Elasticsearch 的 Docker 镜像

2022-03-22

Docker 在 Windows 环境的工具 Docker Desktop installer.exe

Docker 在 Windows 环境的工具 Docker Desktop installer.exe

2022-03-22

git windows 桌面使用工具 GitHubDescktopSetup.exe

git windows 桌面使用工具 GitHubDescktopSetup.exe

2022-03-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除