Java
文章平均质量分 85
潘建南
这个作者很懒,什么都没留下…
展开
-
走进Java
Java主要的优点:Java摆脱了平台的束缚,实现了“一次编译,到处运行”。提供了一个相对安全内存管理和访问机制,完善的垃圾回收机制。实现了热点代码检测和运行时编译及优化。有一套完善的程序接口,大量的第三方类库。Java所带来的这些好处使程序开发效率得到了很大的提升。原创 2016-07-04 20:29:40 · 388 阅读 · 0 评论 -
JDK各版本特性
JDK各版本特性老版本 JDK 1.0 1996-01-23 JDK 1.1.4 Sparkler 宝石 1997-09-12 JDK 1.1.5 Pumpkin 南瓜 1997-12-13 JDK 1.1.6 Abigail 阿比盖尔–女子名 1998-04-24 JDK 1.1.7 Brutus 布鲁图–古罗马政治家和将军 1998-09-28...原创 2018-10-16 10:10:47 · 3676 阅读 · 0 评论 -
Java Web项目启动加载顺序
web.xml加载过程(步骤): 1.启动WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.3.容器将<con转载 2015-09-20 17:44:17 · 5381 阅读 · 0 评论 -
HashMap的扩容机制---resize()
HashMap的扩容机制---resize()什么时候扩容:当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值(知道这个阈字怎么念吗?不念fa值,念yu值四声)---即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。扩容(resize)就是重新计算容量,向HashMap对象里不停的添加元素,而HashMap对象内部的数组无法装载更多的元素时,对象就需要扩大数组的...转载 2018-09-03 13:17:47 · 68217 阅读 · 28 评论 -
jdk1.8 HashMap源码分析
一、HashMap概述 在jdk1.8之前,HashMap采用数组+链表实现,即使用链表处理冲突,同一hash值的节点都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。 下图中代...转载 2018-09-03 12:59:59 · 190 阅读 · 0 评论 -
Java Unsafe类
声明:本文基于JDK 1.8Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Cassandra、Hadoop、Kafka等。Unsafe类在提升Java运行效率,增强Java语言底层操作能力方面起了很大的作用。 Unsafe类使Java拥有了像C语言的指针一样操作内...转载 2018-09-04 11:34:42 · 310 阅读 · 0 评论 -
JDK 1.7及之前——HashMap死循环问题解析
在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(在网上查“HashMap Infinite Loo...转载 2018-09-04 09:26:52 · 5923 阅读 · 3 评论 -
Java多态的实现机制——静态分派与动态分派
1. Java多态简介多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作,如下图所示:多态存在的三个必要条件:继承、重写、父类引用指向子类对象。多态的体现:重写、接口、抽象类和抽象方法多态性语言具有灵活,抽象,行为共享,代码共享的优势,很好的解决了应用程序函数同名问题。更多介绍:http://www.runoob.com/j...转载 2018-08-26 15:16:47 · 1126 阅读 · 0 评论 -
Java事件机制
Java事件机制包括三个部分:事件、事件源、事件监听器。1. 事件事件一般继承自java.util.EventObject类,封装了事件源对象及跟事件相关的信息。importjava.util.EventObject;/***事件类,用于封装事件源及一些与事件相关的参数.*/publicclassCusEventextendsEvent...原创 2018-07-28 12:27:27 · 5673 阅读 · 1 评论 -
JDK 1.8新特性Lambda入门
转载至:https://blog.csdn.net/chenchaofuck1/article/details/51897481网上关于java lambda的例子很多,但是这些五花八门的例子很不常见不常用,最后导致初学者望而却步,其实我们抓住lambda的本质之后,会发现lambda还是很好理解的。毕竟,java8设计lambda的初衷是给开发者提供便利,而不是制造障碍。lambda表达式本...转载 2018-11-25 13:29:35 · 203 阅读 · 0 评论 -
快速失败(fail-fast)和安全失败(fail-safe)
1. 快速失败(fail—fast) 在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。 原理:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。每当迭代器...转载 2018-12-05 11:45:06 · 319 阅读 · 0 评论 -
Java SPI解析
什么是SPI?SPI 全称为 (Service Provider Interface) 服务提供接口,是JDK内置的一种服务提供发现机制。SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加一个实现。Java SPI 应用实例当服务的提供者提供了一种接口的实现之后,需要在classpath下的META-INF/services/目录里创建一个以服务接...原创 2019-03-09 22:36:19 · 356 阅读 · 0 评论 -
JDK8函数式接口Function、Consumer、Predicate、Supplier
转自:https://blog.csdn.net/z834410038/article/details/77370785备注1:观察发现,函数式接口下共有 1、三种方法 1.1 唯一的抽象方法 1.2 使用default定义普通方法(默认方法),通过对象调用。 实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写 。当然如果接口中的默认方法不能满足某个实...转载 2019-02-17 21:48:21 · 6259 阅读 · 1 评论 -
Java SPI机制简介,及dubbo SPI
转自:https://www.jianshu.com/p/46aa69643c97SPI 简介SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制。 目前有不少框架用它来做服务的扩展发现, 简单来说,它就是一种动态替换发现的机制, 举个例子来说, 有个接口,想运行时动态的给它添加实现,你只需要添加一个实现,而后,把新加的实现,描...转载 2019-02-03 18:10:07 · 2900 阅读 · 1 评论 -
ByteArrayOutputStream或ByteArrayInputStream不需要关闭流原因分析
转自:https://blog.csdn.net/u012668925/article/details/53941471 在解压图片的时候发现ByteArrayOutputStream不需要关闭,为啥呢? ByteArrayOutputStream或ByteArrayInputStream是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读内存的,这个字节数组是它的成员变量,当这个数组不...转载 2019-01-21 15:58:46 · 12145 阅读 · 0 评论 -
高效Java技巧重写equals方法时应当重写hashCode方法
转自:http://tantanit.com/java-always-override-hashcode-when-override-equals/hashCode需满足的条件当equals方法中涉及的参数没有改变时,hashCode应保持不变 如果根据equals方法,两个对象是相等的,那么这两个对象的hashCode应该一样 两个对象如果不相等,hashCode不强制要求不一样,但...转载 2019-01-19 12:06:52 · 3467 阅读 · 0 评论 -
Java中instanceof和isInstance的区别
1. instanceof 是一个操作符使用方法:A a = new A();if (a instanceof A) {}表示对象a是否是A的实例对象一个对象是自身类的一个实例对象 一个对象是自身类、父类和接口的一个实例对象 所有对象都是Object类的实例对象 凡是null有关的都是false,null instanceof(class)2. isInstance...原创 2018-12-16 15:11:09 · 1609 阅读 · 0 评论 -
ConcurrentHashMap JDK1.7 和 JDK1.8 的区别
转自:https://www.jianshu.com/p/933289f27270ConCurrentHashMap 1.8 相比 1.7的话,主要改变为: 去除 Segment + HashEntry + Unsafe 的实现, 改为 Synchronized + CAS + Node + Unsafe 的实现 其实 Node 和 HashEntry 的内容一样,但是HashEnt...转载 2018-12-20 17:00:05 · 2325 阅读 · 0 评论 -
Java反射中Class类源码分析
这篇博客主要是来分析下Java反射机制实现的核心类Classpublic class Test { public static void main(String[] args) { Class clazz = String.class; Constructor[] constructors = clazz.getConstructors(); ...转载 2018-07-31 14:55:22 · 2093 阅读 · 0 评论 -
Java序列化(Serializable)的总结
1. 序列化是干什么的? 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。2. 什么情况下需要序列化 a)当你想把的内存中的对象状态保存到一个文件中或者数据库中时候...转载 2018-07-27 14:21:17 · 1118 阅读 · 0 评论 -
Java线程死锁的简单例子
/** * DeadLockDemo * * @author 潘建南 * @date 2017/4/1 */public class DeadLockDemo { private static String A="A"; private static String B="B"; private void deadLock() { Thread t1原创 2017-04-02 10:36:32 · 580 阅读 · 0 评论 -
JVM内存区域
Java虚拟机所管理的内存包括以下几个运行时数据区域,如下图 其中JVM的方法区和堆区由所有线程所共享,其它区域线程隔离。JVM其实可以理解成一个应用级的OS(操作系统),它的结构可以结合计算机的结构来加以理解,如下图 —— Created by 潘建南原创 2016-07-06 22:09:06 · 438 阅读 · 0 评论 -
Java中compareTo和compare方法比较
Java中compareTo和compare这两个方法经常搞混淆,现对其进行总结以加深记忆。compareTo(Object o)方法是java.lang.Comparable<T>接口中的方法,当需要对某个类的对象进行排序时,该类需要实现Comparable<T>接口的,必须重写public int compareTo(T o)方法,比如MapReduce中Map函数...转载 2016-12-31 10:04:27 · 6174 阅读 · 0 评论 -
Java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图12-6所示。下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流。范例:使用字节流不关闭执行Java代码转载 2016-12-25 10:29:13 · 271 阅读 · 0 评论 -
Java中的深拷贝和浅拷贝
首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2(图1) 对象A进行浅拷贝后,得到对象B但是对象A1和A2并没有被拷贝(图2) 对象A进行深拷贝,得到对象B的同时A1和A2连同它们的引用也被拷贝(图3) 在转载 2016-12-24 20:58:34 · 297 阅读 · 0 评论 -
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
对。 不废话,看代码:public class EqualsTest { public static void main(String[] args) { A a = new A(); B b = new B(); System.out.println(a.equals(b)); System.out.println(a.ha原创 2016-12-24 16:11:44 · 7210 阅读 · 4 评论 -
Java中.getClass()和.class的区别
一直在想.class和.getClass()的区别,思索良久,有点思绪,然后有网上搜了搜,找到了如下的一篇文章,与大家分享。 原来为就是涉及到java的反射~~~~~Java反射学习所谓反射,可以理解为在运行时期获取对象类型信息的操作。传统的编程方法要求程序员在编译阶段决定使用的类型,但是在反射的帮助下,编程人员可以动态获取这些信息,从而编写更加具有可移植性的代码。严格地说,反射...转载 2016-12-24 18:32:10 · 1112 阅读 · 0 评论 -
Java线程的6种状态及切换(透彻讲解)
Java中线程的状态分为6种。1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状...原创 2016-12-24 16:57:03 · 262234 阅读 · 139 评论 -
Callable、Future和FutureTask浅析
创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果,那如果我们想要获取返回结果该如何实现呢?从JDK 1.5开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果,今天我们就来聊聊线程创建的第三种方式,那就是实现Callable接口。1.Callable<...转载 2018-07-09 11:28:59 · 2219 阅读 · 0 评论 -
Java对象内存大小计算
最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存?在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用:import java.lang.instrument.Instrumentation;...转载 2018-07-03 14:43:34 · 11813 阅读 · 1 评论 -
Java中启动线程start和run方法
一、区别Java中启动线程有两种方法,继承Thread类和实现Runnable接口,由于Java无法实现多重继承,所以一般通过实现Runnable接口来创建线程。但是无论哪种方法都可以通过start()和run()方法来启动线程,下面就来介绍一下他们的区别。start方法:通过该方法启动线程的同时也创建了一个线程,真正实现了多线程。无需等待run()方法中的代码执行完毕,就可以接着执行...转载 2018-07-21 21:31:44 · 3672 阅读 · 1 评论 -
Java语法糖
语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言本身功能来说没有什么影响,只是为了方便程序员的开发,提高开发效率。说白了,语法糖就是对现有语法的一个封装。Java作为一种与平台无关的高级语言,当然也含有语法糖,这些语法糖并不被虚拟机所支持,在编译成字节码阶段就自动转换成简单常用语法。一般来说Java中的语法糖主要有以下几种:泛型与...原创 2018-07-26 18:23:34 · 1403 阅读 · 0 评论 -
深入理解Java注解类型(@Annotation)
Java注解是在JDK1.5时引入的新特性,鉴于目前大部分框架(如Spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于一个Java工程师是来说是很有必要的事。本篇我们将通过以下几个角度来分析注解的相关知识点 当一个接口直接继承java.lang.annotation.Annotation接口时,仍是接口,而并非注解。要想自定义注解类型,只能通过@interface...转载 2018-07-25 22:52:36 · 417 阅读 · 0 评论 -
Java 泛型详解
对Java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下。本文参考java 泛型详解、Java中的泛型方法、 java泛型详解1. 概述泛型在Java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此...转载 2018-07-14 16:35:30 · 160 阅读 · 0 评论 -
Java - 集合框架完全解析
数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。Java提供了几个能有效地组织和操作数据的数据结构,这些数据结构通常称为Java集合框架。在平常的学习开发中,灵活熟练地使用这些集合框架,可以很明显地提高我们的开发效率,当然仅仅会用还是不够的,理解其中的设计思想与原理才能更好地提高我们的开发水平。下面是自己对Java集合框架方面的学习总结。一、概述二、...转载 2018-07-13 16:13:10 · 604 阅读 · 0 评论 -
Java反射详解
反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述Java Reflaction in Action有这么一句话,可以解释。反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变。通俗的讲就是反射可以在运行时根据指定的类名获得类的信息。Java反射机制是在运行状态中,对于...转载 2018-07-23 21:40:43 · 738 阅读 · 0 评论 -
Java队列同步器AQS
一. AQS概述在Java的concurrent包中,基本上并发工具都是使用了AbstractQueuedSynchronizer类(简称AQS)作为核心,因此AQS也是并发编程中最重要的地方。同步器AQS是实现锁的关键,锁和AQS很好隔离了二者所需关注的领域:锁的API面向使用者,定义了与锁交互的公共行为 锁的实现是依托给AQS实现的,AQS面向的是线程访问和资源控制AQS中采用了一...转载 2018-07-05 17:24:40 · 1087 阅读 · 0 评论 -
Java中的String类为什么不可变
1、什么是不可变?java角度来讲就是说成final的。String不可变如下图:假设给字符串s赋值为abcd,第二次重新赋值为abcdef,这时候并不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。2、String为毛不可变?看源码的前3行你就懂了。1、首先String类是用final修饰的,这说明String不可继承2、其次String类的主力成员...转载 2018-07-23 15:00:42 · 6873 阅读 · 6 评论 -
log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析
转自:https://blog.csdn.net/kxcfzyk/article/details/38613861注:下文中的“桥接”、“转调”、“绑定”等词基本都是同一个概念。log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。异常信息大致如下(摘自slf4j官网文档Dete...转载 2019-03-10 20:51:41 · 2255 阅读 · 1 评论