
Java基础
文章平均质量分 70
腹黑大壁花
这个作者很懒,什么都没留下…
展开
-
详解Java泛型(二)之类型擦除
1. 概述其实Java中的泛型是伪泛型,什么意思呢?就是说它并不是一直都存在的。Java泛型的处理几乎都在编译器中进行,在生成的字节码文件(.class文件)中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,然后编译器在编译的时候去掉,这个过程就是类型擦除。比如下面这段代码使用到了泛型,当list.get(0)的时候不用显示强转变成String类型,在没有使用泛型的时候就需要显示强转一下。原创 2016-12-10 16:42:23 · 903 阅读 · 0 评论 -
详解Java8特性之方法引用
前言在详解Java8特性之Lambda表达式 中我介绍了Java8中的Lambda表达式,通过Lambda表达式我们就可以快速地创建一个函数式接口的实例,可以说是大大简便了我们开发。你以为只能做到这么简便了嘛,big big wrong,大大的错,还可以再简便一点。有请我们今天的主角—方法引用在学习这个之前的得确保你已经学习过Lambda表达式了,因为这个是用在Lambda表达式的。方法引用方法引用原创 2017-05-05 12:49:15 · 19396 阅读 · 2 评论 -
详解Java8特性之接口默认方法
是什么Java8中新增了接口的默认方法,简单来说就是让接口可以自己有实现方法,不许要实现类去实现。有什么用想象一种情况,你定义了一个接口A,假如里面有几个抽象方法。然后什么B,C,D,E…一大堆类去实现了A接口里面的几个抽象方法。那么现在问题来了,如果要在A中新加一个抽象方法,那么所有的实现类都要去实现这个抽象方法,不是很麻烦吗?这个时候默认方法就派上用场了,只需要再A中自己实现这个新添加的方法就好原创 2017-05-05 16:22:35 · 2019 阅读 · 0 评论 -
浅析若干Java序列化工具
转载http://blog.youkuaiyun.com/u013256816/article/details/50721421#comments 在Java中socket传输数据时,数据类型往往比较难选择。可能要考虑带宽、跨语言、版本的兼容等问题。比较常见的做法有:采用java对象的序列化和反序列化把对象包装成JSON字符串传输Google工具protoBuf的开源 本文章所需要的转载 2017-05-14 16:48:18 · 619 阅读 · 0 评论 -
详解Java8特性之Optional类
Optional类在Java中,可能我们看过最多的异常就是java.lang.NullPointerException,这是使用null引用去调用一个方法或者字段的结果。Java 8中提供了java.util.Optional<T> 类,是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且 可以避免空指针异常。Optiona原创 2017-05-06 16:44:22 · 3266 阅读 · 0 评论 -
详解Java8特性之Stream API
前言Java8中有两大最为重要的改变。第一个是Lambda表达式,还不了解的可以去这看看详解Java8特性之Lambda表达式另外一个则是Stream API,在java.util.stream下是什么Stream呢,很多地方说到它是处理集合的关键抽象概念,这样子说实在是太抽象了。这个Stream并不是我们以前认识的IO流,而是一个数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合专注的原创 2017-05-06 18:09:05 · 2535 阅读 · 3 评论 -
详解Java8特性之Stream API补充
上一篇文章我介绍了Java 8的Stream API 详解Java8特性之Stream API,忘记补充一点了,Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream(这样可以链式编程)。看下面例子@Testpublic void test() { List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6); lis原创 2017-05-06 18:36:38 · 936 阅读 · 0 评论 -
Fork/Join框架及其性能介绍
Fork/Join框架介绍Fork/Join框架是Java 7提供了的一个用于并行执行任务的框架, 大概是怎样子的呢,就是一个把大任务分割成若干个小任务,最终把每个小任务结果汇总起来得到大任务结果的框架。有点像是归并排序。下面的图就能很好地体现出来工作窃取模式(work-stealing)在讲Fork/Join框架使用前,得先介绍一下它所使用的线程模式——工作窃取模式,何为工作窃取模式,其实就是指一原创 2017-05-07 09:19:37 · 7243 阅读 · 8 评论 -
详解Java8特性之Stream API并行流
在详解Java8特性之Stream API中,我用的例子使用的都是顺序流,即单线程执行的,其实Stream API还提供了并行流,即多线程执行操作。java.util.Collection<E>新添加了两个默认方法default Stream stream() : 返回顺序流default Stream parallelStream() : 返回并行流可以发现,stream()和paralle原创 2017-05-07 19:50:28 · 12468 阅读 · 4 评论 -
详解Java8特性之重复注解
重复注解注解(Annotation )是Java 5 推出来的,推出来后使用极其广泛,一些流行的框架基本都会用到注解实现一些功能,代替以前的配置方式,最典型的像Spring。在继续往下讲之前,我先声明你得知道注解的知识,我假设你已经掌握注解知识并能够自定义注解。在Java 8 之前,同一个注解是不能在一个位置上重复使用的,例如我定义了一个注解@MyAnnotationpackage edu.jyu.原创 2017-05-07 21:57:34 · 2708 阅读 · 1 评论 -
详解Java8特性之新的日期时间 API
吐槽Java 8 提供了一套新的日期时间 API,为什么要这么干呢。因在旧版的 Java 中,日期时间 API 存在很多问题,比如说线程安全问题了, java.util.Date 是非线程安全的,所有的日期类都是可变的;又还有设计乱七八糟,你去看看java.util.Date类会发现它的很多方法都被标记过时了,就知道Sun公司自己人都看不过去了,而且用于格式化和解析日期类的类在java.text包下原创 2017-05-07 14:09:17 · 5701 阅读 · 3 评论 -
一个小细节引起的悲剧——线程执行顺序错误
悲剧的故事今天在写博客的时候,想弄个例子说明一下非原子操作的线程安全问题,下面就是这个例子public class Main { public static void main(String[] args) { Counter counter = new Counter(); // 开启1000条线程让counter的count++,理想结果应该是1000原创 2017-05-08 17:24:06 · 823 阅读 · 0 评论 -
详解JUC之原子类概述
原子操作在讲 JUC (java.util.concurrent) 的原子类之前呢,我得先介绍一下原子操作在化学变化中,原子(Atom)是不能再分的一种粒子(在物理上还可以分为质子和电子),计算机中的原子操作是指不能分割成若干部分的操作,表示这个操作在执行过程中,是不能被中断的。比如说int i=0;是一个原子操作。而i++则可以分成两步操作,先是计算i+1的值然后第二步是将第一步的计算结果赋值给i原创 2017-05-08 18:54:28 · 1589 阅读 · 0 评论 -
Java8特性系列文章目录
(1)详解Java8特性之Lambda表达式(2)详解Java8特性之方法引用(3)详解Java8特性之接口默认方法(4)详解Java8特性之Optional类(5)详解Java8特性之Stream API(6)详解Java8特性之Stream API补充(7)详解Java8特性之新的日期时间 API(8)详解Java8特性之Stream API并行流(9)详解Java8特性之重复注解其实Java8原创 2017-05-08 21:43:07 · 1931 阅读 · 2 评论 -
Java中CAS详解
转载http://blog.youkuaiyun.com/ls5718/article/details/52563959在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程转载 2017-05-08 22:39:32 · 895 阅读 · 0 评论 -
Java锁的膨胀过程和优化
首先说一下锁的优化策略。1,自旋锁自选锁其实就是在拿锁时发现已经有线程拿了锁,自己如果去拿会阻塞自己,这个时候会选择进行一次忙循环尝试。也就是不停循环看是否能等到上个线程自己释放锁。这个问题是基于一个现实考量的:很多拿了锁的线程会很快释放锁。因为一般敏感的操作不会很多。当然这个是一个不能完全确定的情况,只能说总体上是一种优化。举个例子就好比一个人要上厕所发现厕所里面有人,他可以:1,等一小会。转载 2017-05-08 22:50:36 · 1512 阅读 · 0 评论 -
sun.misc.unsafe类的使用
转载http://blog.youkuaiyun.com/fenglibing/article/details/17138079 这个帖子是关于JAVA中鲜为人知的特性的后续更新,如果想得到下次在线讨论的更新,请通过邮件订阅,并且不要忘了在评论区留下你的意见和建议。 Java是一个安全的开发工具,它阻止开发人员犯很多低级的错误,而大部份的错误都是基于内存管理方面的。如果你想搞破坏,可以使用Unsa转载 2017-05-09 09:42:30 · 716 阅读 · 0 评论 -
JNI简介
转载http://www.cnblogs.com/eesijian/p/5843879.html 1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口。 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究)。 解决办法:Java使用JNI可以调用现转载 2017-05-09 09:47:33 · 670 阅读 · 0 评论 -
详解Java8特性之Lambda表达式
前言Lambda表达式是Java8的一个特性,而Java8是2014发布的,那时候我刚上大学,还没认识Java呢。过了很长一段时间才学习了Lambda表达式,但是一直没怎么用过,已经忘了差不多了,所以现在特地复习一下。学一个东西我们得知道它是什么,有什么用,怎么用。是什么从不同角度上来说,Lambda表达式是一个语法糖,也可以说是匿名函数。语法糖何谓语法糖,我的理解是语法糖就是方便程序员开发的一个功原创 2017-05-05 10:09:44 · 3438 阅读 · 0 评论 -
详解JUC之锁——LockSupport类(04)
LockSupportLockSupport看名字叫锁支持,这个玩意的功能跟wait和notify很像,它也是可以阻塞一个线程,然后又可以恢复一个线程,不过有个比较大的区别就是,wait让线程阻塞前,必获取到同步锁。而LockSupport这个哥们比较牛逼,随时随地随便阻塞当前线程,你给它一个线程它就敢让那个线程阻塞。它是通过park()方法阻塞当前线程的,park的意思就是停车咯,然后恢复线程就是原创 2017-05-11 17:25:51 · 1937 阅读 · 0 评论 -
详解JUC之锁——ReentrantLock类(03)
前言在详解JUC之锁——Lock与AQS(02)中我介绍了JUC锁的根基——AQS类还有公平锁和非公平锁,现在就可以正式介绍一下JUC锁家族其中的一个成员——ReentrantLockReentrantLockReentrantLock是一个互斥锁,也是一个可重入锁(Reentrant就是再次进入的意思)。ReentrantLock锁在同一个时间点只能被一个线程锁持有,但是它可以被单个线程多次获取,原创 2017-05-11 17:18:59 · 1276 阅读 · 6 评论 -
详解Java泛型(三)之类型擦除的问题
1. 概述类型擦除后,会带来很多幺蛾子,有些限制不得不提一下,下面就来看看有哪些限制,为什么会有这些限制。2. 不能用基本类型实例化类型参数在传递类型变量的时候不能传一个基本类型,如ArrayList<int> list = new ArrayList<int>();这句代码是有错的,根据我们上面说的类型擦除可知ArrayList只能存储Object类型的数据,而Object与int类型并不能直接转原创 2016-12-10 22:37:02 · 1357 阅读 · 3 评论 -
详解Java泛型(四)之通配符类型
1. 概述固定的泛型类型系统使用起来不是特别的方便,所以java的设计者发明了一种很巧妙且安全的解决方案——通配符类型。2. 泛型类型的继承规则在讲通配符类型前,先来点预备知识。现在我有一个Persno类和一个Student类,Student类是Person类的子类,那么Pair<Student>是Pair<Person>的一个子类吗?不是,例如下面的代码是不能通过编译的Pair<Person> p原创 2016-12-11 18:29:18 · 902 阅读 · 0 评论 -
解密Java byte类型的一个小问题
大家先看一下下面的代码public class Main { public static void main(String[] args) { byte a = 1; byte c = 2; byte b = a + c;//编译报错 }}其中byte b = a + c;这句代码会报一个类型不匹配的错误,说不能将int类型转换成原创 2016-12-13 21:52:10 · 1746 阅读 · 0 评论 -
Java断言(assert)介绍及使用
概述在一个具有自我保护能力的程序中,如果要确保某个属性符合要求,并且代码执行依赖于这个属性。例如字符串操作int len = str.length();我们确信str是一个字符串的引用,原因是这是调用者传给该方法的一个参数,但是还是希望能够检查一下,避免调用了一个null引用的方法。当然,可以直接抛出一个异常。if(str == null) throw new IllegalArgument原创 2016-12-07 16:53:04 · 3334 阅读 · 0 评论 -
详解Java泛型(一)之简单介绍
1. 概述泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。什么叫参数化类型呢?像java的方法有形参,然后调用方法的时候传递实参。而参数化类型,顾名思义就是把类型参数化,就是说类型是不固定的,是靠调用者传入进来的。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。在Java原创 2016-12-09 16:48:26 · 580 阅读 · 0 评论 -
java中什么是bridge method(桥接方法)
java中什么是bridge method(桥接方法)在看spring-mvc的源码的时候,看到在解析handler方法时,有关于获取桥接方法代码,不明白什么是桥接方法,经过查找资料,终于理解了什么是桥接方法。什么是桥接方法桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法。我们可以通过Method.isBrid转载 2016-12-10 10:54:17 · 1072 阅读 · 0 评论 -
Java多线程设计(一)由浅入深介绍进程与线程
概述在了解线程(thread)我们应该先了解一下进程(process),这两个都是操作系统的概念,比较抽象难懂,所以下面我就用自己的理解解释一下这两个概念,不过还是建议大家去看看操作系统相关的书里面的介绍。单任务操作系统在远古的时候(就是上个世纪),个人电脑还没流行,计算机还是一种稀有资源。那时候的操作系统(比如微软的Dos系统),在一个时刻只能处理一个任务,这就是单任务操作系统,然后大家觉得这样子原创 2016-12-17 10:56:13 · 1266 阅读 · 0 评论 -
Java多线程设计(二)线程的基本知识(1)
1.概述在上一篇文章Java多线程设计(一)由浅入深介绍进程与线程我已结介绍了线程以及与线程相关的知识,现在就开始正式说一下Java中的线程的基本知识。2.线程的启动其实我们最经常看到的线程就主线程,就是做main方法中的任务,但是它是被虚拟机启动的,下面就来看看我们自定义的线程是怎么启动的。自定义线程有两种方法可以启动(1)利用Thread类的子类实例启动线程(2)利用Runnable接口的实原创 2016-12-18 10:50:10 · 1034 阅读 · 2 评论 -
Java多线程设计(二)线程的基本知识(2)共享互斥
1. 概述接着上一章内容Java多线程设计(二)线程的基本知识(1),接下来就要谈一下线程的共享互斥。2. 线程的共享互斥多个线程在操作到同一个实例的时候,就可能会造成重大的灾难。最经典的就是银行取款的例子。在去银行取款的时候,比如说你取100,程序先判断你的余额够不够100,不够就取款失败,够就给你100然后将你的余额减去100。模拟代码如下public class Bank { priva原创 2016-12-18 16:31:54 · 854 阅读 · 0 评论 -
Java多线程设计(二)线程的基本知识(3)线程的协调
1. 概述在上一节Java多线程设计(二)线程的基本知识(2)共享互斥中,当有一个线程在执行synchronized实例方法时,其它线程就无法执行该方法。这是简单的共享互斥。假设现在我们想做进一步的处理,例如我现在有一个买烧鸡的店,我想只要店里还有烧鸡,我就让厨师等待着,不要做烧鸡先了,当消费者来买完我的烧鸡,我就通知厨师又开始做烧鸡。上面的情景可以用Java中的wait、notify和notify原创 2016-12-19 08:15:06 · 792 阅读 · 0 评论 -
Java多线程设计(三)线程安全问题
1. 概述我们经常会听到线程安全和非线程安全,比如说StringBuffer 是线程安全的,StringBuilder是非线程安全的。又比如说 Vector 是线程安全的,ArrayList是非线程安全的,然后又说线程安全的效率相对非线程安全的要低一些等等。那么线程安全和非线程安全到底是什么呢?2. 非线程安全非线程安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。原创 2016-12-19 18:57:57 · 884 阅读 · 0 评论 -
Java多线程设计(四)生产者/消费者模式
在生活中,供求关系是很常见的。一个卖烧鸭的,一个买烧鸭的,卖烧鸭的要有烧鸭,买烧鸭的才能买到烧鸭。所以,买烧鸭的要等卖烧鸭的准备好烧鸭,她才有得买。这就是典型的生产者/消费者模式呀。用Java线程描述这些事情,也是可以妥妥的。王大厨开了一间烧鸭店,每天生产100只烧鸭。张大妈今天家里摆酒请客,刚好要买100只烧鸭。王大厨做出的烧鸭都会挂在一个挂钩上,这些挂钩就像是一条队列,一只只烧鸭挂在上面,先做出原创 2016-12-20 21:48:37 · 784 阅读 · 0 评论 -
用Eclipse Debug的时候出现了惊人的一幕
今天在做算法题的时候,发现一个好奇怪的事情,就是用Eclipse Debug的时候发现,如果我用一个命名为len的变量来接受数组或者字符串长度的时候,当代码往下走,len会做自减,然而我的代码根本就没有len自减的语句,而当把len改成其它名字的话,就不会出现这个问题。看下面截图:当命名为len的时候,可以看到刚把数组赋值给len的时候,len的大小是10 当我往下执行的时候,奇怪的事情就发生了原创 2017-03-28 22:12:08 · 1300 阅读 · 0 评论 -
Collections.sort()和Arrays.sort()排序算法选择
今天面试的时候,被问到Collections.sort();和Arrays.sort();两个方法的排序算法实现,我只记得一个是快速排序一个是归并排序,但是刚刚看到没那么简单。Arrays.sort()先来看看Arrays.sort();,一点进这个方法会看到是这样子的public static void sort(int[] a) { DualPivotQuicksort.sort(a,原创 2017-03-31 20:09:04 · 27587 阅读 · 7 评论 -
详解JUC之锁——Lock与AQS(02)
前言在详解JUC之锁——概述(01)中我对JUC中的锁进行了概述,下面我就介绍一下它们的根基Lock接口和AQS类Lock看名字就知道Lock接口就是JUC中锁的顶级接口,支持语义不同的锁规则,比如说公平锁和非公平锁,独占锁(也可以叫互斥锁)和共享锁等。它最主要的两个方法就是lock()和unlock(),一看就知道是获取锁和释放锁。还有一个比较有趣的方法是boolean tryLock(long原创 2017-05-11 17:07:03 · 1728 阅读 · 0 评论 -
详解JUC之原子类使用及实现
前言我在详解JUC之原子类概述这篇文章中介绍了一下原子操作和JUC包下的原子类的类型,现在我就来介绍第一种原子类类型——操作基本类型的原子类操作基本类型的原子类操作基本类型的原子类有3个AtomicInteger:操作int类型AtomicLong:操作long类型AtomicBoolean:操作boolean类型这些操作基本类型数据的原子类的使用是非常简单的,你对基本类型数据的操作,在这些原创 2017-05-09 12:27:41 · 2010 阅读 · 0 评论