JAVA语言
对Java语言基础的一些问题进行分析得出一些见解
酱油瓶啤酒杯
这个作者很懒,什么都没留下…
展开
-
Java-HashMap的put()方法-源码详解
1、HashMap是什么?HashMap继承自Map接口,是键值对存储的一种集合。JDK1.7之前底层使用数组+链表实现;JDK1.8之后当链表长度大于默认值8的时候,链表转换为红黑树一般的put()方法就是将key-value添加到HashMap当中,通过key的hashCode经过扰动函数后得到hash值就是在数组中的位置,之后判断数组中是否已经存在了当前的value,存在则覆盖,不存在通过拉链法解决Map<Object,Obkect> hashmap = new HashMap原创 2021-02-27 15:05:36 · 2303 阅读 · 0 评论 -
Java错误解决-incompatible types: cannot infer type arguments for PriorityQueue<>
在以下代码运行时出错PriorityQueue<Long> pq1 = new PriorityQueue<>((o1,o2) -> (o2 - o1));//大顶堆查看报错原因Line 6: error: incompatible types: cannot infer type arguments for PriorityQueue<>reason: cannot infer type-variable(s) E(argument mismat.原创 2021-02-03 15:19:39 · 6729 阅读 · 1 评论 -
IntelliJ IDEA 2021.1.EAP发布-新特性介绍-附下载链接
1、Java16支持最新发布的IntelliJ IDEA 2021.1.EAP版本,增加了对JDK16的基本支持1)内部类可以声明显式或隐式的成员tream.collect(toUnmodifiableList())被转换成stream.toList()当前toList()函数显示在stream的code completion list中2、WSL 2支持当用户的 IDE 在 Windows 上运行时,该 EAP 将包括对 WSL 2 内的 Java 项目的初步支持。Inte原创 2021-02-02 16:24:43 · 2888 阅读 · 0 评论 -
Netty-NIO学习-基于FileChannel读写实战
1、准备知识介绍NIO模式的三大组件:Selector/选择器、Channel/通道、Buffer/缓存的关系图如下所示:每个线程对应一个Selector,每个Selector对应多个Channer,每个Channerl对应一个Buffer,每个Buffer对应一个客户端程序。缓冲区/Buffer的实质是一个可以读写数据的内存块,底层是容器对象/数组。可以使用flip()方法进行读写切换。Buffer是一个顶层抽象父类,有很多实现子类2、本地文件写数据FileChannal主要用作对本地文原创 2021-01-28 20:10:10 · 699 阅读 · 2 评论 -
Netty-使用线程池优化BIO-代码实现
1、背景介绍已知NIO的性质是每有一个新的连接请求就要新建一个线程与之连接,线程的创建对资源的消耗是很大的,可以使用之前学过的池化思想来节省线程资源2、设计要求使用BIO模型食记一个服务器端,监听某个端口,当有客户端请求连接时就启动一个线程与之通讯,服务器端可以接收服务器发生的数据3、代码实现代码分为两部分,第一部分是main函数,第二部分是handler函数,需要注意是是涉及到Socke和输入流的一些Java知识点package BIO;import java.io.IOExceptio原创 2021-01-27 22:07:15 · 383 阅读 · 1 评论 -
JVM-双亲委派模型-源码
1、什么是双亲委派模型已知每个类都有对应的类加载器,系统的ClassLoader在协同工作时会默认使用双亲委派模型:在类加载时先判断该类是否被加载过,已加载过的类会直接返回。没加载过的类加载的时候,先把该请求委派该父类加载器的loadClass()处理,由此可知所有的请求都会传送到顶层的启动类加载器。父类加载器无法处理的时候,才会自己进行处理。无父类加载器时启用BootstrapClassLoader作为父类加载器。这⾥的双亲更多地表达的是“⽗ ⺟这⼀辈”的⼈⽽已private final C..原创 2021-01-02 13:37:56 · 207 阅读 · 0 评论 -
基础-深拷贝VS浅拷贝
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝深拷贝::对基本数据类型进行值传递,对引用数据类型要创建一个新的对象复制要拷贝的内容原创 2021-01-02 13:35:32 · 126 阅读 · 0 评论 -
集合-ConcurrentHashMap-线程安全底层实现
1、ConcurrentHashMap分段锁JDK1.7是采用分段锁的思想,对整个桶数组进行切割分段(segment),给每一段数据配置一把锁,当一个线程占用锁访问一段数据的时候,其他的数据也能被其他的线程访问到;ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成的:Segment实现了ReentrantLock,是一种可重入锁,来扮演锁的角色;HashEntry用于存储键值对数据。static class Segment<K,V> e原创 2020-12-30 10:18:25 · 133 阅读 · 0 评论 -
集合-Collection.SynchronizeMap方法-源码解读
1、从HashMap出发HashMap 本身非线程安全的,但是当使用 Collections.synchronizedMap(new HashMap()) 进行包装后就返回一个线程安全的Map。2、源码分析 public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) { //返回一个SynchronizedMap对象 return new SynchronizedMap<K,V&原创 2020-12-24 10:21:50 · 344 阅读 · 0 评论 -
源码-JDK1.8HashMap扩容方法resize()解析
1、准备知识HashMap的底层数据结构Java语言的基本数据结构可以分为两种,一种是数组,另一种的模拟指针/引用,Java语言中涉及到的数据结构都是这两种的扩充。JDK1.8之前HashMap是数组+链表结合的链表散列。JDK1.8在解决哈希冲突上发生了变化,当链表长度大于阈值/默认8的时候,会将链表转化为红黑树,减少搜索时间。hash算法我们希望HashMap的元素位置尽量分散,最好是每个位置只有一个元素,这样用hash算法求得该位置后可以直接返回结果,不用再遍历链表/红黑树。H原创 2020-12-13 23:33:21 · 337 阅读 · 0 评论 -
JVM-访问Java对象的底层分析
如果访问Java对象?底层解析1、前提条件 在我的上一篇文章https://blog.csdn.net/CodeDabaicai/article/details/107014400中,从JVM的角度出发分析了创建一个Java对象的五个基本步骤,并对一些由此引申出的问题进行了相关解析。 创建对象之后,就涉及到使用对象的问题。那么一个Java对象的访问又是如何实现的呢?下边小王将进一步解析。2、通过一个程序示例分析class Person{ private int id;原创 2020-12-04 15:26:19 · 116 阅读 · 0 评论 -
基础-在Java中定义一个空参且无内容的构造方法有什么作用?
在执行子类的构造方法之前就检查有没有用super()来调用父类特定的构造方法,没有就调用父类无参的构造方法。如果父类只定义了有参的构造方法,子类又没有super()来指定,编译就会出现错误,因为找不到父类中的无参构造方法。如何解决,父类中加一个空参的构造方法即可...原创 2020-11-30 21:23:49 · 1891 阅读 · 0 评论 -
基础-Java标识符-命名规范回顾
1、标识符是什么是给类、接口、方法、变量起名字时用的字符序列通俗讲就是他们的名字怎么写,如何规范2、标识符有什么英文大小写、数字、$、_ 的组合3、注意事项不能以数字开头不能是Java的关键字要区分大小写4、常见规则包名:多单词组成、全部小写 例:myjavacode类/接口名:多单词组成,单词的首字母大写 MyJavaDemo变量/函数名:多单词组成,首个单词的首字母小写,其余首大写 myJavaDemoDemo常量名:所有字母大原创 2020-07-25 20:19:14 · 103 阅读 · 0 评论 -
基础-Java常用运算符-LeetCode必备
1、逻辑运算符& | ^ !&与 全是true才是true|或 有一个是true就true^异或 11-0 01-1 00-0!非 1-02、&&和&的区别&&具有短路效果,左边false,右边就不执行||具有短路效果,左边true,右边就不执行节省计算资源3、可以用于位运算数-二进原创 2020-07-25 20:17:17 · 117 阅读 · 0 评论 -
基础-Java构建器/Builder模式入门解析
1、什么情况下考虑使用构造器遇到多个构造器参数需要设置的时候/可能一次只需要设置其中特定的几项;这时候使用重叠构造器模式,第一个构造器含一个参数,第二个两个,以此类推。会涉及到用不到的参数,造成失控;这时候出现了JavaBeans模式,使用一个无参的构造器创建对象,之后使用setter方法设置每个必要的参数(setXxxxx)。缺点是调试困难,线程不安全。2、Builder模式介绍1、不直接生成想要的对象,而是让客户端利用必要的参数调用构造器,以此得到一个builde对象;2、客户端在bu原创 2020-07-05 23:52:14 · 357 阅读 · 1 评论 -
基础-1分钟弄清楚Java方法的重载(Overload)与重写(Override)区别
1、重载 Overload在同一个类中,方法名相同,参数列表不同和返回值没有关系参数的顺序不同也算重载 但是开发中不涉及2、重写 Override在子类继承父类后,子类中存在与父类同名的方法,且方法中参数的个数,顺序,类型与必须一致,称为方法重写。示例代码public class Animal{ public void eat(){ System.out.pritnln("吃饭"); }}public class Dog exten原创 2020-07-01 20:34:44 · 117 阅读 · 0 评论 -
只要4步理解什么是Java标识符/命名规范
1、标识符是什么是给类、接口、方法、变量起名字时用的字符序列通俗讲就是他们的名字怎么写,如何规范2、标识符怎么使用英文大小写、数字、$、_ 的组合3、注意事项不能以数字开头不能是Java的关键字要区分大小写4、常见规则包名:多单词组成、全部小写 例:myjavacode类/接口名:多单词组成,单词的首字母大写 MyJavaDemo– #### 变量/函数名:多单词组成,首个单词的首字母小写,其余首大写 myJavaDemoDemo常量名原创 2020-06-30 19:52:21 · 410 阅读 · 1 评论 -
基础-JAVA集合类型主要区别
1、List,Set,Map三者的区别List 储存一组不唯一的,有序的对象Set 不允许重复Map 使用键值对存储 key不能重复2、ArrayList和LinkedList的区别相同之处:二者都不同步,线程不安全底层数据结构:ArrayList使用Object数组存储,插入和删除元素复杂度受到元素位置的影响;LinkedList使用链表存储,add(E element)删除时时间复杂度不受位置影响,指定位置受影响add(int index, E element)快速随机访问get原创 2020-12-07 09:45:20 · 230 阅读 · 0 评论 -
JVM-JAVA对象创建的五个步骤
对象创建的五个步骤1、类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2、分配内存在类加载检查完成后,虚拟机为new出来的对象分配内存。新对象需要的内存大小在类加载完成后就已经确定,现在要做的是吧一块确定大小的内存从Java堆中划分出来。分配方式涉及到两种:指针碰撞空闲列表堆内存规整时堆内存不规整原创 2020-06-29 10:03:01 · 6385 阅读 · 7 评论 -
JAVA14新特性简单预览
1、switch表达式支持使用箭头var log = switch (event) {case PLAY -> “User has triggered the play button”;case STOP, PAUSE -> “User needs a break”;default -> {String message = event.toString();LocalDateTime now = LocalDateTime.now();yield "Unknown even原创 2020-06-29 10:00:47 · 294 阅读 · 0 评论