自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tugangkai的专栏

打断点

  • 博客(38)
  • 资源 (1)
  • 收藏
  • 关注

转载 Java NIO与IO比较总结

在学习标准IO相关接口和NIO接口时,我们常常面临一个问题:什么时候应该使用IO接口?什么时候应该使用NIO接口?这里我们将对比较Java NIO 和 IO的区别,他们的使用场景,如何使用他们编写高效的代码。Java NIO和IO的主要区别下边的表对比了二者的主要区别。IO基于Stream 阻塞NIO基于Buffer 非阻塞 Selector支持1.基于S...

2019-02-28 21:23:00 200

转载 常见文件类型处理: 属性文件/CSV/EXCEL/HTML/压缩文件

在日常编程中,我们还经常会需要处理一些具体类型的文件,如CSV, Excel, HTML,直接使用前面几节介绍的方式来处理一般是很不方便的,往往有一些第三方的类库,基于之前介绍的技术,提供了更为方便易用的接口。本节,我们就来简要介绍如何利用Java SDK和一些第三方类库,来处理如下五种类型的文件:属性文件:属性文件是常见的配置文件,用于在不改变代码的情况下改变程序的行为。 CSV:CS...

2019-02-25 01:09:27 1080

转载 Java序列化

我们在将对象保存到文件时,使用的是DataOutputStream,从文件读入对象时,使用的是DataInputStream, 使用它们,需要逐个处理对象中的每个字段,我们提到,这种方式比较啰嗦,Java中有一种更为简单的机制,那就是序列化。简单来说,序列化就是将对象转化为字节流,反序列化就是将字节流转化为对象。在Java中,具体如何来使用呢?它是如何实现的?有什么优缺点?本节就来探讨这些问题...

2019-02-24 22:24:35 93

转载 内存映射文件及其应用 - 实现一个简单的消息队列

本节介绍内存映射文件,内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持。我们先来介绍内存映射文件的基本概念,它是什么,能解决什么问题,然后我们介绍如何在Java中使用,我们会设计和实现一个简单的、持久化的、跨程序的消息队列来演示内存映射文件的应用。基本概念所谓内存映射文件,就是将文件映射到内存,文件对应于内存中的一个字节数组,对文件的操作变为对这个字...

2019-02-24 21:58:12 463

转载 随机读写文件及其应用 - 实现一个简单的KV数

Java中还有一个类RandomAccessFile,它没有这两个限制,既可以读,也可以写,还可以随机读写,它是一个更接近于操作系统API的封装类。本节,我们介绍就来介绍这个类,同时,我们介绍它的一个应用,实现一个简单的键值对数据库,怎么实现数据库呢?我们先来看RandomAccessFile的用法。RandomAccessFile构造方法RandomAccessFile有如下构造...

2019-02-24 20:51:52 412

转载 文件和目录操作

文件和目录操作最终是与操作系统和文件系统相关的,不同系统的实现是不一样的,但Java中的java.io.File类提供了统一的接口,底层它会通过本地方法调用操作系统和文件系统的具体实现,本节,我们就来介绍File类。File类中的操作大概可以分为三类:文件元数据 文件操作 目录操作 在介绍这些操作之前,我们先来看下File的构造方法。构造方法File既可以表示文件,也可以表示...

2019-02-24 20:02:03 269

转载 文本文件和字符流

我们提到,对于文本文件,字节流没有编码的概念,不能按行处理,使用不太方便,更适合的是使用字符流,本节就来介绍字符流。我们首先简要介绍下文本文件的基本概念、与二进制文件的区别、编码、以及字符流和字节流的区别,然后我们介绍Java中的主要字符流,它们有:Reader/Writer:字符流的基类,它们是抽象类。 InputStreamReader/OutputStreamWriter:适配器类...

2019-02-24 17:54:11 518

转载 二进制文件和字节流

本节我们介绍在Java中如何以二进制字节的方式来处理文件,上节我们提到Java中有流的概念,以二进制方式读写的主要流有:InputStream/OutputStream: 这是基类,它们是抽象类。 FileInputStream/FileOutputStream: 输入源和输出目标是文件的流。 ByteArrayInputStream/ByteArrayOutputStream: 输入源和...

2019-02-24 16:40:34 7105

转载 Java文件概述

