
JAVA
大神,快来碗里
专注于Java相关技术
展开
-
BigDecimal运算 微信红包算法
微信红包的分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?答:答案是完全随机,额度在0.01和(剩余平均值x2)之间。 例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。 当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/7*2)=17.14之间。public ...原创 2019-11-12 15:19:31 · 10910 阅读 · 0 评论 -
深入理解(5)Java内存模型(JMM)及volatile关键字
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461理解Java内存区域与Java内存模型Java内存区域Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有的用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域。方法区(Method...原创 2019-05-01 10:35:26 · 16775 阅读 · 0 评论 -
精选(28) Java 8中字符串拼接新姿势:StringJoiner
在为什么阿里巴巴不建议在for循环中使用”+”进行字符串拼接一文中,我们介绍了几种Java中字符串拼接的方式,以及优缺点。其中还有一个重要的拼接方式我没有介绍,那就是Java 8中提供的StringJoiner ,本文就来介绍一下这个字符串拼接的新兵。如果你想知道一共有多少种方法可以进行字符串拼接,教你一个简单的办法,在Intellij IDEA中,定义一个Java Bean,然后尝试使用快捷键...原创 2019-05-03 22:36:49 · 11202 阅读 · 2 评论 -
精选(29) 你真的会使用SimpleDateFormat吗?
在日常开发中,我们经常会用到时间,我们有很多办法在Java代码中获取时间。但是不同的方法获取到的时间的格式都不尽相同,这时候就需要一种格式化工具,把时间显示成我们需要的格式。最常用的方法就是使用SimpleDateFormat类。这是一个看上去功能比较简单的类,但是,一旦使用不当也有可能导致很大的问题。在阿里巴巴Java开发手册中,有如下明确规定:那么,本文就围绕SimpleDateFor...原创 2019-05-03 22:39:47 · 19753 阅读 · 0 评论 -
精选(41) Java8 - Stream API快速入门
来源:https://juejin.im/post/5ca628f96fb9a05e3c698c86ava8旨在帮助程序员写出更好的代码,其对核心类库的改进也是关键的一部分,Stream是Java8种处理集合的抽象概念,它可以指定你希望对集合的操作,但是执行操作的时间交给具体实现来决定。为什么需要Stream?Java语言中集合是使用最多的API,几乎每个Java程序都会用到集合操作...原创 2019-05-04 13:29:10 · 13064 阅读 · 0 评论 -
JAVA基础(1)并发编程
一、线程状态转换新建(New)可运行(Runnable)阻塞(Blocking)无限期等待(Waiting)限期等待(Timed Waiting)死亡(Terminated)二、使用线程实现 Runnable 接口实现 Callable 接口继承 Thread 类实现接口 VS 继承 Thread三、基础线程机制ExecutorDaemonsleep...原创 2019-04-29 21:16:20 · 10631 阅读 · 0 评论 -
Java(2) 虚拟机
文章目录一、运行时数据区域程序计数器虚拟机栈本地方法栈堆方法区运行时常量池直接内存二、垃圾收集判断一个对象是否可回收1. 引用计数2. 可达性3. 引用类型4. 方法区的回收5. finalize()垃圾收集算法1. 标记 - 清除2. 标记 - 整理3. 复制4. 分代收集垃圾收集器1. Serial 收集器2. ParNew 收集器3. Parallel Scavenge 收集器4. Seri...原创 2019-04-29 21:26:39 · 11096 阅读 · 0 评论 -
Java(3)集合
文章目录一、概览Collection1. Set2. List3. QueueMap二、容器中的设计模式迭代器模式适配器模式三、源码分析ArrayList1. 概览2. Fail-Fast3. 和 Vector 的区别4. 和 LinkedList 的区别VectorLinkedListLinkedHashMapTreeMapHashMap1. 存储结构2. 拉链法的工作原理3. 链表转红黑树4....原创 2019-04-29 21:35:04 · 10610 阅读 · 1 评论 -
深入理解(2)Java枚举类型(enum)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461理解枚举类型枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举?如何定义枚举?枚举的定义回忆...原创 2019-05-01 10:29:55 · 17048 阅读 · 0 评论 -
jvm系列(0)JVM的组成
JVM(Jav 虚拟机)算是面试必问的问题的了,而但凡问 JVM 一定会问的第一个问题就是:讲一讲 JVM 的组成?那本文就注重讲一下 JVM 的组成。首先来说 JVM 的组成分为,整体组成部分和运行时数据区组成部分,一般开发者关注的和面试官问的都是后者,但本文会详细讲解以上两个组成部分。一、JVM 整体组成JVM 整体组成可分为以下四个部分:类加载器(ClassLoader)运行时数...原创 2019-05-03 20:45:28 · 19184 阅读 · 0 评论 -
精选(3) 到底什么是跨域
什么是跨域要了解跨域,先要说说同源策略。同源策略是由 Netscape 公司提出的一个著名的安全策略,所有支持 JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。同源策略一般又分为以下两种:DOM同源策略:禁止对不同源页面DOM进行...原创 2019-05-02 21:02:08 · 16285 阅读 · 0 评论 -
java基础篇(21) Java 技术之动态代理机制
静态代理常规的代理模式有以下三个部分组成:功能接口interface IFunction { void doAThing();}功能提供者class FunctionProvider implement IFunction { public void doAThing { System.out.print("do A"); }}功能代理者...原创 2019-05-02 09:19:59 · 10734 阅读 · 1 评论 -
java基础篇(22) equals()与hashCode()方法详解
概述java.lang.Object类中有两个非常重要的方法:public boolean equals(Object obj)public int hashCode()Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。equals()方法详解equals()方法是用来判断其他的对象是否和该对象相等.equals()...原创 2019-05-02 09:25:11 · 10692 阅读 · 0 评论 -
java基础篇(23) Lambda 表达式的常见应用场景
Lambda 表达式是 Java 8 引入的新特性,结合 forEach 方法可以更方便地实现遍历。此外,它还可代替 Runnable 类,大大简化了代码的编写。下面介绍了一些常见的应用场景,在这些场景中适时地使用 Lambda 表达式要比通常的方式来得更加简洁和方便。列表迭代对一个列表的每一个元素进行操作,不使用 Lambda 表达式时如下:List<Integer> num...原创 2019-05-02 09:26:33 · 10798 阅读 · 0 评论 -
java基础篇(24) equals()方法和“==”运算符
equals()超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等。该方法的源码如下:public boolean equals(Object obj) { return (this == obj); }我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址,所以说使用Object的equals()方法是比...原创 2019-05-02 09:30:56 · 10736 阅读 · 1 评论 -
java基础篇(25) 集合入门
集合框架:Java中的集合框架大类可分为Collection和Map;两者的区别:Collection是单列集合;Map是双列集合Collection中只有Set系列要求元素唯一;Map中键需要唯一,值可以重复Collection的数据结构是针对元素的;Map的数据结构是针对键的。泛型:在说两大集合体系之前先说说泛型,因为在后面的集合中都会用到;所谓的泛型就是:类型的参数化泛型...原创 2019-05-02 09:34:55 · 10877 阅读 · 0 评论 -
java基础篇(26) transient关键字使用小记
1. transient的作用及使用方法我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,...原创 2019-05-02 15:20:15 · 10187 阅读 · 0 评论 -
Java最常见的 208 道面试题和答案(2) 容器
容器18. java 容器都有哪些?常用容器的图录:19. Collection 和 Collections 有什么区别?java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其...原创 2019-05-02 15:42:53 · 10348 阅读 · 0 评论 -
Java代码性能优化的 40+ 细节
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身。养成良好的编码习惯非常重要,能够显著地提升程序性能。在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:控制资源的使用,通过线程同步来控制资源的并发访问;控制实例的产生,以达到节约资源的目的;控制数据共享,在不建立直接...原创 2019-05-02 20:35:34 · 17057 阅读 · 0 评论 -
深入理解(3)Java类加载器(ClassLoader)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.cl...原创 2019-05-01 10:33:58 · 16800 阅读 · 0 评论 -
深入理解(4)Java类型信息(Class对象)与反射机制
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461深入理解Class对象RRTI的概念以及Class对象作用认识Class对象之前,先来了解一个概念,RTTI(Run-Time Type Identification)运行时类型识别,对于这个词一直是 C++ 中的概念,至于Java中出现RRTI的说法则是源于《Thin...原创 2019-05-01 10:34:40 · 16944 阅读 · 1 评论 -
(重点)jvm调优工具篇 - VisualVm
VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该...原创 2019-09-25 14:49:34 · 12084 阅读 · 0 评论 -
java基础篇(28) java序列化,看这篇就够了
一、序列化的含义、意义及使用场景序列化:将对象写入到IO流中反序列化:从IO流中恢复对象意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。**使用场景:所有可在网络上传输的对象都必须是可序列化的,**比如RMI(remote method invoke,即...原创 2019-06-10 09:45:02 · 10858 阅读 · 0 评论 -
jvm系列(10):教你如何成为Java的OOM Killer
前言虽然事隔半年,当时排查线上OOM事故的过程记忆犹新,每一个步骤都历历在目,感谢业务组、系统部、压测组、监控与应急部对架构组的强力支持,得以让这个Java内存问题水落石出,经过半年多的全面的应用日志 切割方式的改造,现在基本没有OOM的问题了,线上服务运行非常健康,对可用性的保障起到了很大的作用,如果你在经历OOM,读了这个文章会有很大的启发。Become OOM Killer我们都知道J...原创 2019-05-01 14:44:56 · 16536 阅读 · 0 评论 -
jvm系列(9):如何优化Java GC
GC优化是必要的吗?或者更准确地说,GC优化对Java基础服务来说是必要的吗?答案是否定的,事实上GC优化对Java基础服务来说在有些场合是可以省去的,但前提是这些正在运行的Java系统,必须包含以下参数或行为:内存大小已经通过**-Xms和-Xmx**参数指定过运行在server模式下(使用**-server**参数)系统中没有残留超时日志之类的错误日志换句话说,如果你在运行时没有...原创 2019-05-01 14:44:14 · 16601 阅读 · 1 评论 -
jvm系列(8)jvm调优-命令篇
运用jvm自带的命令可以方便的在生产监控和打印堆栈的日志信息帮忙我们来定位问题!虽然jvm调优成熟的工具已经有很多:jconsole、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等,但是在生产环境出现问题的时候,一方面工具的使用会有所限制,另一方面喜欢装X的我们,总喜欢在出现问题的时候在终端输入一些命令来解决。所有的工具几乎都是依赖于jdk的接口和底层的这些命令,研究这些命...原创 2019-05-01 14:43:07 · 17367 阅读 · 0 评论 -
jvm系列(7):jvm调优-工具篇
对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的部分运行状态,并将其存储在堆转储 (Heap Dump) 文件中,从而为我们分析和诊断问题提供了重要的依据。其中VisualVM和MAT是dump文件的分析利器。jdk自带的工具jco...原创 2019-05-01 14:41:21 · 16765 阅读 · 0 评论 -
jvm系列(6):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响。这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题。我个人特别喜欢这种实战类的内容,经原作者的授权同意,将文章分享于此。备注部分为本人添加,主要起到说明的作用。原文出处:https://segmentfault.com/a/119000000517...原创 2019-05-01 14:39:35 · 16250 阅读 · 0 评论 -
jvm系列(5)Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演。什么是 Java GCJava GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对...原创 2019-05-01 14:37:23 · 16316 阅读 · 0 评论 -
jvm系列(4)Java 8-从持久代到metaspace
Java 8介绍了一些新语言以及运行时新特点。其中一个特点便是完全移除了持久代(PermGen),自从Oracle公司发布了JDK1.7后就已经宣布了这个决定。还有比如内部字符串,从JDK1.7开始就从持久代移除了,JDK8的发布彻底废除了它。在这个部分,我们会讨论持久代的继任者:Metaspace。当执行一个Java程序并出现了“泄露”类元数据对象时我们会比较HotSpot 1.7和HotSp...原创 2019-05-01 14:35:06 · 16378 阅读 · 1 评论 -
jvm系列(3)7种JVM垃圾收集器特点,优劣势、及使用场景
1.新生代的收集器包括:SerialPraNewParallel Scavenge2.老年代的收集器包括:Serial OldParallel OldCMS3.回收整个Java堆(新生代和老年代)G1收集器新生代垃圾收集器1.Serial串行收集器-复制算法Serial收集器是新生代单线程收集器,优点是简单高效,算是最基本、发展历史最悠久的收集器。它在进行垃圾收...原创 2019-05-01 14:34:17 · 16221 阅读 · 0 评论 -
jvm系列(2)4种垃圾回收算法、垃圾回收机制与总结
垃圾回收算法1.标记清除标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。适用场合:存活对象较多的情况下比较高效适用于老年代缺点:容易产生内存碎片,再来一个比较大的对象时(典型情况:该对象的大小大于空闲表中的每一块...原创 2019-05-01 14:33:15 · 16335 阅读 · 0 评论 -
jvm系列(1)运行时数据区
1 JVM1.1 JVM运行时数据区域JDK 1.7 及以往的 JDK 版本中,Java 类信息、常量池、静态变量都存储在 Perm(永久代)里。类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm 处理掉类的元数据和静态变量。当然常量池的东西也会在 Perm 垃圾收集的时候进行处理。JDK 1.8 的对 JVM 架构的改造将类元数据放到本地内存中(元...原创 2019-05-01 14:31:58 · 16215 阅读 · 0 评论 -
深入理解(10)java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461阻塞队列概要阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列支出阻塞添加和阻塞删除方法。阻塞添加所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。...原创 2019-05-01 10:40:28 · 16572 阅读 · 0 评论 -
深入理解(9)Java基于并发AQS的(独占锁)重入锁(ReetrantLock)及其Condition实现原理
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461Lock接口前面我们详谈过解决多线程同步问题的关键字synchronized,synchronized属于隐式锁,即锁的持有与释放都是隐式的,我们无需干预,而本篇我们要讲解的是显式锁,即锁的持有和释放都必须由我们手动编写。在Java 1.5中,官方在concurrent并...原创 2019-05-01 10:39:14 · 16670 阅读 · 2 评论 -
深入理解(8)Java并发之synchronized实现原理
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据。因此为了解决这个问题,我们可能需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数...原创 2019-05-01 10:38:07 · 17099 阅读 · 0 评论 -
深入理解(7)Java无锁CAS与Unsafe类及其并发包Atomic
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461无锁的概念在谈论无锁概念时,总会关联起乐观派与悲观派,对于乐观派而言,他们认为事情总会往好的方向发展,总是认为坏的情况发生的概率特别小,可以无所顾忌地做事,但对于悲观派而已,他们总会认为发展事态如果不及时控制,以后就无法挽回了,即使无法挽回的局面几乎不可能发生。这两种派系...原创 2019-05-01 10:37:29 · 16888 阅读 · 0 评论 -
深入理解(6)Java并发AQS的共享锁的实现(基于信号量Semaphore)
原文:https://blog.youkuaiyun.com/javazejian/article/details/72772461信号量-SemaphoreSemaphore共享锁的使用信号量(Semaphore),又被称为信号灯,在多线程环境下用于协调各个线程, 以保证它们能够正确、合理的使用公共资源。信号量维护了一个许可集,我们在初始化Semaphore时需要为这个许可集传入一个数量值,该数量...原创 2019-05-01 10:36:47 · 17017 阅读 · 0 评论 -
java基础篇(20) 理解String 及 String.intern() 在实际中的应用
String的深入解析首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;-String str=”kvill”; String str=new ...原创 2019-05-02 09:16:51 · 10667 阅读 · 0 评论 -
java基础篇(19) static关键字
Static变量static关键字在类中用static声明的成员变量为静态成员变量,它为该类的公用变量,在第一次使用时初始化,对于该类的所有对象来说,static成员变量只有一份。可以通过引用或者类名访问静态成员原来一个类里面的成员变量,每new一个对象,这个对象就有一份自己的成员变量,因为这些成员变量都不是静态成员变量。对于static成员变量来说,这个成员变量只有一份,而且这一...原创 2019-05-02 09:14:16 · 10623 阅读 · 0 评论