Java
文章平均质量分 75
Rookie2Master
CSDN is like shit and is no longer used
展开
-
Stream流式惰性计算
要求是编写一个能输出斐波拉契数列(Fibonacci)的LongStream:因为Java的范型不支持基本类型,所以我们无法用Stream<long>这样的类型,会发生编译错误。为了保存long,只能使用Stream<Long>,但这样会产生频繁的装箱、拆箱操作。为了提高效率,Java标准库提供了IntStream、LongStream和DoubleStream这三种使用基本类型的Stream,它们的使用方法和范型Stream没有大的区别public class Main {原创 2021-07-26 23:35:27 · 673 阅读 · 1 评论 -
Guava EventBus 观察者(发布/订阅)模式
前言EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。观察者模式在我们日常开发中使用非常广泛,例如在订单系统中,订单状态或者物流信息的变更会向用户发送APP推送、短信、通知卖家、买家等等;审批系统中,审批单的流程流转会通知发起审批用户、审批的领导等等。Observer模式也是 JDK 中自带就支持的,其在 1.0 版本就已经存在 Observer,不过随着 Java 版本的飞速升级,其使用方式一直没有变化,许多程序库提供了更加简单的实现,例如 Guava Ev转载 2021-07-14 15:10:43 · 354 阅读 · 0 评论 -
Servlet是什么?
我们平时说的Servlet看上去很神秘,其实本质很简单,先说结论: Servlet就是一个Java接口interface而已。那servlet是干嘛的?很简单,接口的作用是什么?规范呗!servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:你初始原创 2021-06-29 14:00:56 · 183 阅读 · 0 评论 -
ThreadLocal原理及使用的时候有什么需要注意的
ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量(反射可以)。ThreadLocalMap内部是一个Entry数组,Entry继承自WeakReference,Entry内部的key就是ThreadLocal本身,value是ThreadLo原创 2020-12-15 19:58:00 · 1155 阅读 · 2 评论 -
AQS详解- 以ReentrantLock+Condition 为例
AQS详解(ReentrantLock+Condition)本文转载自 微信公众号: 鄙人薛某 的原创文章,其中加了一些个人的理解。前言如果想深入研究Java并发的话,那么AQS一定是绕不开的一块知识点,Java并发包很多的同步工具类底层都是基于AQS来实现的,比如我们工作中经常用的Lock工具ReentrantLock、栅栏CountDownLatch、信号量Semaphore等,而且关于AQS的知识点也是面试中经常考察的内容,所以,无论是为了更好的使用还是为了应付面试,深入学习AQS都很有必要。转载 2020-12-12 19:55:03 · 476 阅读 · 0 评论 -
Java写一个简单的死锁程序
Java死锁程序public class DeadLock { public static void main(String[] args) { new Thread(() -> { try { System.out.println("thread1 开始运行"); synchronized (DeadLock.class) { System.out原创 2020-12-11 11:11:03 · 501 阅读 · 0 评论 -
Java堆分区及其垃圾回收
java堆分区原创 2020-12-10 20:33:23 · 266 阅读 · 0 评论 -
为什么enum枚举实现单例模式天然线程安全?
定义枚举时使用 enum 和 class 一样, 是 Java 中的一个关键字。 就像 class 对应用一个 Class 类一样, enum 也对应有一个 Enum 类。通过将定义好的枚举反编译, 我们就能发现, 其实枚举在经过 javac 的编译之后, 会被转换成形如 public final class T extends Enum 的定义。而且, 枚举中的各个枚举项通过 static 来定义的。 如:public enum T { SPRING,SUMMER,AUTUMN,WINTER;}原创 2020-12-08 15:09:06 · 1613 阅读 · 2 评论 -
为什么JVM使用双亲委派?
1.为什么要有双亲委派?首先明确一点:jvm如何认定两个对象同属于一个类型,必须同时满足下面两个条件:都是用同名的类完成实例化的。两个实例各自对应的同名的类的加载器必须是同一个。比如两个相同名字的类,一个是用系统加载器加载的,一个扩展类加载器加载的,两个类生成的对象将被jvm认定为不同类型的对象。所以,为了系统类的安全,类似“ java.lang.Object”这种核心类,jvm需要保证他们生成的对象都会被认定为同一种类型。即“通过代理模式,对于 Java 核心库的类的加载工作由启动类加载器(b原创 2020-12-06 11:46:50 · 1623 阅读 · 5 评论 -
Java基础补充1
原创 2020-11-09 20:40:53 · 100 阅读 · 0 评论 -
为什么重写equals一定要重写hashcode?
hashCode()与 equals()hashCode()object.hashCode规定:如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。原创 2020-11-09 20:27:10 · 168 阅读 · 0 评论 -
CAS、悲观锁与乐观锁
1.何谓悲观锁与乐观锁乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。1.1 悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁( 共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操转载 2020-11-08 21:47:02 · 247 阅读 · 0 评论 -
JVM内存管理(JMM)
JVM 内存结构Java 虚拟机的内存空间分为 5 个部分:程序计数器Java 虚拟机栈本地方法栈堆方法区JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。程序计数器(PC 寄存器)程序计数器的定义程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此原创 2020-11-08 19:34:37 · 191 阅读 · 0 评论 -
JVM垃圾回收总结
JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)原创 2020-09-15 19:33:45 · 105 阅读 · 0 评论 -
为什么要有Java内存模型(JMM)?
Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。而JMM就作用于工作内存和主存之间数据同步过程。他规定了如何做数据同步以及什么时候做数据同步。所以,总结下:JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据转载 2020-11-07 16:39:14 · 1212 阅读 · 0 评论 -
java线程可以在运行在多个cpu核上吗?
我是一直都以为这个问题的答案是肯定的,也就是说可以运行在多核上。但是有一天见到这样的一个理论,我就顿时毁三观了。JVM在操作系统中是作为一个进程的,java所有的线程都运行自这个JVM进程中,所以说java线程某个时间只可能运行在一个核上。这个说法对我的打击太大了,我不能接受。于是就开始多方求证。网上搜索 和朋友一起讨论,最终证实了java线程是可以运行在多核上的,为什么呢?下面一句话将惊醒梦中人:现代os都将线程作为最小调度单位,进程作为资源分配的最小单位。 在windows中进程是不活动的转载 2020-11-05 17:12:23 · 1740 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(8)动态代理
Java语言基础(8)1. 动态代理动态代理,看文章最后链接文档剩下的章节都是类似工具的内容,用到的时候 可以再着重看!到此,Java语言基础 系列结束!!!原创 2020-11-04 21:38:29 · 118 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(7)枚举类型和泛型
Java语言基础(7)1. 枚举从Java1.5开始,枚举类型( enum type) 是指由一组固定的常量组成合法的类型。 Java 中由关键字enum (小写!)来定义一个枚举类型。 下面就是 java 枚举类型的定义。枚举可以在编译期间实现自动的类型检查。public enum Season { SPRING, SUMMER, AUTUMN, WINTER;}enum既然是类,就可以定义属性和方法,如下:RED,GREEN,BALNK,YELLOW 都是enum类型的 实例对象。下原创 2020-11-04 20:09:35 · 239 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(6)反射与Spring IoC
Java语言基础(6)反射反射机制指的是程序在运行时能够获取自身的信息。在 java 中, 只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法.作用:在运行时判断任意一个对象所属的类。在运行时判断任意一个类所具有的成员变量和方法。在运行时任意调用一个对象的方法。在运行时构造任意一个类的对象。1. Class类Java.lang.Class 是一个比较特殊的类, 它用于封装被装入到 JVM 中的类( 包括类和接口) 的信息。 当一个类或接口被装入的 JVM 时便会产生一原创 2020-11-03 21:32:17 · 167 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(5)I/O
Java语言基础(5)I/O流1. Linux5种IO模型1.1 阻塞式IO模型当用户线程发出 IO 请求之后, 内核会去查看数据是否就绪, 如果没有就绪就会等待数据就绪, 而用户线程就会处于阻塞状态, 用户线程交出 CPU。 当数据就绪之后, 内核会将数据拷贝到用户线程, 并返回结果给用户线程, 用户线程才解除 block 状态。典型的阻塞 IO 模型的例子为:data = socket.read();如果数据没有就绪, 就会一直阻塞在 read 方法。1.2 非阻塞式IO模型当用户原创 2020-11-03 21:10:32 · 126 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(4)集合类,stream
Java语言基础(4)1. 集合类1.1 Set在 Java 的 Set 体系中, 根据实现方式不同主要分为两大类。 HashSet 和 TreeSet.TreeSet 是二叉树实现的,Treeset 中的数据是自动排好序的, 不允许放入 null 值HashSet 是哈希表实现的,HashSet 中的数据是无序的,可以放入 null,但只能放入一个 null.HashSet 中, 基本的操作都是有 HashMap 底层实现的, 因为 HashSet 底层是用HashMap 存储数据的。当原创 2020-11-03 20:52:01 · 315 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(3)自动拆装箱,包装类缓存,异常
Java语言基础(3)1. 自动拆/装箱1.1 基本数据类型基本类型, 或者叫做内置类型, 是 Java 中不同于类(Class)的特殊类型。我们都知道在 Java 语言中, new 一个对象是存储在堆里的, 我们通过栈中的引用来使用这些对象; 所以, 对象本身来说是比较消耗资源的。对于经常用到的类型, 如 int 等, 如果我们每次使用这种变量的时候都需要 new 一个Java 对象的话, 就会比较笨重。所以,基本数据类型变量不需要使用 new 创建, 他们不会在堆上创建, 而是直接在栈内存中原创 2020-11-02 21:21:16 · 172 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(2)基本数据类型,关键字,String
Java语言基础(1)1. 基本数据类型1.1. 8种基本数据类型Java 中有 8 种基本数据类型分为三大类。字符型char布尔型boolean数值型1.整型: byte、 short、 int、 long2.浮点型: float、 double注意:String 、 Enum这些都不是基本数据类型, 是引用类型。1.2 浮点型在计算机科学中, 浮点是一种对于实数的近似值数值表现法, 由一个有效数字( 即尾数)加上幂数来表示, 通常是乘以某个基数的整数次指数得到。 以这种表示原创 2020-11-02 20:31:03 · 207 阅读 · 0 评论 -
阿里巴巴Java成神之路-笔记(1)Java 面向对象基础
Java 面向对象基础Java三大特性–继承封装多态1.关于多态的进一步理解现在流行一种说法, 包括维基百科也说明, 多态还分为动态多态****和静态多态。通常的那种 父类引用指向子类对象 这种动态绑定认为是动态多态, 因为只有在运行期才能知道真正调用的是哪个类的方法。还有一种静态多态, 一般认为 Java 中的方法重载是一种静态多态, 因为他需要在编译期决定具体调用哪个方法。关于这个动态静态的说法, 我更偏向于重载和多态其实是无关的。但是也要看情况, 普通场合, 我会认为只有方法的重写算是多原创 2020-11-01 21:17:12 · 306 阅读 · 0 评论 -
深入理解JVM:Java类加载机制
Java类加载机制类加载器的任务是根据类的全限定名来读取此类的二进制字节流(字节码文件)到 JVM 中,然后转换成一个与目标类对象的java.lang.Class 对象的实例。类加载的时机隐式加载 new 创建类的实例,显式加载:loaderClass,forName等访问类的静态变量,或者为静态变量赋值调用类的静态方法使用反射方式创建某个类或者接口对象的Class对象。初始化某个类的子类直接使用java.exe命令来运行某个主类类加载的过程我们编写的java文件都是保存着业务逻辑转载 2020-10-27 19:20:44 · 118 阅读 · 0 评论 -
Java类的初始化顺序
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。测试代码:package javaThreadLearning;class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; protected int i = 1; protected int j = 8; // 变量转载 2020-10-27 11:42:16 · 301 阅读 · 0 评论