基本概念和常识二进制思维为了透彻理解文件,我们首先要有一个二进制思维。所有文件,不论是可执行文件、图片文件、视频文件、Word文件、压缩文件、txt文件,都没什么可神秘的,它们都是以0和1的二进制形式保存的。我们所看到的图片、视频、文本,都是应用程序对这些二进制的解析结果。作为程序员,我们应该有一个编辑器,能查看文件的二进制形式,比如UltraEdit,它支持以十六进制进行查看和编辑。...

2019-02-24 15:39:04 321

转载 Java并发总结

多线程开发有两个核心问题,一个是竞争,另一个是协作。竞争会出现线程安全问题,所以,本节首先总结线程安全的机制,然后是协作的机制。管理竞争和协作是复杂的,所以Java提供了更高层次的服务,比如并发容器类和异步任务执行服务,我们也会进行总结。本节纲要如下:线程安全的机制 线程的协作机制 容器类 任务执行服务线程安全的机制线程表示一条单独的执行流,每个线程有自己的执行计数器,有自己的栈,...

2019-02-23 18:28:51 102

转载 并发同步协作工具

Java并发包中有一些专门的同步工具类,本节,我们就来探讨它们。我们要探讨的工具类包括:读写锁ReentrantReadWriteLock 信号量Semaphore 倒计时门栓CountDownLatch 循环栅栏CyclicBarrier 与71节介绍的显示锁和72节介绍的显示条件类似,它们也都是基于AQS实现的,AQS可参看71节。在一些特定的同步协作场景中,相比使用最基本的w...

2019-02-23 17:52:43 260

转载 Java定时任务

本节探讨定时任务,定时任务的应用场景是非常多的,比如:闹钟程序或任务提醒,指定时间叫床或在指定日期提醒还信用卡 监控系统,每隔一段时间采集下系统数据,对异常事件报警 统计系统,一般凌晨一定时间统计昨日的各种数据指标在Java中,有两种方式实现定时任务:使用java.util包中的Timer和TimerTask 使用Java并发包中的ScheduledExecutorService...

2019-02-23 16:56:38 506

转载 方便的CompletionService

我们提到,在异步任务程序中,一种常见的场景是,主线程提交多个异步任务,然后希望有任务完成就处理结果,并且按任务完成顺序逐个处理,对于这种场景,Java并发包提供了一个方便的方法,使用CompletionService,这是一个接口,它的实现类是ExecutorCompletionService,本节我们就来探讨它们。基本用法接口和类定义与77节介绍的ExecutorService一样,...

2019-02-23 15:43:24 162

转载 Java线程池

上节,我们初步探讨了Java并发包中的任务执行服务,实际中,任务执行服务的主要实现机制是线程池,本节,我们就来探讨线程池。基本概念线程池,顾名思义,就是一个线程的池子,里面有若干线程,它们的目的就是执行提交给线程池的任务,执行完一个任务后不会退出,而是继续等待或执行新任务。线程池主要由两个概念组成,一个是任务队列,另一个是工作者线程,工作者线程主体就是一个循环,循环从队列中接受任务并执行,...

2019-02-23 15:32:10 134

转载 异步任务执行服务

Java并发包提供了一套框架,大大简化了执行异步任务所需的开发,本节我们就来初步探讨这套框架。在之前的介绍中,线程Thread既表示要执行的任务,又表示执行的机制,而这套框架引入了一个"执行服务"的概念,它将"任务的提交"和"任务的执行"相分离,"执行服务"封装了任务执行的细节,对于任务提交者而言,它可以关注于任务本身,如提交任务、获取结果、取消任务,而不需要关注任务执行的细节,如线程创建、任...

2019-02-23 15:22:26 235

转载 java读写锁:ReentrantReadWriteLock

概述  ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时Reen...

2019-02-23 01:50:32 107

原创 java 锁的类型

读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多...

2019-02-23 00:57:09 90

转载 并发容器 - 各种队列

本节,我们来探讨Java并发包中的各种队列。Java并发包提供了丰富的队列类,可以简单分为:无锁非阻塞并发队列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞队列:基于数组的ArrayBlockingQueue,基于链表的LinkedBlockingQueue和LinkedBlockingDeque 优先级阻塞队列:PriorityBloc...

2019-02-22 01:32:59 113

转载 ConcurrentHashMap总结

