Java
universe_ant
这个作者很懒,什么都没留下…
展开
-
Java log.error("Get exception: {}", e)看不到异常栈
一、现象实时作业中使用:try{...} catch(RuntimeException e) { log.error("Get exception: {}", e);}日志只输出:Get exception: java.lang.NullPointerException并没有对应的异常栈信息。二、原因HotSpot JVM有个优化:有些特定的隐式异常类型(N...原创 2020-01-02 15:35:17 · 2287 阅读 · 0 评论 -
Java Object hashCode()的小点
Tip1:官方文档中的一句话:“Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no inform...原创 2019-12-24 11:07:33 · 352 阅读 · 0 评论 -
内存分配和回收策略简述
对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC原创 2017-04-22 18:04:15 · 725 阅读 · 0 评论 -
【简要总结】Java1.8下的HashMap
HashMap采用的是数组+链表+红黑树的形式。数组是可以扩容的,链表是可以转化为红黑树的。用户可以设置的参数:初始总容量默认是16,默认的加载因子是0.75容量*加载因子=阈值什么时候扩容?(1)当前容量超过阈值(2)当链表中元素个数超过默认设定(8个),当数组的大小还未超过64的时候,此时进行数组的扩容,如果超过则将链表转化成红黑树。什么时候链表转化为红原创 2017-05-07 10:38:35 · 318 阅读 · 0 评论 -
Java1.7下的ConcurrentHashMap【简要总结】
ConcurrentHashMap是线程安全的,通过分段锁的方式提高了并发度。分段是一开始就确定了,后期不能再进行扩容。其中段Segment继承了重入锁ReentrantLock,有了锁的功能,同时含有类似HashMap的数组加链表的结构。虽然Segment的个数是不能扩容的,但是单个Segment里面的数组是可以扩容的。ConcurrentHashMap有3个参数:i原创 2017-05-07 11:50:46 · 406 阅读 · 0 评论 -
Java1.8下的ConcurrentHashMap【简要总结】
1.8的ConcurrentHashMap摒弃了1.7的Segment设计,而是在1.8HashMap的基础上实现了线程安全的版本,即也是采用的数组+链表+红黑树的形式。数组可以扩容,链表可以转化为红黑树。有一个重要的参数sizeCtl,代表数组的大小(但是还有其他权值及其含义,后面详细讲)用户可以设置一个初始容量initialCapacity给ConcurrentHashMa原创 2017-05-07 16:28:46 · 1470 阅读 · 0 评论 -
会话Session的持久化处理
问题:什么是持久化?让我们用一张图片来进行说明吧。Session的持久化:Session的持久化就是将HttpSession对象从内存中转移到文件系统或数据库中,这样做的好处是:减少系统资源的占用,如果Servlet容器突然关闭或重启,或Web应用重启,这些持久化了的HttpSession对象可以重新加载进来,对于客户端,还是使用同一个Session。Session的持久化是由原创 2017-05-17 18:10:48 · 1098 阅读 · 0 评论 -
数组中的逆序对数
逆序对定义:在一个数组a[]中,i和j分别为数组的下标,其中i a[j],则a[i]和a[j]是一对逆序对。思路:利用归并排序的思想,先求前面一半数组的逆序数,再求后面一半数组的逆序数,然后求前面一半数组比后面一半数组中大的数的个数(也就是逆序数),这三个过程加起来就是整体的逆序数目了。代码:public class Solution { public int inv原创 2017-06-09 11:09:37 · 461 阅读 · 0 评论 -
求二叉树的节点个数、叶子节点个数、第k层的节点个数
class BinaryTreeNode { int val; BinaryTreeNode left = null; BinaryTreeNode right = null;}public class NodesStatistics { /** * 求二叉树的节点个数 * (1)如果二叉树为空,节点个数为0; * (2)如果二叉树不为空,二叉树节点个数 = 左子节点个数原创 2017-06-10 16:54:54 · 4680 阅读 · 2 评论 -
字符串转换为数字-Java版
package po.ag;/** * 1.首先判断字符串是否为空,若为空,返回0 * 2.考虑前面的是否是空格,使用trim()去掉,然后判断长度是否为0,若是,返回0 * 3.判断第一个字符是不是+或者-,设置变量sign记录 * 4.循环取得字符串的数字,考虑字符串中有非数字,遇到就退出,保留前面的数字 * 5.考虑溢出的情况,溢出返回Integer的最大值或最小值 */pu原创 2017-06-01 02:24:27 · 4224 阅读 · 0 评论 -
Java实现的生产者和消费者
工厂类:import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Depot { private int depotSize; // 仓库大小 pri原创 2017-08-13 22:59:07 · 394 阅读 · 0 评论 -
给定一个有环链表,实现一个算法返回环路的开头结点
检测链表是否存在环路有一种简单的做法叫FastRunner/SlowRunner法。FastRunner一次移动两步,而SlowRunner一次移动一步。这就好比两辆赛车绕着同一条赛道以不同的速度前进,最终必然会碰到一起。聪明的读者可能会问:FastRunner会不会刚好“越过”SlowRunner,而不发生碰撞呢?绝无可能。假设FastRunner真的越过了SlowRunner,且Slo转载 2017-04-17 20:25:39 · 1237 阅读 · 0 评论 -
大数相加-Java版
package po.ag;public class BigIntegerAdd { /** * 超大数相加 * @param num1 * @param num2 * @return */ public static String bigNumerSum(String num1, String num2) { char sign = '+'; char sig原创 2017-06-01 02:14:51 · 546 阅读 · 0 评论 -
求两个排序数组的中位数
题目:给定两个排序数组,求两个排序数组的中位数,要求时间复杂度为O(log(m+n))。举例:Example 1:nums1 = [1, 3]nums2 = [2]The median is 2.0Example 2:nums1 = [1, 2]nums2 = [3, 4]The median is (2 + 3)/2 = 2.5转载 2017-06-09 09:52:57 · 646 阅读 · 0 评论 -
归并排序的Java实现
题目:对于一个int数组,请编写一个归并排序算法,对数组元素排序。给定一个int数组A及数组的大小n,请返回排序后的数组。算法思路:先用递归方法,默认排序方法为2路归并排序。看下图应该能立即理解:先使每个子序列有序,再将两个已经排序的序列合并成一个序列的操作。若将两个已经排序的有序表合并成一个有序表,称为二路归并。public cla原创 2017-06-09 11:39:56 · 332 阅读 · 0 评论 -
Java动态生成类以及动态添加属性
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件。那么技术实现支持:使用CGLib代理。具体的实现步骤:1.配置Maven文件:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XML转载 2017-11-18 16:14:20 · 29932 阅读 · 1 评论 -
乐观锁与悲观锁
乐观锁与悲观锁乐观锁乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。CAS便是乐观锁技术,当多个线程尝试使用C转载 2017-03-28 18:08:49 · 315 阅读 · 0 评论 -
Java枚举
如果一个类的对象有限而且固定的,比如季节类,它只有4个对象,像这种实例有限而且固定的类,我们在Java中称为枚举类。枚举类是Java 5新增的,使用enum关键字来定义枚举类,枚举类是一种特殊的类,它一样可以有自己的Field、方法,可以实现一个或者多个接口,也可以定义自己的构造器。在一个Java源文件中最多只能定义一个public访问权限的枚举类。枚举类与普通类的区别有:1、枚举类可以实转载 2017-03-07 10:16:03 · 302 阅读 · 0 评论 -
Java 8 Lambda
为什么需要Lambda表达式不要纠结什么是Lambda表达式,什么是函数式编程,先来看一下Java8新的语法特性带来的便利之处,相信你会过目不忘的。在有Lambda表达式之前,要新建一个线程,需要这样写:package com.lambdatest;/** * Created by root on 3/6/17. */public class Main { publi转载 2017-03-06 22:21:41 · 298 阅读 · 0 评论 -
深入浅出ThreadLocal
前言ThreadLocal为变量在每个线程中都创建了一个副本,所以每个线程可以访问自己内部的副本变量,不同线程之间不会相互干扰。本文会基于实际场景介绍ThreadLocal如何使用以及内部实现机制。应用场景最近的一个web项目中,由于Parameter对象的数据需要在多个模块中使用,如果采用参数传递的方式,显然会增加模块之间的耦合性。先看看用ThreadLocal是如何实现模块间共享数转载 2016-09-12 12:30:52 · 248 阅读 · 0 评论 -
HashMap的工作原理
HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的变成能力。ConcurrentHashMap和其他同步集合的引入转载 2016-09-12 21:36:49 · 192 阅读 · 0 评论 -
HashMap的实现原理
HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HshMap的数据结构在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个转载 2016-09-13 09:49:22 · 282 阅读 · 0 评论 -
Java提高篇之TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做《根据红黑树的算法来分析TreeMap的实现》比较好。通过这篇博文你可以获得如下知识点:1、红黑树的基本概念。2、红黑树增加节点、删除节点的实现过程。3、红黑树左旋转、右旋转的复杂过程。4、Java中TreeMap是如何通过put、deleteEntry两个来实现红黑树转载 2016-09-13 20:43:38 · 307 阅读 · 0 评论 -
TreeMap源码解析
TreeMap是基于红黑树结构实现的一种Map,要分析TreeMap的实现首先就要对红黑树有所了解。1、二叉查找树、红黑树介绍什么是二叉查找树呢?它有什么特点呢?(1)若左子树不空,则左子树所有节点的值均小于它的根节点的值;(2)若右子树不空,则右子树所有节点的值均小于它的根节点的值;(3)左、右子树也分别为二叉查找树;(4)没有键值相等的节点。按照二叉查找树存储的转载 2016-09-15 21:54:08 · 334 阅读 · 0 评论 -
RPC原理
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示。这些程序的特点就是服务消费方和服务提供方是本地调用关系。而一旦踏入公司,尤其是大型互联网公司,就会发现公司的系统由成千上万大大小小的服务组成,各服务部署在不同的机器上,有不同的团队负责。这时就遇到两个问题:转载 2016-08-14 14:47:43 · 355 阅读 · 0 评论 -
8张图理解Java
一图胜千言,下面图解均来自Program Creek网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。1、字符串不变性下面这张图展示了这段代码做了什么String s = "abcd";s = s.concat("ef");转载 2016-09-18 15:40:29 · 233 阅读 · 0 评论 -
Java基本点
1、面向对象的特征有哪些方面?面向对象的特征主要有以下几个方面:抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也转载 2016-09-29 22:49:30 · 561 阅读 · 0 评论 -
编写各种OutOfMemory & StackOverflow程序
自己编写各种outofmemory,stackoverflow程序HeapOutOfMemoryYoung OutOfMemoryMethodArea OutOfMemoryConstantPool OutOfMemoryDirectMemory OutOfMemoryStack OutOfMemory Stack OverFlow这是网上某篇称为Java大牛中列出来的一条项目,原创 2016-11-01 16:05:51 · 1043 阅读 · 0 评论 -
Java8内存模型
一、JVM内存模型内存空间(Runtime Data Area)中可以按照是否线程共享分为两块,线程共享的是方法区(Method Area)和堆(Heap),线程独享的是Java虚拟机栈(Java Stack),本地方法栈(Native Method Stack)和PC寄存器(Program Counter Register)。具体参见下图:1.虚拟机栈:每个线程有一个私有的栈原创 2017-02-28 12:02:12 · 16128 阅读 · 6 评论 -
Hashtable、HashMap、ConcurrentHashMap底层实现原理与线程安全问题
术语定义术语英文解释哈希算法hash algorithm是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。哈希表hash table根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈转载 2017-02-28 20:03:09 · 7096 阅读 · 2 评论 -
HashMap、HashTable与ConcurrentHashMap的区别
1、HashTable与HashMap(1)HashTable和HashMap都实现了Map接口,但是HashTable的实现是基于Dictionary抽象类。(2)在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,既可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap转载 2017-02-28 21:55:55 · 3149 阅读 · 0 评论 -
Java NIO概述
Java NIO由以下几个核心部分组成:ChannelsBuffersSelectors虽然Java NIO中除此之外还有很多类和组件,但Channel、Buffer和Selector构成了核心的API。其他组件,如Pipe和FileLock,只不过是与三个核心组件共同使用的工具类。Channel和Buffer基本上,所有的I/O在NIO中都从一个Channel开始。Cha转载 2017-02-27 10:59:43 · 293 阅读 · 0 评论 -
深入理解Java的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。一、抽象类在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为转载 2017-03-02 16:18:49 · 1217 阅读 · 0 评论 -
Java中的初始块执行顺序
在Java中除了使用构造器类对单个对象进行初始化操作外,我们还可以通过初始化块来实现。在一个类中可以有多个初始化块,相同类型的初始化块之间有顺序:前面定义的初始化块先执行,后面定义的初始化块后执行。使用static修饰的初始化块,称为静态初始化块,在初始化块中可以定义局部变量、调用其他对象的方法,以及使用分支、循环语句等。静态初始快:执行优先级高于非静态初始块,它会在对象装载到系统的时候执行一转载 2017-03-06 17:15:27 · 406 阅读 · 0 评论 -
堆外内存(off-heap)、堆内内存(on-heap)
堆Heap是内存中动态分配对象存在的地方。如果使用new一个对象,它就被分配在堆内存上。这是相对于Stack,如果你有一个局部变量则它是位于Stack栈内存空间。一般情况下,Java中分配的非空对象都是由Java虚拟机的垃圾收集器管理的,也称为堆内内存(on-heap memory)。虚拟机会定期对垃圾内存进行回收,在某些特定的时间点,它会进行一次彻底的回收(full gc)。彻底回收原创 2016-08-08 14:32:15 · 6747 阅读 · 7 评论