java
文章平均质量分 72
No_Game_No_Life_
这个作者很懒,什么都没留下…
展开
-
Java BufferedInputStream原理及设计模式分析
文章目录背景源码分析FileInputStreamBufferedInputStream装饰器模式总结背景BufferedInputStream和其他InputStream常常放在一起使用:BufferedInputStream是套在某个其他的InputStream外,起着缓存的功能,用来改善里面那个InputStream的性能,它自己不能脱离里面那个单独存在。比如FileInputStream是读取一个文件来作InputStream。所以你可以把BufferedInputStream套在File原创 2021-08-24 10:22:00 · 2245 阅读 · 4 评论 -
Java常量池详解:字符串常量池、Class常量池、运行时常量池 三者关系
文章目录引入:方法区常量池概述字符串常量池class常量池运行时常量池这里介绍 字符串常量池、class常量池 和 运行时常量池 这三个常量池的概念。引入:方法区常量池概述方法区包含运行时常量池、自动和方法数据、构造函数和普通方法的字节码内容、一些特殊方法。这里虽然没有具体说字符串常量池,但是它也是方法区的一部分。在JDK1.8中,使用元空间代替永久代来实现方法区,但是方法区并没有改变,变动的只是方法区中内容的物理存放位置。正如上面所说,类型信息(元数据信息)等其他信息被移动到了元空间中;但是运行时原创 2020-07-07 11:06:23 · 1177 阅读 · 1 评论 -
如何定位常见Java性能问题
文章目录Linux性能监测命令topvmstatpidstatJDK 监控和故障处理工具jps:查看所有 Java 进程jstat: 监视虚拟机各种运行状态信息jinfo: 实时地查看和调整虚拟机各项参数jmap:生成堆转储快照jhat: 分析 heapdump 文件jstack :生成虚拟机当前时刻的线程快照JDK 可视化分析工具JConsole:Java 监视与管理控制台Visual VM:多合一故障处理工具性能优化一向是后端服务优化的重点,但是线上性能故障问题不是经常出现,或者受限于业务产品,根本就原创 2020-06-24 15:16:17 · 818 阅读 · 0 评论 -
Java泛型类型擦除以及类型擦除带来的问题
文章目录Java泛型的实现方法:类型擦除类型擦除引起的问题及解决方法先检查,再编译自动类型转换类型擦除与多态的冲突和解决方法使用泛型程序员容易发生的错误泛型类型变量不能是基本数据类型编译时集合的instanceof泛型在静态方法和静态类中的问题Java泛型的实现方法:类型擦除Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。要理解类型擦除,首先需要去了解原始类型是什么。原始类型 就是擦除去了泛型信息,最后在字节码中的类型变量的真正原创 2020-06-22 22:11:59 · 536 阅读 · 0 评论 -
Java架构直通车——为什么线程切换会导致用户态与内核态的切换?
文章目录什么是上下文切换?上下文切换的时机?上下文切换的开销互斥锁与自旋锁为什么线程切换会导致用户态与内核台的切换?什么是上下文切换?上下文切换的时机?CPU通过分配时间片来执行任务,当一个任务的时间片用完,就会切换到另一个任务。在切换之前会保存上一个任务的状态,当下次再切换到该任务,就会加载这个状态。——任务从保存到再加载的过程就是一次上下文切换。按导致上下文切换的因素划分,可将上下文切换分为两点:自发性上下文切换非自发性上下文切换自发性上下文切换指线程由于自身因素导致的切出。通过调原创 2020-05-13 16:26:20 · 5687 阅读 · 4 评论 -
Java架构直通车——Java8 HashMap详解
文章目录1. HashMap 初始大小为何是 16?2. 懒加载3. 树化4. 扩容resize()5. get(Object key)方法之前了解过Java并发编程实战——并发容器之ConcurrentHashMap(JDK 1.8版本),其实已经对HashMap做了一个大致的了解,这里我们来解释一下HashMap一些相关的问题。Java8 ConcurrentHashMap结构基本上和Ja...原创 2020-04-20 11:58:44 · 492 阅读 · 0 评论 -
为分布式做准备吧——JVM线程资源同步及交互机制
文章目录线程资源同步机制线程交互机制Java程序采用多线程来支持大量并发。尤其是在多核或者多CPU系统中,多线程执行程序带来的最明显的问题是线程之间同步管理的资源竞争以及线程交互的问题。JVM的线程实现及其调度方式(抢占、协作)取决于操作系统,不在本文赘述。线程资源同步机制有如下程序:int i=0;public int getNextId(){ return i++;}以上程...原创 2019-07-05 17:28:28 · 686 阅读 · 0 评论 -
为分布式做准备吧——深入理解JVM
之前我们文章提到过反射,说的比较浅显,我们这里来理解JVM。类执行机制在完成将class文件信息加载到JVM并产生Class对象后,就可执行Class对象的静态方法或实例化对象进行调用了。在源码编译阶段,将源码编译为JVM字节码,JVM字节码是一种中间代码的方式,要由JVM在运行期间对其进行解释并执行。这种方式称为:字节码解释执行方式。字节码解释执行由于采用JVM字节码,也就是说JVM有一...原创 2019-07-05 15:33:14 · 825 阅读 · 0 评论 -
从头开始学Java——Java类型和类
文章目录原创 2019-10-18 14:22:19 · 594 阅读 · 0 评论 -
从头开始学Java——重新理解Java反射
文章目录什么是反射?反射的基本运用反射的主要用途:设计模式之反射与配置文件什么是反射?程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期...原创 2019-10-14 20:14:21 · 189 阅读 · 0 评论 -
从头开始学Java——JVM虚拟机八问
文章目录什么是Java虚拟机,为什么Java被称为“平台无关的编程语言”?什么是JIT?HotSpot怎么工作的?HotSpot虚拟机要使用解释器与编译器并存的架构?前置文章:为分布式做准备吧——JVM线程资源同步及交互机制前置文章2:为分布式做准备吧——深入理解JVM什么是Java虚拟机,为什么Java被称为“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程。...原创 2019-10-14 16:27:01 · 348 阅读 · 0 评论 -
Epoll模型讲解
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。不管是文件,还是套接字,还是管道,我们都可以把他们看作流。之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来...转载 2019-10-12 18:55:05 · 88 阅读 · 0 评论 -
探索Java8——Lambda方法引用
管中窥豹方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下,比起使用Lambda表达式,它们似乎更易读,感觉也更自然。inventory.sort((Apple a1,Apple a2)->a1.getWeight().compareTo(a2.getWeight()));inventory.sort(Comparator.comparing(Appl...原创 2019-09-22 14:43:21 · 102 阅读 · 0 评论 -
探索Java8——Lambda表达式
文章目录Lambda管中窥豹Lambda在哪里使用呢?函数式接口Lambda实践:环绕执行模式类型检查、类型推断以及限制Lambda管中窥豹可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。参数列表:这里使用了Comparator中compare方法的参数compare(T o1, T o2...原创 2019-09-21 18:26:32 · 170 阅读 · 0 评论 -
探索Java8——流(Stream)
文章目录什么是流流简介流与集合只能遍历一次外部迭代与内部迭代流操作中间操作终端操作使用流集合是Java中使用最多的API。要是没有集合,还能做什么呢?几乎每个Java应用程序都会制造和处理集合。集合对于很多编程任务来说都是非常基本的:它们可以让你把数据分组并加以处理。什么是流流是Java API的新成员,它允许你以声明性方式处理数据集合。就现在来说,你可以把它们看成遍历数据集的高级迭代器。...原创 2019-09-22 15:42:05 · 327 阅读 · 0 评论 -
探索Java8——重构代码与增加代码灵活性
文章目录重构代码从匿名类到Lambda表达式从Lambda表达式到方法引用的转换从命令式的数据处理切换到Stream增加代码的灵活性重构代码从匿名类到Lambda表达式回顾之前的例子:Runnable r1 = new Runnable(){ @Override public void run(){ System.out.println("Hello"); } }; ...原创 2019-09-24 11:15:59 · 332 阅读 · 0 评论 -
探索Java8——使用Lambda重构Java设计模式
文章目录策略模式模版方法模式观察者模式责任链模式工厂模式策略模式Java设计模式——策略模式。策略模式包含三部分内容:策略模式接口。策略模式接口的具体实现。用户(test)。我们假设你希望验证输入的内容是否根据标准进行了恰当的格式化(比如只包含小写字母或数字)。你可以从定义一个验证文本(以String的形式表示)的接口入手:策略模式的接口:public interface ...原创 2019-09-24 16:49:19 · 546 阅读 · 0 评论 -
探索Java8——测试Lambda表达式
文章目录测试Lambda表达式测试可见Lambda行为测试使用Lambda的方法的行为调试测试Lambda表达式通常而言,好的软件工程实践一定少不了单元测试,借此保证程序的行为与预期一致。你编写测试用例,通过这些测试用例确保你代码中的每个组成部分都实现预期的结果。比如,图形应用的一个简单的Point类,可以定义如下:public class Point{ private final i...原创 2019-09-24 18:38:00 · 933 阅读 · 1 评论 -
探索Java8——默认方法
文章目录什么是默认方法不断演进的API初始版本API第二版API什么是默认方法在传统的Java程序中,实现接口的方式是通过Implements把接口中的每一个方法提供一个实现,或者从父类继承他的实现。然而,在实际开发过程中,往往需要更新接口,向其中加入新的方法。这样的方式就会出现问题。Java8引入了一种新的方式——默认方法。这种方式支持声明方法的同时提供实现。通过两种方式可以完成上面加粗...原创 2019-09-25 15:57:39 · 171 阅读 · 0 评论 -
探索Java8——用Optional取代null
文章目录为缺失值建模采用防御式检查减少 NullPointerExceptionOptional类入门应用 Optional 的几种模式为缺失值建模假设你需要处理下面这样的嵌套对象,这是一个拥有汽车及汽车保险的客户。public class Person { private Car car; public Car getCar() { return car; } } publ...原创 2019-09-25 16:25:44 · 165 阅读 · 0 评论 -
探索Java8——CompletableFuture: 组合式异步编程
文章目录Future接口Future接口的局限性使用 CompletableFuture使用并行流对请求进行并行操作使用 CompletableFuture 发起异步请求如果你的意图是实现并发,而非并行,或者你的主要目标是在同一个CPU上执行几个松耦合的任务,充分利用CPU的核,让其足够忙碌,从而最大化程序的吞吐量,那么你其实真正想做的是避免因为等待远程服务的返回,或者对数据库的查询,而阻塞线程...原创 2019-09-25 17:34:04 · 335 阅读 · 0 评论 -
探索Java8——四大函数
文章目录FunctionFunction<T,R>接口Function的作用是:实现一个”一元函数“,即传入一个值经过函数的计算返回另一个值。在Function中,T代表输入参数,R代表返回的结果。类似于函数y=f(x)y=f(x)y=f(x)。源码解析applyR apply(T t);举个例子更好明白 :public void test(){ Funct...原创 2019-09-25 19:18:58 · 652 阅读 · 0 评论 -
swing
UI 组件简介在开始学习 Swing 之前,必须回答针对真正初学者的一个问题:什么是 UI?初学者的答案是“用户界面”。但是因为本教程的目标是要保证您不再只是个初学者,所以我们需要比这个定义更高级的定义。所以,我再次提出这个问题:什么是 UI?您可能把它定义成您按下的按钮、打字的地址栏 、打开和关闭的窗口,等等,这些都是 UI 的元素,但是除了在屏幕上看到的这些之外,还有更多都是 UI元素转载 2016-03-22 21:06:09 · 899 阅读 · 0 评论 -
探索Java8——通过行为参数化传递代码
文章目录行为参数化实用的例子行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式。一言以蔽之,它意味着拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这块代码的执行。例如,你可以将代码块作为参数传递给另一个方法,稍后再去执行它。这样,这个方法的行为就基于那块代码被参数化了。行为参数化拿上一文中的Apple举例,需要根据Apple的某...原创 2019-09-21 16:36:13 · 128 阅读 · 0 评论 -
探索Java8——Java8做出的改变
为什么要关心Java8Java8所做的改变,比Java历史上任何一次改变都深远,这也是为什么学习到SpringBoot WebFlux的时候,会反过来先把Java8给学习了。Java8提供了很多编程概念和工具。流处理**第一个编程概念是流处理。**流是一系列数据项,一次只生成一项,程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流。举个例子,在Linux系统中:c...原创 2019-09-21 15:31:12 · 519 阅读 · 0 评论 -
Java设计模式——抽象工厂模式
为什么要用抽象工厂模式工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。工厂模式和抽象工厂模式的区别是什么呢?这两种设计模式主要的区别在于产品,工厂模式是用来创建同一...原创 2019-01-04 10:23:50 · 515 阅读 · 0 评论 -
代理设计模式
1. 简介代理模式(Proxy Pattern)是GoF 23种Java常用设计模式之一。代理模式的定义:Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问)。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对转载 2016-05-10 20:11:25 · 514 阅读 · 0 评论 -
设计模式(Design Patterns)
设计模式(Design Patterns) ——可复用面向对象软件的基础设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真转载 2016-05-10 20:03:32 · 929 阅读 · 0 评论 -
工厂设计模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部转载 2016-05-10 19:59:15 · 441 阅读 · 0 评论 -
Java初学者需掌握的30个基本概念
Java初学者需掌握的30个基本概念 1.OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why.所有的程序是由一定的属性和行为对象组成的,不同的对象的访问通过函数调用来完成,对象间所有的交流都是通过方法调用,通过对封装对象数据,很大限度上提高复用率。转载 2016-03-22 21:32:25 · 565 阅读 · 0 评论 -
Java枚举类型
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在java中如何更好的使用这些“数据集”呢?因此枚举便派上了用场,以下代码详细介绍了枚举的用法。package com.ljq.test;/** * 枚举用法详解转载 2016-03-16 21:15:41 · 457 阅读 · 0 评论 -
java泛型
一. 泛型概念的提出(为什么需要泛型)?首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(String[] args) { 4 List list = new ArrayList(); 5 list.add("qqyumidi")转载 2016-03-16 22:08:48 · 455 阅读 · 0 评论 -
java Integer.valueOf()方法
Integer.valueOf()方法实现如下:[java] view plain public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i 127) { // must cache return Integ转载 2016-03-16 22:40:04 · 898 阅读 · 0 评论 -
java中将String和int转换的方法
一、将字串 String 转换成整数 intA. 有2个方法:1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]);2). int i = Integer.valueOf(my_str).intValue();PS:字串转成 Double, Float, Long转载 2016-03-21 15:36:41 · 780 阅读 · 0 评论 -
try-catch和throw,throws的区别和联系
区别一:throw 是语句抛出一个异常;throws 是方法抛出一个异常;throw语法:throw 在方法声明中,添加throws子句表示该方法将抛出异常。如果一个方法会有异常,但你并不想处理这个异常,就在方法名后面用throws,这样这个异常就会抛出,谁调用了这个方法谁就要处理这个异常,或者继续抛出.throws语法:[]([])[throws]其中:异常类可以声明多个转载 2016-03-31 19:50:34 · 662 阅读 · 0 评论 -
匿名内部类
关于匿名内部类还有如下两条规则: 1)匿名内部类不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建内部类的对象。因此不允许将匿名内部类 定义成抽象类。 2)匿名内部类不等定义构造器,因为匿名内部类没有类名,所以无法定义构造器,但匿名内部类可以定义实例初始化块, 通过实例初始化块来完成构造器需要完成的事情。匿名内部类也就是没有名字的内部类正因为没转载 2016-05-11 12:07:28 · 572 阅读 · 0 评论 -
单例设计模式
本文继续介绍23种设计模式系列之单例模式。概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 单例模式确保某个类只有一个实例,而且自行实例化并转载 2016-05-11 21:35:05 · 445 阅读 · 0 评论 -
Java中有两种实现多线程的方式的区别
看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢? 为了回答这个问题,我们可以通过编写一段代码来进行分析。我们用代码来模拟铁路售转载 2016-05-16 16:17:59 · 522 阅读 · 0 评论 -
不可不说的Java“锁”事
转载自:https://blog.csdn.net/MeituanTech/article/details/84138163前言Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通...转载 2018-11-27 17:43:23 · 387 阅读 · 0 评论 -
深入理解CAS算法原理
转载自 深入理解CAS算法原理https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247483728&idx=1&sn=3d734dc972a244891406cfbc443eabed&chksm=eb538466dc240d7033b889665b579a490266b8c8f1e7a08da35f67...转载 2018-11-27 17:19:46 · 478 阅读 · 0 评论