并发编程实践中,ConcurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上提供了更好的写并发能力,但同时降低了对读一致性的要求(这点好像CAP理论啊 O(∩_∩)O)。ConcurrentHashMap的设计与实现非常精巧,大量的利用了volatile,f...

2019-02-22 00:05:04 143

转载 JAVA HASHMAP的死循环

问题最近的几次面试中,我都问了是否了解HashMap在并发使用时可能发生死循环,导致cpu100%,结果让我很意外,都表示不知道有这样的问题,让我意外的是面试者的工作年限都不短。由于HashMap并非是线程安全的,所以在高并发的情况下必然会出现问题,这是一个普遍的问题,虽然网上分析的文章很多,还是觉得有必须写一篇文章,让关注我公众号的同学能够意识到这个问题,并了解这个死循环是如何产生的。...

2019-02-21 21:47:24 153

转载 并发容器 - 写时拷贝的List和Set

本节以及接下来的几节,我们探讨Java并发包中的容器类。本节先介绍两个简单的类CopyOnWriteArrayList和CopyOnWriteArraySet,讨论它们的用法和实现原理。它们的用法比较简单,我们需要理解的是它们的实现机制,Copy-On-Write,即写时拷贝或写时复制,这是解决并发问题的一种重要思路。CopyOnWriteArrayList基本用法CopyOnWrit...

2019-02-21 20:59:26 292

转载 显式条件

上节我们介绍了显式锁,本节介绍关联的显式条件,介绍其用法和原理。显式条件也可以被称做条件变量、条件队列、或条件,后文我们可能会交替使用。用法基本概念和方法锁用于解决竞态条件问题,条件是线程间的协作机制。显式锁与synchronzied相对应,而显式条件与wait/notify相对应。wait/notify与synchronized配合使用,显式条件与显式锁配合使用。条件与锁相关联,...

2019-02-21 20:38:31 134

转载 显式锁

我们介绍了利用synchronized实现锁,我们提到了synchronized的一些局限性,本节,我们探讨Java并发包中的显式锁,它可以解决synchronized的限制。Java并发包中的显式锁接口和类位于包java.util.concurrent.locks下,主要接口和类有:锁接口Lock,主要实现类是ReentrantLock 读写锁接口ReadWriteLock,主要实现类...

2019-02-21 16:25:43 146

转载 Java CAS 和ABA问题

独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。一、CAS 操作乐观锁用到的机制就是CAS,Compare and Swap。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值...

2019-02-21 13:36:12 157

转载 神奇的堆

前面几节介绍了Java中的基本容器类,每个容器类背后都有一种数据结构,ArrayList是动态数组,LinkedList是链表,HashMap/HashSet是哈希表,TreeMap/TreeSet是红黑树,本节介绍另一种数据结构 - 堆。引入堆之前我们提到过堆,那里,堆指的是内存中的区域,保存动态分配的对象,与栈相对应。这里的堆是一种数据结构,与内存区域和分配无关。堆是什么结构呢?这...

2019-02-21 13:19:06 275

转载 基于跳跃表的 ConcurrentSkipListMap 内部实现(Java 8)

我们知道 HashMap 是一种键值对形式的数据存储容器,但是它有一个缺点是,元素内部无序。由于它内部根据键的 hash 值取模表容量来得到元素的存储位置,所以整体上说 HashMap 是无序的一种容器。当然,jdk 中也为我们提供了基于红黑树的存储的 TreeMap 容器,它的内部元素是有序的,但是由于它内部通过红黑结点的各种变换来维持二叉搜索树的平衡,相对复杂,并且在并发环境下碍于 rebal...

2019-02-20 16:12:48 188

转载 解析TreeSet

我们提到,HashSet有一个重要局限,元素之间没有特定的顺序,我们还提到,Set接口还有另一个重要的实现类TreeSet,它是有序的,与HashSet和HashMap的关系一样,TreeSet是基于TreeMap的,上节我们介绍了TreeMap,本节我们来详细讨论TreeSet。下面,我们先来看TreeSet的用法,然后看实现原理,最后总结分析TreeSet的特点。基本用法构造方法...

2019-02-20 15:31:25 237

转载 将数组转换成集合Arrays.asList,不可进行add和remove操作的原因

