自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 问答 (1)
  • 收藏
  • 关注

原创 操作文件的两种方式Channel or Input/OutPstream

下面介绍两种读写文件的对比, 1:InputStream/OutputStream操作byte[]  2:Channel操作buffer(Reader /Writer读写文件的方式就不比较了,其性能比上面两种方式差很多)先来说说两种方式对比后的结果:总体来说第一种方式对比第二种方式有如下的缺点1:速度慢,下面代码运行结果表明 Channel操作buffer速度快于InputSt...

2018-01-27 14:57:18 1373 5

原创 Java8的四种函数式接口

java8提供的函数式接口在Function包下有几十个接口,但是这几十个接口是从下面4种接口扩展而来的。下面我们看看这四种函数式接口。java8的函数式编程主要就是4类接口。       Consumer(类似于消费者需要传入参数无返回值)       Supplier(类似于生产者不需要传入参数,但有返回值)       Function(有输入也有返回)     

2018-01-27 09:34:24 2321

原创 JDK自带的观察者模式

Jdk提供了一个类Observable(用于支持被观察者),一个接口(用于支持观察者)。观察者类实现Observer接口,被观察者继承Observable类就可以很方便地实现观察者模式了。代码如下。1:新建一个观察者类:student 其要实现Observer接口/** * 观察者类 * 创建日期: 2018年1月25日 * @author zhaosq */public cla

2018-01-27 09:27:33 353

原创 Java8 的stream

流与集合有以下几种不同:有存储。 流不是存储元素的数据结构; 相反,它通过计算操作的流水线传送诸如数据结构,阵列,生成器功能或I / O通道的源的元件。 功能性质。 流上的操作产生结果,但不会修改其来源。 例如,过滤从原Stream获得的Stream会将不需要过滤的元素生成新的Stream,而不是从源集合中删除元素。懒惰操作。 许多流操作(如过滤,映射或重复删除)可以懒惰地实现

2018-01-27 09:22:28 211

原创 基于自定义类加载器的远程调试服务器的方法

今天介绍一个机遇自定义类加载器的远程调试服务器程序的方法,这里只是为了演示类加载器的功能,千万不能再线上通过这种方式加载新的class。因为class最终会被加载到方法区,如果加载大量的class并且没有卸载没用的class的话很容易出现内存溢出异常。下面我们看看代码实现1:新建一个类加载器。其作用是将class文件的二进制流转化为数组,需要注意的是,在构造器里,必须将加载MyClassLoa...

2018-01-25 20:39:09 248

原创 web应用中 获取ServletContet方法

ServletContet的作用与功能这里就不用说了,大家可以去百度。尤其需要记住的一点是:ServletContet提供对应用程序中所有Servlet所共有的各种资源和功能的访问,以及重要共享数据的存储。在应用中获取ServletContext的几个方法:一:可以新建一个上下文监听类继承org.springframework.web.context.ContextLoaderListen

2018-01-14 11:56:10 423

原创 服务端通过生成字节码返回客服端解析为图像

在之前做项目的时候遇到过这样的情况,用户需要上传自己的头像图片,为了能在下次登录时展示这个图片,我们会把图片保存到项目中的某一个指定的文件夹里面,以便服务程序能访问到这张图片。(因为这个图片必须放到tomcat容器里面(webapps文件夹下面)能访问到的地方,程序才能访问到)。但是有一个问题是,这不利于程序包的更新,每次发布war包,tomcat将会解析出新的项目文件夹,原有的项目文件夹将会被替

2018-01-13 16:26:05 302

原创 ScheduledExecutorService 预定执行任务

