
java
光与热
这个作者很懒,什么都没留下…
展开
-
线程池初探
1. 线程池存在的问题1.提交到线程池的任务避免依赖于其他的任务,否则对线程池的执行策略带来了约束,出现活跃度的问题 2.对于时间敏感的操作,比如GUI应用,将一个长时间运行的任务提交到单线程话的Exuctor中,或者将多个长时间运行的任务提交到只包含少量线程的线程池中或削弱Executor管理的服务的响应性 3.不应该在线程池中使用ThreadLocal变量当线程池都是同类的,独立的时候线程池原创 2017-08-18 17:43:17 · 562 阅读 · 0 评论 -
Java SPI机制
SPI的全称是Service Provider Interface。简单来说,SPI机制提供了一个表达接口和其具体实现类之间的绑定关系的方案。具体是在JAR包的"META-INF/services/"目录下建立一个文件,文件名是接口的全限定名,文件的内容可以有多行,每行都是该接口对应的具体实现类的全限定名。转载 2017-12-12 20:48:04 · 335 阅读 · 0 评论 -
java注解回顾
Java注解 又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。Java语言中的类、方法、变量、参数和包等都可以被标注。Java标注和Javadoc不同,标注有自反性。在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注Annotation 不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一执行元注解元注解的作用就是用原创 2017-12-06 14:48:55 · 277 阅读 · 0 评论 -
java8 - Lambda集合操作
遍历集合在java8之前的版本中遍历一个集合常用下面这两种方法private static void list() { for (int i = 0; i < fruits.size(); i++) { System.out.println(fruits.get(i)); }}private static void list1() { for (String原创 2017-12-20 19:16:41 · 4519 阅读 · 1 评论 -
对volatile关键字的理解
问题来源于编码规范的一个例子一. 关于server模式下的主存和工作内存 规则40 多线程访问同一个可变变量,需增加同步机制说明:根据Java Language Specification中对Java内存模型的定义, JVM中存在一个主内存(Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每个线程都有自己的工作内存(Working Memo原创 2017-08-11 20:03:52 · 752 阅读 · 0 评论 -
java8 - 排序
java8以前在java以前为了对集合排序,通常的做法是这样的bean如下private static class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name;原创 2017-12-20 21:05:23 · 1347 阅读 · 1 评论 -
java8 Stream简述
Stream是java 8的新特性,Stream是对集合功能的增强Stream不是集合元素它不是数据结构,不能用于保存数据,它是有关于算法和计算的Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时原创 2017-12-12 14:35:51 · 569 阅读 · 0 评论 -
java8 - fork-join之CompletableFuture 使用总结
CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背。 为了解决这个问题,JDK吸收了原创 2017-12-20 19:00:03 · 2903 阅读 · 0 评论 -
java8 - 字符串操作
1.java-8新特性 String-Join操作1.字符串之间分隔符StringJoiner sj=new StringJoiner(","); sj.add("aaa"); sj.add("bbb"); sj.add("ccc"); System.out.println(sj.toString());运行结果aaa,bbb,ccc2原创 2017-12-15 19:00:52 · 2144 阅读 · 0 评论 -
java反射回顾<四>
jdk动态代理//动物接口public interface Animal { void shout(String sound);}//动物接口实现类public class Cat implements Animal { @Override public void shout(String sound) { for (int i = 0; i < 3;原创 2017-11-23 15:16:41 · 297 阅读 · 0 评论 -
动态绑定和静态绑定
动态绑定动态绑定是指编译器在编译阶段不知道要调用哪个方法Parent父类,父类有两个方法一个是类方法shout,一个是实例方法saypublic class Parent { String name; public static void shout(){ System.out.println("我是父类shout静态方法"); } public voi原创 2017-12-11 20:04:53 · 4315 阅读 · 4 评论 -
ThreadLocal使用及源码解读
ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的原创 2017-01-20 16:20:47 · 409 阅读 · 0 评论 -
java反射回顾<三>
1.利用反射调用对象方法Method method = demo.getMethod("say", String.class);method.invoke(demo.newInstance(), "名字");运行结果Hello 名字,my name is null-null2.调用getterMethod method = demo.getMethod("get" + "Age");System原创 2017-11-23 09:07:26 · 297 阅读 · 0 评论 -
java反射回顾<二>
1.反射获取方法返回类型,参数,异常public static void main(String[] args) { Class<?> demo = null; try { demo = Class.forName("com.java.reflect.People"); } catch (ClassNotFoundExcepti原创 2017-11-22 20:45:58 · 299 阅读 · 0 评论 -
异或运算
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0例如:10100001^00010001=101100000^0=0,0^1=1 0异或任何数=任何数1^0=1,1^1=0 1异或任何数-任何数取反任何数异或自己=把自己置0按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进转载 2017-12-07 16:39:22 · 627 阅读 · 0 评论 -
java final用法汇总
final在java中可以声明变量成员,方法,类以及本地变量,final修饰变量表示该变量不能再改变,final修饰的类和方法表示子类无法再覆盖final关键字的优点JVM会优化final变量,final关键字提高了性能final变量可以在无需线程同步的情况下并发使用final的知识点final成员变量必须在声明的时候初始化或者在构造器中初始化或者在普通初始化快初始化,否则就会报编译错误。原创 2017-12-11 18:56:45 · 825 阅读 · 0 评论 -
java并发之CopyOnWriteArrayList
原理java普通的集合在遍历的时候不允许修改(add,remove,set)这样的操作,否则会抛出java.util.ConcurrentModificationException。为了支持集合的并发操作,于是CopyOnArrayList和CopyOnArraySet这样的数据结构就应运而生了.CopyOnArrayList这样的数据结构实现的思想是读写分离,通俗的讲在添加元素的时候,先将当...原创 2017-11-02 10:00:59 · 791 阅读 · 0 评论 -
IdentityHashMap
在HashMap中,对于两个键值对key1-value1,key2-value2,在key相同(key1.equals(key2)==true)的情况下value1与value2不能共存,有没有一种数据结构使value1与value2共存呢?有,那就是IdentityHashMap.IdentityHashMap在比较键时候不是使用equals方法而是比较两个对象的引用,如果对象引用不同即使对象e...原创 2018-03-03 21:18:31 · 1343 阅读 · 0 评论 -
WeakHashMap
WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,见实例:此例子中声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap remove掉a 并且将a、b都指向nu...转载 2018-03-09 10:34:24 · 624 阅读 · 0 评论 -
避免NPE
在java开发中中NPE异常是常见异常,在阿里java开发手册中就明确强调防止NPE是调用者的责任是程序员基本修养,本篇博客讲解利用一些小技巧避免NPE1.1equals方法public void equals() { //代表未知的对象,可能会是NULL也可能不是NULL Object unKnowObject = null; //这样某些情况下可能会抛出原创 2018-02-06 22:35:22 · 5437 阅读 · 1 评论 -
GC - 四种引用
Java 中一共有 4 种类型的引用 : StrongReference、 SoftReference、 WeakReference 以及 PhantomReference 这 4 种类型的引用与 GC 有着密切的关系, 让我们逐一来看它们的定义和使用场景 :1.Strong ReferenceStrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活...转载 2018-02-11 21:28:15 · 678 阅读 · 0 评论 -
EnumMap
EnumMap是Map接口的一种实现,专门用于枚举类型的键,所有枚举的键必须来自同一个枚举EnumMap不允许键为空,允许值为空EnumMap成员变量 private final Class keyType; private transient K[] keyUniverse; private transient Object[] vals; p原创 2018-02-05 22:40:46 · 1498 阅读 · 0 评论 -
java transient关键字
java对象在实现了Serilizable接口后这个对象就可以被序列化,但是java的这种序列化机制会将这个类的所有属性和方法都序列化.有时候我们的一些敏感信息比如密码并不想序列化传输给对方,这个时候transient关键字就派上用场了,如果一个类的变量加上了transient关键字那么这个字段就不会被序列化下面这个例子我们利用transient避免User序列化过程中密码字段的序列化原创 2018-02-04 22:23:50 · 503 阅读 · 0 评论 -
Runtime
java的runtime类是一个封装了JVM进程的类,每一个java程序实际上都是启动了一个JVM进程.每一个程序都对应一个Runtime实例,实例是由JVM初始化的,我们可以利用java的Runtime类获取进程的相关信息,启动其它进程,关闭当前进程等操作实例化runtime类Runtime类在整个jvm中只存在一个Runtime对象,通过Runtime类的静态方法进行实例化操作而不...原创 2018-02-08 23:06:38 · 359 阅读 · 0 评论 -
Java ClassLoader机制
一、什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则转载 2018-01-07 18:22:58 · 339 阅读 · 0 评论 -
Fork Join框架
1.1 核心思想Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架,其实现思想与MapReduce有异曲同工之妙。Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+…+10000,可以分割成10个子任务,每个子任务分别转载 2018-01-06 20:44:33 · 582 阅读 · 0 评论 -
尾递归
递归对于下面这个递归求阶乘调用private static long factorialRecursive(long n) { return n == 1 ? 1 : n * factorialRecursive(n - 1);}factorialRecursive调用在运行的时候每次执行factorialRecursive方法调用都会在调用栈上创建一个新的栈帧,用于保存每个方法调用的状态原创 2017-12-19 14:45:13 · 388 阅读 · 0 评论 -
java反射回顾<一>
1.反射获取包名和类名People people=new People();System.out.println(people.getClass().getName());运行结果类名称->com.java.reflect.People类名称->com.java.reflect.People类名称->com.java.reflect.People2.所有对象是class的实例private s原创 2017-11-22 17:03:04 · 308 阅读 · 0 评论 -
Jdk1.8 HashMap解读
jdk1.8中HashMap重要属性Node关键函数hashstatic final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }在这里(h = key.hashCode()) ^ (h >>> 16)主要分为了三步原创 2017-12-10 19:32:06 · 355 阅读 · 0 评论 -
Java异常机制
Error和Exception区别Java异常的基类为java.lang.Throwable.Throwable对象可以分为两种类型 一种Exception,一种是ErrorError是Throwable的子类,用于指示合理的应用程序不应该试图捕获的严重问题,比如JVM内部的严重问题,无法恢复,程序人员不用处理Exception异常通过合理的处理,程序还可以回到正常执行流程。要求编程人员要进行处理原创 2017-12-09 09:33:02 · 411 阅读 · 0 评论 -
AtomicInteger理解和使用
AtomicInteger类的理解与使用首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下:public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; }}以下是Atom转载 2017-07-31 09:01:57 · 705 阅读 · 0 评论 -
TimeUnit使用示例
TimeUnit是java.util.concurrent包下面的一个类,表示给定单元粒度的时间段主要作用时间颗粒度转换延时 常用的颗粒度?12345TimeUnit.DAYS //天TimeUnit.HOURS //小时TimeUnit.MINUTES //分钟TimeUnit.SECONDS //秒TimeUnit.MILLISEC转载 2017-07-30 22:41:08 · 572 阅读 · 0 评论 -
java枚举
JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。大师兄我又加上自己的理解,来帮助各位理解一下。用法一:常量在JDK1.5 之前,我们定义常量都是: public static fianl…. 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 Java代码 public enum Color {转载 2017-07-12 09:18:11 · 435 阅读 · 0 评论 -
安装两个jdk
场景:公司项目使用的jdk为1.7,最近不是很忙,找到一个爬虫系统学习。该系统使用到了jdk1.8的特性,所以I need 俩版本,开整!!!1 . 准备两个版本的jdk我的两个jdk路径为:D:\jdk1.7.0_80D:\Program Files\Java\jdk1.8.0_111122 . 设置两个子JAVA_HOME,一个总设置两个子JAVA_HOME:JAVA_HOME7 = D:\转载 2017-05-18 11:19:11 · 651 阅读 · 0 评论 -
StringBuffer和StringBuilder和String比较
因为StringBuffer和StringBuilder是字符串变量如下定义 char value[], 而String是字符串常量 如下定义private final char value[],同时StringBuffer是线程安全的,需要消耗比StringBuilder更多的资源,所以会有如下的速度大小关系 StringBuilder>StringBuffer>String原创 2017-04-02 23:01:16 · 314 阅读 · 0 评论 -
CommonDAOImpl中泛型使用
CommonDAOImpl是所有DAOImpl的父类,里面包含了所有DAO类会使用到的公共方法,比如说update(),save(),find()等方法 在查找操作时候,有这样的find()方法 public T findObjecByID(Serializable id) { //下面的entity是相应实体类 return (T)this.getHibe原创 2017-04-02 22:43:20 · 942 阅读 · 0 评论 -
对IO流关闭的思考
流必须要关闭的原因java相对C,C++来说不需要手动释放内存,在对象引用被消除之后,正常情况下内存资源是会被垃圾回收,那么在使用完IO流之后为什么需要手动关闭. 这是为了回收系统资源,比如释放占用的端口,文件句柄,网络操作数据库应用等.对Unix系统来说,所有的资源都可以抽象成文件,所以可以通过lsof来观察。看下面这个例子,我们创建许多的IO流但是不关闭public clas...原创 2017-03-26 10:14:07 · 8038 阅读 · 1 评论 -
javaIO之SequenceInputStream
有些情况下,当我们需要从多个输入流中向程序读入数据。此时,可以使用合并流,将多个输入流合并成一个SequenceInputStream流对象。 SequenceInputStream会将多个流集组合成一个输入流并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。 合并流的作用是将多个源合并合一个源。下面是一个使用案例...原创 2017-02-19 11:16:11 · 481 阅读 · 0 评论 -
标注的应用
Java自定义注释的两个应用: 第一个应用相当于获取配置文件的值。 定义一个注释,代码如下:package note;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.a转载 2017-01-15 14:57:32 · 438 阅读 · 0 评论 -
java标准IO
java的标准IO指的是System.in,System.out,System.err,在默认的情况下in代表键盘和out代表显示器,当程序通过System.in来获得输入时,实际上是通过键盘获得输入,当程序通过System.out执行输出时,程序总是输出到屏幕,其中in是基本IO类型InputStream,而out和err是javaIO的一种装饰器PrintStream,那么什么是PrintSt...原创 2017-01-15 08:54:45 · 5286 阅读 · 0 评论