java
沐雨金鳞
大行不顾细谨
展开
-
ArrayList和LinkedList遍历的时间对比
先放结论:ArrayList遍历最大的优势在于内存的连续性,CPU的内部缓存结构会缓存连续的内存片段,可以大幅降低读取内存的性能开销。Iterator遍历:100万数据:ArrayList程序运行时间: 5ms LinkedList程序运行时间: 11msimport java.util.*;class Test { public static void main(String[] args) { ArrayList<Integer> a.原创 2021-01-16 14:05:56 · 480 阅读 · 0 评论 -
Java天生就是多线程程序
import java.lang.management.ManagementFactory;import java.lang.management.ThreadInfo;import java.lang.management.ThreadMXBean;class Solution { public static void main(String[] args) { // 获取java线程管理的MXBean ThreadMXBean threadMXBean.原创 2021-01-11 21:15:13 · 188 阅读 · 0 评论 -
自定义注解案例(反射)
1、设置性别的注解import java.lang.annotation.*;/* 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃; 2、RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期; 3、RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在; */@Documen原创 2020-12-09 16:21:26 · 291 阅读 · 0 评论 -
Collections.sort()使用了什么排序?
Collections.sort()点击进入:点击sort()进入:如果没有指定Comparator 进入Arrays.sort: 如果Comparator为null,则进入sort方法 看是否设置了LegacyMergeSort.userRequested为true 如果设置了则使用归并排序,如果未设置则使用TimSort(优化归并排序) 当LegacyMergeSort.userRequested==true,采用legacyMergeSort ...原创 2020-10-12 22:56:27 · 2424 阅读 · 0 评论 -
Java的Arrays.sort()方法到底用的什么排序算法
元素个数 <47 :插入排序 47 <= 元素个数 <286 : 快速排序 元素个数 > 286 :归并排序原创 2020-10-12 20:36:46 · 484 阅读 · 0 评论 -
反射为什么慢?
java反射之所以慢,根本原因是编译器没法对反射相关的代码做优化。我们都知道 Java 代码是需要编译才能在虚拟机里运行的,但其实 Java 的编译期是一段不确定的操作过程。因为它可能是一个前端编译器(如 Javac)把 *.java 文件编译成 *.class 文件的过程;也可能是程序运行期的即时编译器(JIT 编译器,Just In Time Compiler)把字节码文件编译成机器码的过程;还可能是静态提前编译器(AOT 编译器,Ahead Of Time Compiler)直接把 *.java转载 2020-10-11 21:19:52 · 1138 阅读 · 0 评论 -
JDK和Cglib代理的区别
AOP底层原理:动态代理一、区别:JDK动态代理:基于反射机制,生成一个实现代理接口的匿名类,然后重写方法,实现方法的增强. 它生成类的速度很快,但是运行时因为是基于反射,调用后续的类操作会很慢. 只能针对接口编程的.public interface Movie { void play(); void sayHello();}//被代理类实现接口方法public class BabaiMovie implements Movie{ @Overrid.原创 2020-10-11 11:28:30 · 198 阅读 · 0 评论 -
为什么ReentrantLock不能完全替代synchronized?
《java并发编程实战》上说是因为如果使用Reentrantlock时,你没有释放锁,很难追踪到最初发生错误的位置,因为没有记录应该释放锁的位置和时间。在JDK1.5中,synchronized是性能低效的。因为这是一个重量级操作,它对性能最大的影响是阻塞的是实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性带来了很大的压力。相比之下使用Java提供的ReentrankLock对象,性能更高一些。 到了JDK1.6,发生了变化,对synchronize加入了很多优化措施,有原创 2020-09-26 16:54:45 · 680 阅读 · 0 评论 -
LinkedBlockingQueue和ArrayBlockingQueue
相同:LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口; LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列(内部都是使用ReentrantLock和Condition来保证生产和消费的同步;当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞.)不同:1、队列中的同步锁机制不同ArrayBlockingQueue中的锁是没有分离的,即生产和消费用的是同一个锁; 使用一个R.原创 2020-09-26 16:48:39 · 3192 阅读 · 0 评论 -
如何设置线程池的线程数?
合理的设置线程池的线程数需要针对不同的任务类型而定,任务类型可以分为cpu密集型、IO密集型和混合型。cpu密集型cpu密集型指的是线程处理任务时,cpu参与计算的时间比较多,这种情况下,如果设置的线程数过多,会增加上下文的切换次数,带来额外的开销。 线程数的设定公式是:线程数=(cpu核心数+1)。IO密集型IO密集型是指在处理任务时,IO过程所占用的时间较多,在这种情况下,线程数的计算方法可以分为两种:第一种配置方式:由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程原创 2020-09-25 20:19:57 · 837 阅读 · 0 评论 -
堆排序
https://img2018.cnblogs.com/blog/1469176/201903/1469176-20190329000545588-1486048945.gif/** * 堆排序演示 */class HeapSort { public static void main(String[] args) { // int[] arr = {5, 1, 7, 3, 1, 6, 9, 4}; int[] arr = {16, 7, 3, 20, 17,.原创 2020-09-25 14:53:12 · 224 阅读 · 0 评论 -
Java JMM 内存模型的三个特征(happen-before)
重点学习有序性????Java JMM 内存模型是围绕并发编程中原子性、可见性、有序性三个特征来建立的 原子性:就是说一个操作不能被打断,要么执行完要么不执行,类似事务操作,Java 基本类型数据的访问大都是原子操作,long 和 double 类型是 64 位,在 32 位 JVM 中会将 64 位数据的读写操作分成两次 32 位来处理,所以 long 和 double 在 32 位 JVM 中是非原子操作,也就是说在并发访问时是线程非安全的,要想保证原子性就得对访问该数据的地方进行同步操作,譬原创 2020-09-25 09:54:20 · 293 阅读 · 0 评论 -
HashMap和ConcurrentHashMap的索引计算
HashMap计算hash:hashcode32位,然后低16位异或高16位,得到hash值 hash &(n-1)计算索引(等价于Hash % n)计算hash:return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);计算下标,其下标值为:(n-1) & hashn = (tab = resize()).length;p = tab[i = (n - 1) & hash]原创 2020-09-25 09:33:37 · 872 阅读 · 0 评论 -
concurrentHashMap详解
之前详细看过Hashmap的源码,知道线程不安全用ConcurrentHashMap处理,不过ConcurrentHashMap的源码还没细看过,学习一下:强力推荐:一文看懂ConcurrentHashMap原创 2020-09-25 09:19:16 · 2077 阅读 · 0 评论 -
HashMap为什么线程不安全?
转载 2020-09-25 08:54:13 · 159 阅读 · 0 评论 -
反射
一、案例介绍为什么需要反射在学习反射之前,先来了解正射是什么。我们平常用的最多的new方式实例化对象的方式就是一种正射的体现。假如我需要实例化一个HashMap,代码就会是这样子。Map<Integer,Integer>map=newHashMap<>();map.put(1,1);某一天发现,该段程序不适合用 HashMap 存储键值对,更倾向于用LinkedHashMap存储。重新编写代码后变成下面这个样子。Map<Integer,...转载 2020-09-11 10:26:05 · 189 阅读 · 0 评论 -
TreeMap按Key值倒序
public static void main(String[] args) { Map<Integer, Integer> treeMap = new TreeMap<>(Comparator.reverseOrder()); treeMap.put(1, 1); treeMap.put(2, 2); treeMap.forEach((k, v) ->{ System.out.p..原创 2020-09-08 09:59:29 · 1361 阅读 · 0 评论 -
双亲委派机制
public class ClassLoader { protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 1、检查该类是否已经被当前类加载器加载,若当前类加载未加载过该类,调⽤⽗类的加载类⽅法去加载该类.原创 2020-09-05 18:54:13 · 208 阅读 · 0 评论 -
集合类的equals方法(惊天大发现)
List集合类Returns the hash code value for this list. The hash code of a list* is defined to be the result of the following calculation:* <pre>{@code* int hashCode = 1;* for (E e : list)* hashCode = 31*hashCode + (e==null ? 0 : e原创 2020-09-03 10:29:42 · 857 阅读 · 0 评论 -
equals和==和hashcode
1、 ‘==’号比较对象的时候,比较的是两个对象的地址2、Object类的equals()方法对比的是两个对象的地址public boolean equals(Object obj) { return (this == obj);}3、String类的equals方法之所以能比较两个值相同,是因为重写了equals方法public boolean equals(Object anObject) { if (this == anObject) {原创 2020-08-30 15:48:55 · 270 阅读 · 0 评论 -
Stream
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。Stream 特性: 不是数据结构:它没有内部存储,它只是用操作管道从 source(数据结构、数组、generator function、IO channel原创 2020-08-28 17:31:58 · 537 阅读 · 0 评论 -
LocalDateTime
在 JDK1.8 之前,Java 处理日期、日历和时间的方式一直为社区所诟病 将 java.util.Date 设定为可变类型,以及 SimpleDateFormat 的非线程安全使其应用非常受限 因此推出了 java.time 包,该包下的所有类都是不可变类型而且线程安全关键类 Instant:瞬时时间。、 LocalDate:本地日期,不包含具体时间, 格式 yyyy-MM-dd。 LocalTime:本地时间,不包含日期. 格式 yyyy-MM-dd HH:mm:ss.原创 2020-08-28 16:56:47 · 1274 阅读 · 0 评论 -
Lambda 表达式
Lambda 表达式 (lambda expression) 是一个匿名函数,Lambda 表达式基于数学中的λ演算得名,直接对应于其中的 lambda 抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda 虽然简化了代码的编写,但同时也减少了可读性。遍历集合使用:map: Map<Integer, Integer> map = new HashMap<>(); map.put(1,1); m原创 2020-08-28 16:31:53 · 276 阅读 · 0 评论 -
GC垃圾收集器
新生代: Serial 垃圾收集器:单线程、复制算法、STW ParNew 垃圾收集器:多线程、复制算法、默认开启和CPU相同数量线程、STW Parallel Scavenge 收集器:多线程、复制算法、吞吐量(CPU 用于运行用户代码的时间/CPU 总消耗时间)、自适应调节策略、STW 老年代: Serial Old 收集器:单线程、标记整理算法 Parallel Old 收集器:多线程、标记整理算法、吞吐量优先 CMS 收集器:原创 2020-08-04 08:37:24 · 151 阅读 · 0 评论 -
线程池
在Java编码的过程中,我们经常会创建一个线程来提高程序的执行效率,虽然这样实现起来很方便,但是会有一个问题:如果并发的线程数多,并且每个线程都是执行一个时间很短的任务就结束了,这样会造成频繁的创建和销毁线程从而导致降低系统的效率。那么问题来了,有没有办法可用复用创建好的线程呢,也就是线程执行完一个任务后,不被销毁,继续执行其他的任务?在Java可以通过线程池来实现这样的效果。下面从三个方面和大家一起来探讨一下Java线程池相关的内容。Java中的ThreadPoolExecutor类 J转载 2020-08-03 10:59:08 · 433 阅读 · 0 评论 -
serialVersionUID序列化版本ID
序列化ID的作用:序列化ID决定着是否能够成功反序列化! 简单来说,java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。 在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地实体类中的serialVersionUID进行比较,如果相同则认为是一致的,便可以进行反序列化,否则就会报序列化版本不一致的异常。通俗意思就是:不加序列化ID:某个类进行序列化保存本地或者进行网络传输 反序列化时,如果修改了该类,则序列化ID..原创 2020-07-27 15:09:17 · 519 阅读 · 0 评论 -
String学习案例
字符串常量池在Java内存区域的哪个位置?在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。String str3 = "what";String str4 = str3 + " a nice day";关键:‘+’相当于new对象str3在字符串常量池中(1.7之前在方法区,1.7及之后在堆中)str4在堆中,机制就是:new String.原创 2020-07-14 09:06:51 · 242 阅读 · 0 评论 -
HTTP协议
HTTP协议1什么是HTTP协议HTTP超文本传输协议(HTTP -Hypertext transfer protocol),是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。 它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。 它是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。2 HTTP协议的发展历程超文本传输协议的前身是世外桃源(Xanadu)项目,超文本的概念是泰德˙...原创 2020-07-13 08:36:46 · 181 阅读 · 0 评论 -
HttpServletResponse响应
用户在客户端输入网址(虚拟路径)时,开始发送一个HTTP请求(请求行、请求头、请求体)至服务器。 服务器内的Tomcat引擎会解析请求的地址,去找XML文件,然后根据虚拟路径找Servlet的真实路径,真实的Servlet会将请求的信息封装成request(请求)对象,然后再创建一个response(响应)对象,(此时的response内是空的)同时创建servlet对象,并调用service方法(或doGet和doPost方法)。 这样就是把两个对象传给了服务器内的某个servlet的service.原创 2020-07-13 08:36:36 · 473 阅读 · 0 评论 -
Content-Disposition
Content-Disposition:HTTP响应头 指示回复的内容该以何种形式展示以内联的形式(即网页或者页面的一部分) 以附件的形式下载并保存到本地在HTTP场景中,第一个参数或者是inline(默认值,表示回复中的消息体会以页面的一部分或者整个页面的形式展示),或者是attachment(意味着消息体应该被下载到本地;大多数浏览器会呈现一个“保存为”的对话框,将filename的值预填为下载后的文件名,假如它存在的话):Content-Disposition: inlineCo.原创 2020-07-12 21:19:41 · 709 阅读 · 0 评论 -
post提交数据类型
常见的post提交数据类型有四种:1.第一种:application/json:这是最常见的json格式:{"input1":"xxx","input2":"ooo","remember":false}2.第二种:application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据:input1=xxx&input2=oo原创 2020-07-12 21:19:09 · 1975 阅读 · 0 评论 -
输入URL后......
输入URL后...输入URL、进行DNS域名解析、获得域名对应IP 与对应IP的服务器三次握手建立TCP连接 浏览器发送HTTP Request请求包,服务器收到请求包进行处理 服务器处理请求包,调用自身服务,返回HTTP Response响应包 客户端收到HTTP Response响应包,渲染Response包里面的Body,收到全部内容后,断开与服务端连接(四次挥手)域名解析过程1、本地查询浏览器首先检查自己浏览器缓存是否有对应的域名,有则直接使用。【查看Chrome浏览器dns缓原创 2020-07-12 17:52:55 · 160 阅读 · 0 评论 -
AIO
AIOJDK 7 引入了 Asynchronous I/O,即AIO、异步非阻塞IO IO编程的两种模式:Reactor、Proactor NIO是Reactor,当有事件触发时,服务器端得到通知,进行相应处理 AIO是Proactor模式,简化程序编写,有效的请求才启动线程,特点是先由操作系统完成后才通知服务端程序启动线程去处理,一般适用于连接数较多且连接时间长的应用BIO、NIO、AIO对比...原创 2020-07-11 14:42:47 · 199 阅读 · 0 评论 -
零拷贝
零拷贝零拷贝主要用作性能优化 java中常用的零拷贝有 mmap(内存映射) 和 sendFile传统IO读写传统IO模型:四次上下文切换、四次拷贝、内核空间经过两次mmap优化(比传统IO少了一次拷贝)内存映射 将文件映射到内核缓冲区,用户共享内核空间数据 减少一次内核空间到用户空间的拷贝次数(kernel -> user -> kernel 变成了 kernel -> kernel)sendFile优化(与传统IO相比,上下文切换-1、copy-1原创 2020-07-11 14:43:00 · 205 阅读 · 0 评论 -
NIO
简介NIO(Non-Blocking IO / New IO)同步非阻塞IO,一个线程可以处理多个请求,java.io包下 客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时就进行处理 适用于连接数多、连接时间短的架构,如聊天服务器、弹幕系统、服务器间通讯等 编程较复杂、JDK1.4开始支持 三大核心:Channel通道、Buffer缓冲区、Selector选择器 NIO是面向缓冲区的,数据读取到一个它稍后处理的缓冲区,需要时在缓冲区中前后移动,这就增加了灵活性 非原创 2020-07-11 14:42:25 · 182 阅读 · 0 评论 -
NIO网络编程应用实例-群聊系统
效果图:(两个客户端为例)上线:发送消息:离线:直接关闭客户端程序服务器端代码:package IO.NIO.groupchat;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;public class GroupChatServer { // ...原创 2020-07-11 14:42:37 · 203 阅读 · 0 评论 -
BIO
简介:BIO(Blocking IO)传统的同步阻塞IO,相关类和接口在java.io下 服务器实现模式为一个连接一个线程,即客户端有连接请求时服务端就需要启动一个线程进行处理,如果这个连接不做任何事情就会导致资源浪费 可通过线程池改善 BIO方式适用于连接数少,比较固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4之前的唯一选择流程:创建线程池(线程复用、统一管理的好处) 创建服务器端ServerSocket,监听(6666)端口 while(true)服务原创 2020-07-11 14:42:08 · 158 阅读 · 0 评论 -
常量池在哪里?
Java6和6之前,常量池是存放在方法区(永久代)中的。Java7,将常量池是存放到了堆中。Java8之后,取消了整个永久代区域,取而代之的是元空间。运行时常量池和静态常量池存放在元空间中,而字符串常量池依然存放在堆中。...原创 2020-07-09 11:27:09 · 3541 阅读 · 0 评论 -
方法区、永久代、元空间的区别
图片来自:JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别方法区:(逻辑上) 逻辑上的东西,是JVM 的规范,所有虚拟机必须遵守的。 是JVM 所有线程共享的、用于存储类的信息、常量池、方法数据、方法代码等。 永久代:(方法区的实现、JDK7及之前、主要是和元空间对比)PermGen, 就是PermGen space,全称是Permanent Generation space,是指内存的永久保存区域。PermGen ...原创 2020-07-08 16:48:32 · 8154 阅读 · 0 评论 -
Java实现小根堆和大根堆(PriorityQueue)
Java里面的PriorityQueue底层默认使用的堆,所以我们使用PriorityQueue就能实现堆的功能。1、小根堆实现package test;import java.util.Comparator;import java.util.PriorityQueue;/* add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementExceptio原创 2020-06-28 08:23:01 · 3287 阅读 · 4 评论