直接上代码:import java.util.Arrays;import java.util.List; public class Test {    public static void main(String[] args) {          Integer a[] = {1,2,5,6,9};        List<Integer> list = Arra...

2019-02-20 15:19:28 148

转载 TreeMap运用与原理

我们提到,HashMap有一个重要局限,键值对之间没有特定的顺序,我们还提到,Map接口有另一个重要的实现类TreeMap,在TreeMap中,键值对之间按键有序,TreeMap的实现基础是排序二叉树,上节我们介绍了排序二叉树的基本概念和算法,本节我们来详细讨论TreeMap。除了Map接口,因为有序,TreeMap还实现了更多接口和方法,下面,我们先来看TreeMap的用法,然后探讨其内部实...

2019-02-20 02:37:54 358

转载 HashSet运用及原理

上节介绍了HashMap,提到了Set接口,Map接口的两个方法keySet和entrySet返回的都是Set,本节,我们来看Set接口的一个重要实现类HashSet。与HashMap类似,字面上看,HashSet由两个单词组成,Hash和Set,Set表示接口,实现Set接口也有多种方式,各有特点,HashSet实现的方式利用了Hash。下面,我们先来看HashSet的用法,然后看实现原...

2019-02-20 02:27:45 479

转载 HashMap运用及原理

前面两节介绍了ArrayList和LinkedList,它们的一个共同特点是,查找元素的效率都比较低,都需要逐个进行比较,本节介绍HashMap,它的查找效率则要高的多,HashMap是什么?怎么用?是如何实现的?本节详细介绍。字面上看,HashMap由两个单词组成,Hash和Map,这里Map不是地图的意思,而是表示映射关系,是一个接口,实现Map接口有多种方式,HashMap实现的方式利用...

2019-02-20 02:20:54 195

转载 解析LinkedList

上节我们介绍了ArrayList,ArrayList随机访问效率很高,但插入和删除性能比较低,我们提到了同样实现了List接口的LinkedList,它的特点与ArrayList几乎正好相反,本节我们就来详细介绍LinkedList。除了实现了List接口外,LinkedList还实现了Deque和Queue接口,可以按照队列、栈和双端队列的方式进行操作,本节会介绍这些用法,同时介绍其实现原理...

2019-02-20 02:08:53 167

转载 解析ArrayList

我们先来看它的基本用法。基本用法新建ArrayListArrayList是一个泛型容器,新建ArrayList需要实例化泛型参数,比如:ArrayList<Integer> intList = new ArrayList<Integer>();ArrayList<String> strList = new ArrayList<Stri...

2019-02-20 01:58:05 290

转载 Java集合类: Set、List、Map、Queue使用场景梳理

本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景相关学习资料http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F%E5%8F%8Ajava%E9%9B%86%E5%90%88%E7%B1%BB%E8%AF%A6%E8%A7%A3%28collection%E3%80%81...

2019-02-20 01:15:53 112

转载 AbstractQueuedSynchronizer的介绍和原理分析

目录 简介API说明示例实现分析public final void acquire(int arg)public final boolean release(int arg)protected boolean tryAcquire(int arg)public final void acquireInterruptibly(int arg)private b...

2019-02-18 23:39:52 107

转载 Java线程状态及其转移

  说到线程,一定要谈到线程状态,不同的状态说明线程正处于不同的工作机制下,不同的工作机制下某些动作可能对线程产生不同的影响。    Java语言定义了6中状态,而同一时刻,线程有且仅有其中的一种状态。要获取Java线程的状态可以使用 java.lang.Thread类中定义的 getState()方法,获取当前线程的状态就可以使用Thread.currentThread().getState...

2019-02-18 21:58:04 2185

原创 String比较中的=与equals方法

我们先看代码String str1 = new String("hello");String str2 = "hello"; System.out.println("str1==str2: " + (str1==str2)); \\1System.out.println("str1.equals(str2): " + str1.equals(str2)); \\2输出结果:st...

2019-02-18 21:03:51 293

转载 java序列化与反序列化

序列化与反序列化序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等。在网络传输过程中,可以是字节或是XML等格式。而字节的或XML编码格式可以还原完全相等的对象。这个相反的过程又称为反序列化。Java对象的序列化与反序列化在Java中,我们可以通过多种方式来创建对象,并且只要对象没有被回收...

2019-02-18 18:03:52 75

系统分析师UML用例实战

学习软件架构与设计很好的参考资料,里面的内容结合实际,更容易理解。

2013-12-26

空空如也

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

TA关注的人

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