Java
文章平均质量分 84
ashui811
这个作者很懒,什么都没留下…
展开
-
《Java 基础篇》之函数式接口
有且仅有一个抽象方法的接口。Java中的函数式编程体现就是Lambda表达式。所以函数式接口即可以适用于Lambda使用的接口。如何检测一个接口是不是函数式接口?放在接口定义的上方:如果接口是函数式接口,编译通过;注意:自定义函数式接口时,@FunctionalInterface是可选的,就算不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口。_java 函数式接口。《Java 基础篇》之函数式接口_java 函数式接口-CSDN博客。转载 2024-08-26 19:11:17 · 34 阅读 · 0 评论 -
ConcurrentHashMap(JDK8)
对比 与HashMap的区别是什么? ConcurrentHashMap是HashMap的升级版,HashMap是线程不安全的,而ConcurrentHashMap是线程安全。而其他功能和实现原理和HashMap类似。 与Hashtable的区别是什么? Hashtable也是线程安全的,但每次要锁住整个结构,并发性低。相比之下,ConcurrentHashMap获取size时才锁整个对象。...转载 2022-05-02 16:32:06 · 768 阅读 · 0 评论 -
HashMap 数据覆盖问题
阿粉今天就来谈谈这个,这个问题在 1.7 版本和 1.8 版本中都有,阿粉分别来说说 在说之前,咱们先要达成一个共识: HashMap 发生数据覆盖的问题,是在多线程环境 & 扩容下产生的,接下来咱们具体来看 jdk 1.7 void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.l...转载 2022-05-02 15:15:54 · 2144 阅读 · 0 评论 -
HashMap中扩容导致环链现象分析
目录 为什么会出现环链? 什么时候会出现环链? 出现环链的场景: 数据准备、结果预期 模拟的转移代码 多线程的场景分析 形成的根本原因 数据分析 线程一数据变化 第一次循环 第二次循环 线程二开始执行 为什么会出现环链? &...转载 2022-05-02 10:50:24 · 1187 阅读 · 0 评论 -
HashMap, LinkedHashMap 和 TreeMap的区别
原文链接:HashMap, LinkedHashMap 和 TreeMap的区别_Gogo-2020的博客-CSDN博客_treemap和hashmap的区别HashMap, LinkedHashMap 和 TreeMap的区别Java里面的HashMap, LinkedHashMap 和 TreeMap 有什么区别?我看不出以下3个key和value有什么不同的。Hashtables里面又是怎么样的呢?Map m1 = new HashMap();m1.put("map", "HashMap");m1.p转载 2022-04-30 11:09:06 · 218 阅读 · 0 评论 -
PriorityQueue用法与介绍
原文链接:PriorityQueue用法与介绍 - 简书一、PriorityQueue介绍队列是遵循先进先出(First-In-First-Out)模式的,PriorityQueue类在Java1.5中引入并作为JavaCollectionsFramework的一部分。优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。优先队列不允许空值,而且不支持non-comparable(不可比较)的对象,比如用户自定义的类...转载 2022-04-28 19:17:56 · 3742 阅读 · 0 评论 -
讲解HashMap原理和流程
1.前言HashMap是开发中最常用的键值对集合类,也是面试中经常被问及的一个知识点,也是衡量java基础是否扎实的标准之一,是每个JAVA初学者入门必须跨过的槛。所以HashMap重要性不言而喻,需要彻底掌握。 但在开始学习HashMap时,如果文章中有一大堆源码和一大段文字,会让读者阅读起来十分枯燥以及苦涩难懂。特别是不太了解HashMap的读者,但为了深入理解肯定要结合源码学习。 所以打算先介绍HashMap流程,熟悉主要操作...转载 2022-04-17 23:46:37 · 696 阅读 · 0 评论 -
面经手册 · 第8篇《LinkedList插入速度比ArrayList快?你确定吗?》
作者:小傅哥 博客:https://bugstack.cn 沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言 你以为考你个数据结构是要造火箭? 🚕汽车75马力就够奔跑了,那你怎么还想要2.0涡轮+9AT呢?大桥两边的护栏你每次走的时候都会去摸吗?那怎么没有...转载 2022-04-17 10:01:33 · 373 阅读 · 0 评论 -
ArrayList扩容原理
今天带来的下饭菜是ArrayList的扩容源码解读。 相信大家对这盘菜都不陌生,我们经常使用它来定义一个集合,无论日常开发还是自己学习使用的频率是相当的高。 而且大家也都一定知道ArrayList集合是通过数组实现的,但是在声明一组数据的时候都会选择ArrayList而不是数组,原因就是由于这组数据的元素的数量不确定,如果使用数组的话,我们还得亲自维护数组的长度,这时你一定会说TMD烦死了;但如果使用了ArrayList,维护数组长度的事情就不用我们...转载 2022-04-17 10:37:24 · 320 阅读 · 0 评论 -
Java常量池理解与总结
一.相关概念 什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 Class文件中的常量池 在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,再接着是用于存放常量的常量池,由于常量的数量是不固定的,所以常量池的入口放置一个U2类型的数据(consta转载 2022-03-13 13:57:02 · 294 阅读 · 0 评论 -
Java 基本数据类型
原文链接:Java 基本数据类型 - Sunsin - 博客园Java 基本数据类型 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 因此,通过定义不https://www.cnblogs.com/cisum/p/8006239.html变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据转载 2022-03-03 17:19:54 · 97 阅读 · 0 评论 -
jvm类加载器的父类委托机制
1. 两种类型的类加载器:(1) JVM自带的加载器- 根类加载器(Bootstrap) 它负责加载虚拟机的核心类库,如java.lang.*等使用C++编写,它的实现依赖于底层操作系统,它并没有继承java.lang.ClassLoader类- 扩展类加载器(Extension) 它的父加载器为根类加载器,它从jre\lib\ext子目录下加载类库,它使用Java代码实现,是java.lang.ClassLoader类的子类。- 系统类加载器(System - 应用类加载器) 它的转载 2022-03-02 22:40:48 · 505 阅读 · 0 评论 -
Java中数组的定义与使用(三)
数组排序在很多的面试题上都会出现数组排序的操作形式。但是这个时候你千万别写上:java.util.Arrays.sort(数组)。而这种排序都是以升序为主。基础的排序操作:范例: 冒泡排序public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {9, 3, 1, 5, 4, 2, 7, 8, 6, 0}; sort(data); ...转载 2022-01-17 15:36:53 · 180 阅读 · 0 评论 -
Java中数组的定义与使用(二)
数组与方法调用数组是一个引用数据类型,那么所有的引用数据类型都可以为其设置多个栈内存指向。所以在进行数组操作的时候,也可以将其通过方法进行处理。范例: 方法接受数组public class ArrayDemo { public static void main(String args[]) { int data[] = new int[] {1, 2, 3}; printArray(data); } //定义一个专门进行数组...转载 2022-01-17 12:55:55 · 108 阅读 · 0 评论 -
Java中数组的定义与使用(一)
数组的基本概念如果说现在要求你定义100个整型变量,那么如果按照之前的做法,可能现在定义的的结构如下:int i1, i2, i3, ... i100;1但是这个时候如果按照此类方式定义就会非常麻烦,因为这些变量彼此之间没有任何的关联,也就是说如果现在突然再有一个要求,要求你输出这100个变量的内容,意味着你要编写System.out.println()语句100次。其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量可以按照统一的方式进行操作。数组本身属于引用数据类型,那么既然是引用数转载 2022-01-17 11:10:56 · 118 阅读 · 0 评论 -
Bean映射工具之Apache BeanUtils VS Spring BeanUtils
原文链接:Bean映射工具之Apache BeanUtils VS Spring BeanUtils - 陈晨辰 - 博客园背景 在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复制,从而基于源对象的属性信息进行后续操作,而不改变源对象的属性信息,比如DTO数据传输对象和数据对象DO,我们需要将DO对象进https://www.cnblogs.com/chen-chen-chen/p/12050985.html背景在我们实际项目开发过程中,我们经常需要将不同的两个对象实例进行属性复转载 2022-01-06 10:38:00 · 704 阅读 · 0 评论 -
Java中的注解以及自定义注解
1、Annotation(注解) 概述(1)、注解起到标识做用,比如Junit的@Test注解。Junit会在运行时检查方法上是否存在此注解,如果存在,就通过 反射 来运行你的方法。注意标红的反射两个字,反射在注解里相当重要,写完你的自定义注解类后没啥用,必须要用反射才能让它动起来!所以需要对反射有了解,感兴趣的小可爱可以看下这篇:用最直接的大白话来聊一聊Java中的反射机制(2)、从 JDK 5.0 开始,Java 增加了对 Annotation(注解)的支持。(3)、 注解其实就是代码里的转载 2022-01-04 15:46:30 · 769 阅读 · 0 评论 -
Java反射——内省(Introspector)以及BeanUtils内省框架
讨论内省的前提是需要了解Java中的反射,如果需要了解反射的话,可以点击下方的文章Java中的反射机制介绍为什么要学内省?开发框架时,经常需要使用java对象的属性来封装程序的数据(其实就是操作对象的set/get方法来设值或取值),每次都使用反射来完成此类操作过于麻烦,所以JDK里提供了一套API,专门用于操作java对象的属性(set/get方法)。既然内省是专门用于操作java对象属性的,那首先得搞懂什么是对象的属性1、什么是java对象的属性呢?说到属性,大家觉得很熟悉,属性不就是类转载 2021-12-29 11:50:49 · 169 阅读 · 0 评论 -
Java反射:用最直接的大白话来聊一聊Java中的反射机制
用最通俗易懂的话来说一说Java中的反射机制思考:在讲反射之前,先思考一个问题,java中如何创建一个对象,有哪几种方式?Java中创建对象大概有这几种方式:1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式2、使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去3、使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象上边是Java中常见的创建对象的三种方式,其实除了上边的三种转载 2021-12-28 23:10:12 · 153 阅读 · 0 评论 -
深入理解Java中异常体系
任何程序都追求正确有效的运行,除了保证我们代码尽可能的少出错之外,我们还要考虑如何有效的处理异常,一个良好的异常框架对于系统来说是至关重要的。最近在给公司写采集框架的时候系统的了解一边,收获颇多,特此记录相关的理论。1 .异常体系简介:异常是指由于各种不期而至的情况,导致程序中断运行的一种指令流,如:文件找不到、非法参数、网络超时等。为了保证正序正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理。异常也是一种对象,java当中定义了许多异常类,并且定义了基类java.lang.Th转载 2021-12-27 22:49:05 · 194 阅读 · 0 评论 -
强大的Java Json工具类
Json解析所需jar包:http://download.csdn.net/detail/u014676619/9238793工具类:import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.URL;import java.util.ArrayList;import java.util.Collection;import java.u转载 2021-12-27 16:21:12 · 254 阅读 · 0 评论 -
java之面向对象详解
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、对象与内存分析5、封装性6、构造方法7、this关键字8、值传递与引用传递?9、对象的一对一关系10、static关键字11、main方法分析12、继承13、对象的初始化14、方法的重写15、super关键字16、final关键字17、抽象类18、接口19、多态性20、instanceof关键字21、内部类###############转载 2021-12-25 15:29:43 · 472 阅读 · 1 评论 -
Java代码编译和执行的整个过程
原文链接:Java代码编译和执行的整个过程 - 简书一、简述 Java代码编译和执行的整个过程包含了三个重要的机制:①Java源码编译机制;②类加载机制;③类执行机制 二、Java源码编译机制 Java代码编译是由Javac编...https://www.jianshu.com/p/056e36d6d6d6一、简述Java代码编译和执行的整个过程包含了三个重要的机制:①Java源码编译机制;②类加载机制;③类执行机制二、Java源码编译机制Java代码编译是由Javac编译器来完成,流程如图转载 2021-12-25 15:23:08 · 373 阅读 · 0 评论 -
ThreadLocal与Synchronized的使用场景
ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。ThreadLocal不能使用原子类型,只能使用Object类型。ThreadLocal的使用比Synchronized要简单得多。ThreadL...转载 2018-02-28 11:07:32 · 956 阅读 · 0 评论 -
synchronized的几种加锁方式
1、修饰普通方法(锁住的是当前实例对象)同一个实例调用会阻塞 不同实例调用不会阻塞 public class SynchronizedTest { //锁住了本类的实例对象 public synchronized void test1() { try { logger.info(Thread.currentThread().getName() + " test1 进入了同步方法"); Thread.sleep(5000); lo.转载 2020-08-12 12:56:52 · 2375 阅读 · 0 评论 -
Java IO 和 NIO的区别
主要区别IO NIO 面向字节流 面向缓冲区 阻塞 基于Selector的非阻塞 Java IO 和 NIO的主要区别体现在以上两个方面,以下详细说明这些区别的具体含义。面向流和面向缓冲区这个概念和编程方法中的面向过程、面向对象类似。Java IO 是面向流的而Java NIO是面向缓冲区的。在Java IO中读取数据和写入数据是面向流(Stream)...转载 2020-04-07 21:54:35 · 265 阅读 · 0 评论 -
常用的Java工具类——十六种
在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类。以下工具类、方法按使用流行度排名,参考数据来源于Github上随机选取的5万个开源项目源码。一. org.apache.commons.io.IOUtilscloseQuietly:关闭一个IO流、socket、或者selector且不抛出异常,通常放在finally块toString:转...转载 2020-04-07 15:53:28 · 856 阅读 · 0 评论 -
装饰模式、代理模式、适配器模式
简介装饰模式、代理模式、适配器模式个人感觉非常相似,三者的类图也差不多,不好理解。区别:装饰模式:原有功能不能满足现有需求,按照开闭原则的思路,我们通过扩展接口来增强功能。可以装饰多层代理模式:通过代理对象来控制访问另一个对象(被代理对象)的方法,不对该方法进行直接操作。适配器模式:解决接口不匹配的问题。下面通过简单的例子具体说明。(1)装饰模式场景描述如下:...转载 2020-04-02 20:35:09 · 160 阅读 · 0 评论 -
继承和组合的区别
什么是继承继承是面向对象三大基本特征之一(继承,封装,多态),继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。在java中通过关键字extends实现继承,java中所有类默认都是java.lang.Object的子类。继承强调的是is-a关系。直接通过例子来了解继承:/*** 动物*/public ...转载 2020-04-02 19:29:12 · 324 阅读 · 0 评论 -
生产者消费者的五种实现
生产者消费者问题:生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者消费者模式的优点:解耦 支持并发 支持忙闲不均解决方法可分为两类:用信号量和锁机制实现生产者和消费者之间的同步wait() / notify()方法await() / signal()方法 BlockingQueue阻塞队列方法 Semaphore方法在生产者和消费者之间建立...转载 2020-04-02 16:43:17 · 369 阅读 · 0 评论 -
String,StringBuffer与StringBuilder的区别
一、Java String 类——String字符串常量字符串广泛应用在Java 编程中,在 Java 中字符串属于对象,Java 提供了String 类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:我们可...转载 2020-04-01 08:57:02 · 128 阅读 · 0 评论 -
Java8中Stream的map与flatmap区别
先来个总结:map是对一级元素进行操作,flatmap是对二级元素操作。map自动返回stream对象,flatmap处理后的元素依然要是stream对象(可以用stream.of,Arrays.stream将元素转为stream对象)。打个比方,有一个二维数组a[2][3],通过map每次操作的都是一个一维数组,如a[0]和a[1],执行完后就各自返回一个处理后的一维数组,这样a[2...转载 2020-03-31 22:48:47 · 2314 阅读 · 0 评论 -
泛型通配符详解
为什么要用通配符呢?在java中,数组是可以协变的,比如dog extends Animal,那么Animal[] 与dog[]是兼容的。而集合是不能协变的,也就是说List<Animal>不是List<dog>的父类,这时候就可以用到通配符了。一、基本概念:在学习Java泛型的过程中, 通配符是较难理解的一部分. 主要有以下三类:1. 无边界的通配符(Unb...转载 2020-03-28 10:00:48 · 5286 阅读 · 1 评论 -
条件变量的虚假唤醒(spurious wakeups)问题
引言条件变量是我们常用的同步原语之一,它的正确使用方式一般如下图:在wait端,我们必须把判断布尔条件和wait()放到while循环中,而不能用if语句,原因是可能会引起虚假唤醒。那么,究竟什么是虚假唤醒,导致虚假唤醒的原因又是什么呢?什么是虚假唤醒?举个例子,我们现在有一个生产者-消费者队列和三个线程。1)1号线程从队列中获取了一个元素,此时队列变为空。2)2...转载 2020-03-18 19:38:10 · 890 阅读 · 2 评论 -
Synchronized和Lock的区别
Synchronized和Lock的区别:Synchronized编码更简单,锁机制由JVM维护,在竞争不激烈的情况下性能更好。Lock功能更强大更灵活,竞争激烈时性能较好。性能不一样:资源竞争激励的情况下,lock性能会比synchronize好,竞争不激励的情况下,synchronize比lock性能好,synchronize会根据锁的竞争情况,从偏向锁-->轻量级锁-->重量...转载 2020-03-18 11:08:49 · 1321 阅读 · 1 评论 -
关于多线程在多核cpu上执行效率的问题
前言:博主最近在比较python和go语言写的web服务器的执行效率问题,在看了google搜索结果后,产生了疑问1.为什么python的异步执行框架tornado效率可以和go语言媲美?2.为什么随着线程的增加,并发数的增长呈现逐步缓慢的趋势?带着这些问题,博主探究了下原因,如果有错误,欢迎大家指出。注意:为简化推理过程和理解,以下只考虑执行任务的线程,系统中其他所有(包括...转载 2020-03-16 22:26:41 · 3933 阅读 · 0 评论 -
Java中单例设计模式,饿汉式和懒汉式
Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显...转载 2020-03-12 22:17:25 · 301 阅读 · 0 评论 -
JVM方法调用栈
JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该堆栈保存了每一个方法的本地信息(包括局部变量区:存放局部变量和方法参数,操作数栈区:是线程的工作区,存放运算过程中生成的临时数据,栈数据区:为线程执行指令提供相关信息,包括如何定位堆区和方法区的数据以及如何正常退出和异常中断方法)。每个线程都有一个独立的方法调用栈,当一个新方法被调用时JVM把描述该方法的栈结构置入栈顶。当一个方法正常执行完...原创 2020-03-09 19:55:50 · 417 阅读 · 0 评论 -
数组和集合
数组:可以存放多个同一类型的数据,如果存放的是对象类型则存放的是对象的引用,需要实例化。缺点是数组大小在定义时必须先指定并且无法改变集合:不能存放基本类型数据,只能存放引用类型对象,包括List、Set、MapList:以线性方式存储元素,允许存放重复对象,包括ArrayList、LinkedListArrayList:代表长度可变的数组,允许对元素进行随机快速访问但是插入和删原创 2016-05-01 23:05:26 · 447 阅读 · 0 评论 -
Java 复制大文件方式(nio2 FileChannel 拷贝文件能力测试)
原文链接:http://www.cnblogs.com/interdrp/p/3785164.html目前为止,我们已经学习了很多 Java 拷贝文件的方式,除了 FileChannel 提供的方法外,还包括使用 Files.copy() 或使用字节数组的缓冲/非缓冲流。那个才是最好的选择呢?这个问题很难回答,因为答案基于很多因素。本文将目光集中到一个因素,那就是速度,因为拷贝任务 越转载 2016-06-08 22:57:19 · 449 阅读 · 0 评论