
Java进阶
文章平均质量分 83
Java进阶知识总结
我心向阳iu
CSDN专家博主、阿里云开发者社区专家博主、51CTO社区专家博主、360书馆认证博主、知乎掘金B站等平台受邀作者。
如遇开发、程序等需求,博客首页下拉加入公众号,私信博主
展开
-
JDK1.8新特性:函数式接口
其实,jdk中给我们提供了很多的函数式接口,我们平时都会用到,只不过大家没有注意到而已,这里我结合实际代码讲解几个常用的函数式接口。Supplier接口的get方法没有入参,返回一个泛型T对象。这个过程是不是有的同学已经发现,怎么这么像jdk里面的一些接口的使用,比如常用的Runnable接口。没错函数式接口,函数式编程,我们可以使用lambda表达式的写法,可以让代码更优雅,具体可以参照我的前一篇帖子。这时,有的同学会说,我用Runnable接口可不是这么用的,我的写法比你优雅,我是这么写的。原创 2022-09-26 09:44:55 · 3326 阅读 · 0 评论 -
Java(四大)内部类代码解析
就是普通的内部类,放在类里声明当内部类访问外部类时,可以不受访问控制符的影响,直接访问属性与方法当外部类变量与方法和内部类同名,内部类默认访问自己的成员变量或方法,引用外部变量使用时加类名.this、外部类不能直接使用内部类的成员和方法,如下报错,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法。原创 2022-09-26 09:00:35 · 1300 阅读 · 0 评论 -
一文就懂ConcurrentHashMap实现原理
哈希表就是一种以键-值(key -indexed) 存储数据的结构,我们只要输入待查 找的值即 key,即可查找到其对应的值。哈希表是一种非常高效的数据结构 ,设计优良的哈希函数可以使其上的增删改查操作达到O(1)级别。Java为我们提供了一个现成的哈希结构 ,那就是HashMap类 ,在前面的文章中我曾经介绍过HashMap类 ,知道它的所有方法都未进行同步 ,因此在多线程环境中是不安全的。原创 2022-10-31 18:13:03 · 2113 阅读 · 0 评论 -
BIO、NIO、AIO 代码实战
AIO是在JDK1.7中推出的新的IO方式–异步非阻塞IO,也被称为NIO2.0,AIO在进行读写操作时,直接调用API的read和write方法即可,这两种均是异步的方法,且完成后会主动调用回调函数。BIO是阻塞的,如果没有多线程,BIO就需要一直占用CPU,而NIO则是非阻塞IO,NIO在获取连接或者请求时,即使没有取得连接和数据,也不会阻塞程序。效果大概是这样的:首先服务端等待事件发生,当客户端启动时,服务器端先接受到连接的请求,接着接受到数据读取的请求,读完数据后继续等待。原创 2022-10-10 21:13:33 · 794 阅读 · 0 评论 -
Java:ArrayList实现原理
ArrayList是List接口的可变数组的实现。它实现了List接口以及list相关的所以方法,**它允许所有元素的插入,包括null。**此外还提供一些方法来操作内部用来存储列表的数组的大小。除了实现 List 接口外, 每个ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是大于等于列表的大小。初始化ArrayList的时候,可以指定初始化容量的大小,如果不指定,就会使用默认大小,为10随着向ArrayList 中不断添加元素,其容量也自动增长。原创 2022-10-26 16:17:21 · 1478 阅读 · 0 评论 -
Java 逻辑运算符与短路逻辑运算符
两边都是true时,结果才为true,只要运算符两边有一个false,结果就为false。&&(短路与),如果左边为真,右边执行;如果左边为假,右边不执行。||(短路或),如果左边为假,右边执行;如果左边为真,右边不执行。&&(短路与),如果左边为真,右边执行;如果左边为假,右边不执行。||(短路或),如果左边为假,右边执行;如果左边为真,右边不执行。| 两边都为false,结果为false,其余都为true。&(逻辑与),无论左边真假,右边都要执行。|(逻辑或),无论左边真假,右边都要执行。原创 2022-10-16 16:59:06 · 1335 阅读 · 0 评论 -
Java 深拷贝与浅拷贝概念与代码实现
首先,String类型属于引用数据类型,不属于基本数据类型,但是String类型的数据是存放在常量池中的,也就是无法修改的!我们定义了一个Student学生类,包含name姓名,和age年龄,sex性别,而是另一个School类,包含schoolName学校名称和stuNums学生数量以及Student学生,其中Student并不是字符串,而是一个Student类。要注意:如果在拷贝构造方法中,对引用数据类型变量逐一开辟新的内存空间,创建新的对象,也可以实现深拷贝。首先,我们定义一下需要拷贝的简单对象。原创 2022-10-15 22:02:32 · 1365 阅读 · 0 评论 -
关键字:throws、throw、try、catch、finally 分别是如何使用的?
try:可以在一个成员函数调用的外面写一个 try 语句,在这个成员函数内部写另一个 try 语句保护其他代码。每当遇到一个 try语句,“异常”的框架就放到栈上面,直到所有的 try 语句都完成。如果下一级的 try 语句没有对某种“异常”进行处理,栈就会展开,直到遇到有处理这种“异常”的 try 语句。一般情况下是用 try 来执行一段程序,如果出现异常,系统会抛出(throw)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理;原创 2022-10-16 09:19:01 · 1469 阅读 · 0 评论 -
Java List 扩容机制探究(ArrayList 、Vector、LinkedList)
ensureExplicitCapacity方法会调用grow方法,扩容1.5倍,就是在此发生的。ensureCapacityInternal方法会调用ensureExplicitCapacity方法来确保空间,modCount用来多线程的判断,此处不赘述。调试下我们可以发现,虽然elementData进行了扩容,但是实际大小还是元素的个数,别被唬住了。方法,capacityIncrement默认是0,所以等价。初始化会默认调用无参,再调用有参数构造器,空间默认10。这是第二次扩容为,扩容为15。原创 2022-10-16 21:25:43 · 3189 阅读 · 0 评论 -
场景应用:线程池的队列大小你通常怎么设置?
综合来看,我们可以根据自己的业务场景,从“N+1”和“2N”两个公式中选出一个适合的,计算出一个大概的线程数量,之后通过实际压测,逐渐往“增大线程数量”和“减小线程数量”这两个方向调整,然后观察整体的处理时间变化,最终确定一个具体的线程数量。原创 2022-11-08 17:02:48 · 4244 阅读 · 0 评论 -
Java IO模型:BIO、NIO、AIO讲解
IO,Input/Output 简写,是指内存和外设之间的数据复制的过程。输入是指数据从外设复制到内存中, 输出则是指数据从内存复制到外设。目前,IO 可以通过数据流、序列化和文件系统为系统提供输入和输出而Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。Java IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。原创 2022-10-17 16:59:52 · 2261 阅读 · 0 评论 -
场景应用:Java的接口和抽象类有什么区别?你平时是怎么用的?
对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务。当在一个程序中使用接口时,接口是多个模块间的耦合标准;抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能,但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式。抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。原创 2022-11-07 14:24:17 · 6539 阅读 · 0 评论 -
Java为什么把String设计为不可变类?
由于字符串无论在任何 Java 系统中都广泛使用,会用来存储敏感信息,如账号,密码,网络路径,文件处理等场景里,保证字符串 String 类的安全性就尤为重要了,如果字符串是可变的,容易被篡改,那我们就无法保证使用字符串进行操作时,它是安全的,很有可能出现 SQL 注入,访问危险文件等操作。由于 String 天然的不可变,当一个线程”修改“了字符串的值,只会产生一个新的字符串对象,不会对其他线程的访问产生副作用,访问的都是同样的字符串数据,不需要任何同步操作。当字符串不可变时,字符串常量池才有意义。原创 2022-11-07 13:48:52 · 2210 阅读 · 0 评论 -
Java 面向对象程序设计思想
调用时,我们可以传入Vehicle类型的实例,也可以传入任意的Vehicle子类型的实例,对于调用者来说一样的方便,但对于开发者来说,代码却变得十分的简洁了。,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。父类引用指向子类对象称为 向上转型。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。原创 2022-11-07 13:26:02 · 2009 阅读 · 0 评论 -
Java 常见的 IO流
其中,节点流可以直接从/向一个特定的IO设备读/写数据,也称为低级流。流是Java对不同输入源输出源的抽象,代表了从起源到接收的有序数据,有了它程序就可以采用统一的方式来访问不同的输入源和输出源了。java.io.OutputStreamWriter (字符字节输出流,将字节输出流转换为字符输出流)java.io.InputStreamReader (字符字节输入流,将字节输入流转换为字符输入流)其中,字节流操作的数据单元是byte(字节),而字符流操作的数据单元是char(16位的字符)。原创 2022-11-04 15:57:04 · 1375 阅读 · 0 评论 -
Java:cookie和session区别与原理
客户端通过响应的cookie而持有SESSIONID,所以当它再次访问服务器时,会通过cookie携带这个SESSIONID。服务器获取到SESSIONID后,就可以找到与之对应的session对象,进而从这个session中获取该客户端的状态。隐私策略不同:cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行。浏览器支持不同:cookie是需要浏览器支持的,如果客户端禁用了cookie,则会话跟踪就会失。都会产生一个session,如果并发量大的话,则会消耗大量的服务器内存。.原创 2022-08-26 22:03:16 · 1361 阅读 · 0 评论 -
Java中侵入性与非侵入性讲解
这样的情况我们就认为这个新组件具有侵入性。比如struts,我们需要继承一些struts的类,才能实现想要的功能,这就是侵入式。比如Spring,Spring框架是一种非侵入式的轻量级框架,使用spring编写业务逻辑,不需要继承Spring的接口和类,直接通过配置依赖注入就可以使用,将来抛弃spring也比较方便。通过上述说明我们可以发现,非侵入式代码更符合大多业务场景,同时我们代码设计的思路是"高内聚,低耦合",为了实现这个思路,就必须降低代码的侵入性,那么我们如何实现非侵入式的设计目标呢?原创 2022-08-24 21:02:07 · 1366 阅读 · 0 评论 -
Java:Comparable和Comparator区别
Comparable和Comparator都可以用来进行比较、排序。Comparable可以直接在需要进行排序的类中实现,重写方法;Comparator需要另外顶一个实现Comparator接口的实现类来作为“比较器”。二者各有优缺点用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。Comparator 的好处是不需要修改源代码。原创 2022-08-19 19:15:20 · 1403 阅读 · 0 评论 -
Java:join方法详解
join内部调用 Object的native wait方法是将当前线程阻塞,而不是将当前调用的对象的线程阻塞,当前线程是主线程,所以主线程会阻塞,当子线程执行完后,他会去唤醒main继续执行。原创 2022-08-16 15:51:49 · 7744 阅读 · 0 评论 -
HashMap是怎么解决哈希冲突的?
当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞/冲突)。原创 2022-08-15 15:51:08 · 3861 阅读 · 1 评论 -
HashMap为什么线程不安全?
在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况。在JDK1.8中,在并发执行put操作时会发生数据覆盖的情况。原创 2022-08-15 14:41:29 · 1818 阅读 · 1 评论 -
Java中的static关键字几个注意点
因为类成员是属于类的,类成员的作用域比实例成员的作用域更大,完全可能出现类成员已经初始化完成,但实例成员还不曾初始化的情况,如果允许类成员访问实例成员将会引起大量错误。在Java类里只能包含成员变量、方法、构造器、初始化块、内部类(包括接口、枚举)5种成员,而static可以修饰成员变量、方法、初始化块、内部类(包括接口、枚举),也就是除了构造器都可以修饰。static关键字可以修饰成员变量、成员方法、初始化块、内部类,被static修饰的成员是类的成员,它属于类、不属于单个对象。...原创 2022-08-15 10:44:45 · 2064 阅读 · 0 评论 -
Java中的异常处理机制
异常从发生异常的方法向外传播,首先传给该方法的调用者,再传给上层调用者,以此类推。将关闭资源的代码写在finally块内,可以满足这种需求,即无论是否发生异常,finally块内的代码总会被执行。如果finally块里也使用了return或throw等导致方法终止的语句,finally块已经终止了方法,系统将不会跳回去执行try块、catch块里的任何代码。不管try块中的代码是否出现异常,也不管哪一个catch块被执行,甚至在try块或catch块中执行了return语句,finally块总会被执行。..原创 2022-08-15 10:17:32 · 3171 阅读 · 0 评论 -
手写一个 Redis LruCache 缓存机制(LRU)
/ node结点类 static class Node {} } /*** 断开节点的连接* @param node 要断开连接的结点} // 将当前访问的结点更新到头 public void toHead(Node node) {// 一开始就得设置头 next 是尾 尾的pre是头 head . next = tail;} /*** 删除节点* @param key 删除节点的值} /*** 获取值* @param key 键。...原创 2022-08-15 09:51:08 · 1568 阅读 · 0 评论 -
一致性哈希算法原理图文详解!学不会接着来砍我!
先构造一个长度为2^32的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 2^32-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 2^32-1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。这种算法解决了普通余数Hash算法伸缩性差的问题,可以保证在上线、下线服务器的情况下尽量有多的请求命中原来路由到的服务器。...原创 2022-08-14 17:27:52 · 2850 阅读 · 0 评论 -
一文就懂HashMap原理!学不会你来砍我!
HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null(但是key的位置只能有一个null),此外,HashMap 中的映射不是有序的。好,我们根据这里的简介看一个入门例子:运行结果如下所示:这里的HashMap我是用的jdk8的,jdk1.7及以前和jdk1.8 及以后的HashMap是有很大区别的:下面我们说的HashMap都是jdk1.8 及原创 2022-08-12 23:48:16 · 2492 阅读 · 0 评论 -
Java 信号量代码演练
信号量为多线程协作提供了更为强大的控制方法。信号量是对锁的扩展。锁一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。例如:过收费站的案例,收费站入口是共享资源,每辆车好比是一个线程,看门人是信号量。一共有5个检查口,所以这个资源内只能同时有五个车在过。...原创 2022-08-07 21:10:52 · 1287 阅读 · 0 评论 -
Java 写个注解并使用
注解(Annotation),也叫元数据,是一种代码级别的说明。是Java 的JDK1.5版本开始引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】代码分析:通过代码里标识的元数据对代码进行分析【使用反射】编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】很多框架技术的新版本中,都可以使用注解替代XML配置文件;【SpringB原创 2022-08-07 16:35:24 · 1378 阅读 · 0 评论 -
Java 内省机制
;;比如:属性名称为name,则有getName方法返回属性name值, setName方法设置name值;注意方法的名称通常是get或 set加上属性名称,并把属性名称的首字母大写;这些方法称为getters/setters;getters必须有返回值没有方法参数;setter值没有返回值,有方法参数;例如下面的例子:符合这些特征的类,被称为;...原创 2022-08-07 15:29:00 · 1990 阅读 · 0 评论 -
Java泛型:类型擦除
Java的泛型类型不能用于new构建对象(也不能用于初始化数组).泛型不能用于显性地引用运行时类型的操作之中,例如转型,instanceof和new操作(包括new一个对象,new一个数组),因为所有关于参数的类型信息都在运行时丢失了,所以任何在运行时需要获取类型信息的操作都无法进行工作。原始类型就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型,无论何时定义一个泛型,相应的原始类型都会被自动提供,类型变量擦除,并使用其限定类型(无限定的变量用Object)替换。一个 是List泛型类型的,...原创 2022-08-07 13:43:12 · 3543 阅读 · 0 评论 -
fail-fast 和 fail-safe 快速学习
首选说一下这两个的概念。原创 2022-08-07 11:34:55 · 3788 阅读 · 0 评论 -
Java:强引用、软引用、弱引用与虚引用
1、Java四种引用级别强引用、软引用、弱引用和虚引用。(由高到低)当垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收。引用类型被垃圾回收时间用途生存时间强引用从来不会对象的一般状态JVM停止运行时终止软引用当内存不足时对象缓存内存不足(OOM)时终止弱引用正常垃圾回收时对象缓存垃圾回收(GC)后终止虚引用任何时候都可能跟踪对象的垃圾回收(因为有通知)https。......原创 2022-07-27 20:32:21 · 1470 阅读 · 0 评论 -
java泛型常问面试题总结
java里面的泛型是一种伪泛型,只存在于java源码里面,在编译期时编译器会去检测泛型的类型,当我们把java代码编译成字节码后,泛型会退化,或者说是被擦除了。java虚拟机不支持泛型,如果不擦除,虚拟机会认不出来。?extendsXXX//上限?superXXX//下限?...原创 2022-07-25 21:47:10 · 3115 阅读 · 0 评论 -
Java泛型中的PECS原则
CS(customersuper)消费使用super,上界不定,读取不行(只能用Object接收),下界确定,写入优良(可以写入Apple与Apple的子类型),写多读少(消费者消费了要进行写入)PE(producerextends)生产者使用extends,上界确定,读取优良(用Apple接收),下界不定,写入不行(只能存null),读多写少(生产者读取了才能进行生产)superT"作为数据结构泛型。,可以把这个List当成一个消费者,你可以往里面存数据,但是不能往里面获取数据。...转载 2022-07-25 21:52:15 · 1015 阅读 · 0 评论 -
深入理解CAS (自旋锁)
CAS,compareandswap的缩写,中文翻译为比较并交换。CAS操作中包含三个操作数——内存位置(V)、预期原值(E)和新值(N)。这三个字母缩写的含义Variable变量;Expect预期;New新如果内存位置的值与预期原值相匹配,那么处理器会⾃动将该位置值更新为新值。否则,处理器不做任何操作。⽆论哪种情况,它都会在CAS指令之前返回该位置的值(在CAS的⼀些特殊情况下将仅返回CAS是否成功,而不提取当前值)。CAS用同步的方式。...原创 2022-07-23 09:56:00 · 5475 阅读 · 3 评论 -
Java Stream流的详解
Stream作为Java8的一大亮点,它与java.io包里的InputStream和OutputStream是完全不同的概念。Java8中的Stream是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregateoperation),或者大批量数据操作(bulkdataoperation)。StreamAPI借助于同样新出现的Lambda表达式,而且使用并发模式,极大的提高编程效率和程序可读性。...原创 2022-07-18 10:37:38 · 2884 阅读 · 0 评论 -
Java 可变参数基本使用
可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了,方法的参数类型已经确定,个数不确定,我们可以使用可变参数可变参数定义格式修饰符返回值类型方法名(数据类型…变量名){}可变参数定义的注意事项这里的变量其实是一个数组,例如[10,20]如果一个方法有多个参数,包含可变参数,可变参数要放在最后。......原创 2022-07-18 08:39:22 · 2929 阅读 · 0 评论 -
Java:TreeMap集合探究
TreeMap底层是红黑树结构依赖自然排序或者比较器排序,对键进行排序如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器排序规则TreeMap继承关系。原创 2022-07-18 08:43:06 · 1528 阅读 · 0 评论 -
如何正确重写hashCode方法?
以下是李大佬的回答作者李子捌链接https那为什么是31呢?31为什么能成为JDK计算团队选中的真命天子,就不能是2?不能是1001?其实使用31作为乘积因子是有原因的,其原因小捌觉得有三点31是一个不大不小的数,它不会过小导致hashcode计算的结果容易发生冲突;因为返回值是一个int整数类型也不至于过大,导致hashcode返回值溢出。31是一个奇数,一个数与奇数相乘,不容易丢失低位;......原创 2022-07-17 21:12:18 · 6493 阅读 · 2 评论 -
HashMap概述与用法总结
Map集合的定义//K键的类型;V值的类型publicnterfaceMap{}其中K键的类型;V值的类型Map集合的特点它是一个双列集合,一个键对应一个值键不可以重复,但是值可以重复//创建集合对象Mapmap=newHashMap();Hashmap哈希映射是基于哈希表的Map接口的实现,HashMap用于存储Key-Value键值对的集合。......原创 2022-07-17 19:55:24 · 1852 阅读 · 0 评论