预定执行任务的用法。public class Test{ public static void main(String[] a){ ScheduledExecutorService s = new ScheduledThreadPoolExecutor(3); Runnable task = new Runnable() { @Override public vo

2018-01-13 15:19:01 180

原创 ThreadPoolExecutor的四个拒绝策略

下面是建立一个线程池的基本语法,最后一个参数是线程池的拒绝策略。Jdk默认实现了4个拒绝策略。在下面四张图片中可以看到。ThreadPoolExecutor pool = new ThreadPoolExecutor(3, 6, 3000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque(), new T

2018-01-13 15:18:48 2131

原创 Collections.synchronizedXXX 集合同步

Collections.synchronizedCollection(Collectiont)Collections.synchronizedList(Listlist)Collections.synchronizedMap(Mapmap)Collections.synchronizedSet(Set t)上面几个方法是Collections工具类将集合变为多线程安全集合的主要

2018-01-13 14:44:35 990

原创 阻塞队列

阻塞队列与非阻塞队列的区别在于:当在阻塞队列没有元素是取出元素将会被阻塞(因为此时队列中没有元素),直到队列中有新的元素被阻塞的线程才会被唤醒。当在阻塞队列元素个数已经达到队列的容量时,若继续向队列新增元素将会被阻塞,直到队列中的元素个数小于队列的容量,被阻塞的线程才会被唤醒。其特点可以用于生产者消费者线程。下面是我自己写的一个很简单的阻塞队列(jdk有自己的官方实现的阻塞队列:ArrayBloc...

2018-01-10 19:08:23 151

原创 重入锁

只要线程已经获得某个对象的锁或者是获得了某个ReentrantLock锁,那么这个线程在未释放这个锁之前可以多次请求获取并能获得这个锁,因为锁有一个持有计数来跟踪获得锁的次数。比如,某个线程已经获得了一个锁(无论是对象锁还是ReentrantLock锁),那么他就可以继续请求并能获取到这个锁,其获得X次锁,则这个锁的持有计数就为X,每获取一次锁,持有计数加1,每释放一次锁持有计数减1直到持有计数变

2018-01-10 19:05:19 366

原创 死锁

死锁是什么意思呢?打一个很简单的比喻吧。我(线程A)有一本书(锁a),你(线程B)有一支笔(锁b)。现在我想得到你的笔,而你想得到我的书。但是我必须得到你的笔做完一些事情后才能把书给你,而你也必须得到我的书后才能把你的笔给我。这样你和我一直为了得到对方的东西(实际上永远得不到)而一直阻塞。程序如下: 解决死锁的三个想法是:一:以相同的顺序请求锁,上面的例子中,我先获得书,你先获取笔,程序可

2018-01-10 19:04:19 165

原创 WeakHashMap(弱引用)

在了解此知识点之前建议了解引用的知识点Renference(引用)(点击查看)先来看看源码:weakHashMap没什么特别的,知识其Entry继承了弱引用类,在新建一个Entry的时候,会根据这个键生成一个弱引用(见下图 2,3,4)去指向这个值,并将这个弱引用放入一个队列(这个队列是一个引用队列 见下图 1)

2018-01-10 19:01:34 569

原创 引用Reference

引用分为四类:强引用、软引用、弱引用、虚引用。引用的分类是为了垃圾收集器进行垃圾收集时对不同的引用采用不同的收集策略。下面我将用房屋(堆内存)的大扫除(垃圾收集)的场景来模拟垃圾收集时垃圾收集器如何对待这四类引用。强引用:这个对象我正在使用,不允许清除它。软引用:这个对象我正在使用,这个房间还有多余的空间,不允许清除它。(当然如果这个房间没有多余的空降的话,此对象将会被清除)。弱引用:

2018-01-10 18:57:50 308

原创 LinkedList

LinkedListLinkedList结构比较简单,存放的是“一串”node节点,每个节点不仅包含自己本身的值,还包括指向上一个元素以及下一个元素的引用。LinkedList的插入和删除效率很高,只需要断开原链接,操作(插入、删除)后,重新连接(改变引用指向)即可

2018-01-10 18:54:36 89

原创 ArrayList

ArrayListArrayList的底层实现比较简单,就是直接操作数组,简单直接、随机访问效率高在add之前调用 ensureCapacityInternal(size +1); 确认数组的大小,如果有需要则扩容。需要说明的是,ArrayList默认初始容量为10,每次扩容x1.5。

2018-01-10 18:53:10 106

原创 HashSet

HashSetHashSet的内部实现比较简单,其完全是基于HashMap的。下图可以看到,当你new一个hashSet的时候,将会创建一个HashMap, hashSet的add方法也是向HashMap里面put一个entry,entry的键就是你add的元素,entry的值就是一个Object对象

2018-01-10 18:50:51 98

原创 LinkedHashMap

LinkedHashMapLinkedHashMap存储方式仍然是HashMap的存储原理,只是存储的元素Node基于HashMap的Node进行了扩展,添加了支持链表结构的属性用于指向Node前后元素的before和after。此外LinkedHashMap多了一个用于是否支持LRU排序(最近最少使用原则)的accessOrder属性。1:首先LinkedHashMap继承了Ha

2018-01-10 18:48:25 193

原创 HashMap

HashMap HashMap的底层结构仍然是数组,下图中,hashMap有一个table属性,其是一个Node数组,这个Node实现了Map.Entry接口,即map所有的entry都是存放到这个数组里面的。下面我将用反射技术获取hashMap中的这个数组到底是如何存放数据的(注意Node<K,V>有一个next属性,这个属性很重要,也体现了HashMap设计的优美)...

2018-01-10 18:43:32 247

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除