自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(96)
  • 资源 (2)
  • 收藏
  • 关注

原创 递归读取文件夹下的文件

如题:使用递归读取文件夹下面的所有文件/** * */package problem1;import java.io.File;/** * @author Hutongling * * @time:2017年4月30日 下午9:16:53 */public class 递归读取文件夹下面的所有文件 { /** * 递归读取文件夹下的 所有文件 *

2017-04-30 21:28:56 2038

转载 并发包中的Queue

说到队列尤其是阻塞队列,不得不说jdk的并发包(Java.util.concurrent)中的相关数据结构,今天我们就来对java(JDK1.7)中的队列做一个总结。1、Queue队列接口,定义了队列基本的接口方法前两个方法是往队列塞数据,在队列空间不足的情况下add会抛出异常,而offer会返回false。poll和peek的区别是后者不会从队列中移除元素。2、BlockingQueue、Bloc

2017-04-30 20:54:46 1557

转载 ConcurrentHashMap总结

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

2017-04-28 16:40:48 427

转载 ConcurrentHashMap原理分析

本文则重点介绍ConcurrentHashMap实现的细节。HashMap就不介绍了,具体请查看JDK7与JDK8中HashMap的实现HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占。ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行

2017-04-28 16:32:41 386

转载 JVM中的逃逸分析

逃逸分析(Escape Analysis)是目前Java虚拟机中比较前沿的优化技术。逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。例如:public static StringBuffer craeteStringBuffer(String s1, String s2) { StringB

2017-04-28 16:23:41 530

转载 Java中逆变与协变

看下面一段代码Number num = new Integer(1); ArrayList<Number> list = new ArrayList<Integer>(); //type mismatchList<? extends Number> list = new ArrayList<Number>();list.add(new Integer(1)); //errorlist.add

2017-04-28 16:22:14 403

转载 JDK7与JDK8中HashMap的实现

JDK7中的HashMapHashMap底层维护一个数组,数组中的每一项都是一个Entrytransient Entry<K,V>[] table;我们向 HashMap 中所放置的对象实际上是存储在该数组当中; 而Map中的key,value则以Entry的形式存放在数组中static class Entry<K,V> implements Map.Entry<K,V> { fin

2017-04-28 16:19:08 271

转载 尾递归

1. 什么是尾递归尾递归是指所有递归形式的调用,一定是发生在函数的末尾。形式上只要最后一个return语句是单纯函数就可以。如:return tailrec(x+1);而return tailrec(x+1) + x;或者return x*tailrec(x+1);都不可以。因为无法更新tailrec()函数内的实际变量,只是新建一个栈。2. 尾递归的好处尾递归和一般的递归不同在对内存的占用,普通递

2017-04-28 16:16:10 331

转载 Java中的陷阱题

1、找奇数:public static boolean isOdd(int i){ return i % 2 == 1; }上面的方法真的能找到所有的奇数么?A:没有考虑到负数问题,如果i为负则不正确。应该return i%2 == 02、浮点数相减System.out.println(2.0-1.9);A:Java中的简单浮点数类型float和double不能够进行运

2017-04-28 16:14:19 997

转载 高并发Java 十 JDK8对并发的新支持

1. LongAdder和AtomicLong类似的使用方式,但是性能比AtomicLong更好。LongAdder与AtomicLong都是使用了原子操作来提高性能。但是LongAdder在AtomicLong的基础上进行了热点分离,热点分离类似于有锁操作中的减小锁粒度,将一个锁分离成若干个锁来提高性能。在无锁中,也可以用类似的方式来增加CAS的成功率,从而提高性能。LongAdder原理图:At

2017-04-28 16:08:55 516

转载 高并发Java 九 锁的优化和注意事项

1. 锁优化的思路和方法在[高并发Java 一] 前言中有提到并发的级别。一旦用到锁,就说明这是阻塞式的,所以在并发度上一般来说都会比无锁的情况低一点。这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差一点。这里要注意的是,在[高并发Java 五] JDK并发包1中提到的ReentrantLock中的tryLock,偏向于一种无锁的方式,因

2017-04-28 16:06:24 1454

转载 高并发Java 八 NIO和AIO

IO感觉上和多线程并没有多大关系,但是NIO改变了线程在应用层面使用的方式,也解决了一些实际的困难。而AIO是异步IO和前面的系列也有点关系。在此,为了学习和记录,也写一篇文章来介绍NIO和AIO。什么是NIONIO是New I/O的简称,与旧式的基于流的I/O方法相对,从名字看,它表示新的一套Java I/O标 准。它是在Java 1.4中被纳入到JDK中的,并具有以下特性: NIO是基于块(

2017-04-28 16:01:23 774

转载 高并发Java 七 并发设计模式

1. 什么是设计模式在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到计算机科学的。 2. 单例模式单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为 比如:全局信息配置单例模式最

2017-04-28 15:50:52 2100

转载 高并发Java 六 JDK并发包2

1. 线程池的基本使用1.1.为什么需要线程池平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程。但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务。因此希望把尽可能多的cpu用在执行任务上面,而不是用在与业务无关的线程创建和销毁上面。而线程池则解决了这个问题,线程池的作用就是将线程进行复用。1.2.JDK为我们提供了哪些支持JDK中的相关

2017-04-28 15:31:42 477

转载 高并发Java 五 JDK并发包1

1. 各种同步控制工具的使用1.1 ReentrantLock ReentrantLock感觉上是synchronized的增强版,synchronized的特点是使用简单,一切交给JVM去处理,但是功能上是比较薄弱的。在JDK1.5之前,ReentrantLock的性能要好于synchronized,由于对JVM进行了优化,现在的JDK版本中,两者性能是不相上下的。如果是简单的实现,不要刻意去使用

2017-04-28 15:18:05 484

转载 高并发Java 四 无锁

1 无锁类的原理详解1.1 CASCAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V 值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么 都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成 操作。当多个线程同时使用CAS操作一个变量时,

2017-04-28 15:08:58 517

转载 高并发Java 三 Java内存模型和线程安全

网上很多资料在描述Java内存模型的时候,都会介绍有一个主存,然后每个工作线程有自己的工作内存。数据在主存中会有一份,在工作内存中也有一份。工作内存和主存之间会有各种原子操作去进行同步。 但是由于Java版本的不断演变,内存模型也进行了改变。本文只讲述Java内存模型的一些特性,无论是新的内存模型还是旧的内存模型,在明白了这些特性以后,看起来也会更加清晰。1. 原子性原子性是指一个操作是不可中断的

2017-04-28 15:06:17 322

转载 高并发Java 二 多线程基础

1. 什么是线程线程是进程内的执行单元某个进程当中都有若干个线程。使用线程的原因是,进程的切换是非常重量级的操作,非常消耗资源。如果使用多进程,那么并发数相对来说不会很高。而线程是更细小的调度单元,更加轻量级,所以线程会较为广泛的用于并发设计。在Java当中线程的概念和操作系统级别线程的概念是类似的。事实上,Jvm将会把Java中的线程映射到操作系统的线程区。2. 线程的基本操作2.1 线程状态图上

2017-04-28 14:55:48 282

转载 高并发Java 一

1、关于高并发的几个重要概念1.1 同步和异步首先这里说的同步和异步是指函数/方法调用方面。很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。1.2 并发和并行并发和并行在外在表象来说,是差不多的。由图所示,并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。所以单个cpu是不能做并行的,只能

2017-04-28 14:47:31 239

转载 java中IO流的知识点总结

1.流的概念流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。2.IO流的分类IO流分为字符流和字节流. 3.字节流和字符流的区别(1)字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是

2017-04-27 16:04:19 344

转载 final、finally和finalize的区别

final、finally和finalize的区别是什么? 我们首先来说说final,它可以用于以下四个地方: 定义变量,包括静态的和非静态的。 定义方法的参数。 定义方法。 定义类。 我们依次来回顾一下每种情况下final的作用。首先来看第一种情况,如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量;如果final修饰的是一个对象,就表示这个变量被赋予

2017-04-27 14:29:39 253

转载 Java 套接字

套接字(socket)为两台计算机之间的通信提供了一种机制,在 James Gosling 注意到 Java 语言之前,套接字就早已赫赫有名。该语言只是让您不必了解底层操作系统的细节就能有效地使用套接字。多数着重讨论 Java 编码的书或者未涵盖这个主题,或者给读者留下很大的想象空间。本教程将告诉您开始在代码中有效地使用套接字时,您真正需要知道哪些知识。我们将专门讨论以下问题:什么是套接字它位于您可

2017-04-25 19:14:17 1581

原创 数据库中的事务

事务:是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的逻辑工作单位,由DBMS

2017-04-25 17:03:08 538

原创 Java中的深浅拷贝

浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中

2017-04-24 19:17:50 256

原创 求最大面积

题目:对非负序列a1,a2,……,an,在数轴上做垂线连接点(i,0)和(i,ai)。选择这样的两条线和x轴可以形成一个容器,我们以面积代表所装的水,求以这种方式构成的容器能装的最大面积。比如选择a2=3,a5=6,则所装的面积为9.思路分析: 从两端逼近,求最大面积。代码:package 华为机试题;import java.util.LinkedList;/** * @author Huton

2017-04-24 14:49:31 618

原创 KMP算法

Java实现KMP算法 思想:每当一趟匹配过程中出现字符比较不等,不需要回溯i指针, 而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远 的一段距离后,继续进行比较。 时间复杂度O(n+m)代码实现:public class KMP { public static void main(String[] args) { String s = "abbabbbbca

2017-04-19 11:28:21 332

原创 计算多项式之积

求两个多项式成绩: pa=an*x^n + an-1*x^(n-1) + …… + a0 pb=bm*x^m + bm-1*x^(m-1) + …… + b0 其中an,an-1…… a0,bm,bm-1……b0均为正数,范围[-10000,10000],0<=n,m<=1000. pa和pb的格式为“(-3,5),(87,4),(93,3),(3,0)”表示一个多项式-3x^5+87x^4

2017-04-18 11:24:32 1532

转载 Java 中的IO模型

• BIO:JDK1.4之前的阻塞IO BIO,即为Blocking I/O,阻塞IO,大致流程为 1)服务端建立ServerSocket,以一个端口启动,2)等待客户端建立socket连接,如果没有连接,一直阻塞(等待),3)一个socket建立连接之后,从线程池中去一个线程取处理socket对于这种模型的总结:缺点:如果请求量过大,线程池不够用,那么会严重影响性能。目前tomcat I/

2017-04-17 11:32:18 369

原创 使用优先级队列求一个大数组中的前k个最大的数(或前k个最小的数)

/** * 对于一个数据量很大的数组,找出数组中前k个最大的数和前k个最小的数 */package 华为机试题;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter

2017-04-11 19:30:14 1124

原创 分割大文件

题目:将一个10亿个随机整数的txt文件分割成100个文件。/** * */package 华为机试题;import java.io.File;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.io.RandomAccessFile

2017-04-11 15:57:15 376

转载 Java IO:常见Java IO流介绍(ByteArrayInputStream,ObjectInputStream,BufferedInputStream)

在接触 Jaba IO 流的时候,个人觉得需要首先理解 装饰器模式,否则,当看到 如下的代码 会比较纠结:InputStream inputStream = new BufferedInputStream(new FileInputStream(filePath));然后,由于 Java 的 IO 流比较多,不同的流可以应对不同情景,下面举例介绍几种常见的流:FileInputStream Byt

2017-04-10 11:17:49 5515

转载 Java IO:操作系统的IO处理过程以及5种网络IO模型

当我们需要理解关于 IO 的时候,最好还是理解操作系统是如何处理IO的。操作系统如何处理IOLinux 会把所有的外部设备都看成一个文件来操作,对外部设备的操作可以看成是对文件的操作。我们对一个文件的读写,都会通过内核提供的系统调用,内核会给我们返回一个 File Descriptor,这个描述符是一个数字,指向内核的一个结构体,我们应用程序对文件的读写就是对描述符指向的结构体的读写。系统调用是如何

2017-04-10 11:15:11 2821 1

转载 Java 集合7:丰富的并发基础构建模块1 - 容器部分

目录:这一章主要介绍关于 Java 中同步并发的相关类,干货非常的多。介绍包括了:同步容器 1、Vector 2、HashTable并发容器 1、ConcurrentHashMap 2、CopyOnWriteArrayList同步容器效率低同步容器的概念就是说对容器状态的访问进行了串行化,来实现它们的安全性。这种串行的实现方法会严重的影响并发性能。例如 Vector 和 HashTable

2017-04-10 11:09:21 343

转载 Java 集合 6: WeakHashMap扩展知识1(原理与Reference相关)

前言 WeakHashMap 来实现了一个 LRU 缓存,这是一个比较顶层的具体使用,那么看下底层是如何实现的。WeakHashMap 中有一个成员变量比较关键:private final ReferenceQueue<Object> queue = new ReferenceQueue<>();对于 ReferenceQueue,里面有 Reference 类型的成员变量,这也是比较关键的一个类

2017-04-10 11:05:32 364

转载 Java 集合 5:HashSet ,TreeSet 实现原理

HashSetHashSet 实现了 Set 接口,而 Set 接口是继承于 Collection 接口,所以可以认为 Set 接口是 List 接口的兄弟。对于 Set 接口,如注释所说: * A collection that contains no duplicate elements. More formally, sets * contain no pair of elements <

2017-04-10 10:59:58 395

转载 Java 集合 4:TreeMap 的使用(不包括原理,仅仅是简单的使用 demo)

我们知道,HashMap 放入的 Entry 是没有顺序的,而 LinkedHashMap 是根据 put 的顺序或者是访问的顺序来排序,而不是根据 key 的大小来排序。那么 TreeMap 就有这样一个作用:根据 key 的大小进行排序。默认是升序的。TreeMap 源码注释的第一句就说了:A Red-Black tree based {@link NavigableMap} implement

2017-04-10 10:58:21 339

转载 Java 集合 3:LinkedHashMap工作原理及实现

LinkedHashMap 概述由于 HashMap 中的 entry 是无序的,也就是说,当 map.entrySet() 得到的 entry的集合既不能按照插入顺序排列,也不能按照访问先后顺序排序。那么 LinkedHashMap 就可以解决这个问题。LinkedHashMap 可以让元素:按照插入顺序排列 也可以按照访问的先后顺序排序这里需要注意,不能按照 key 的大小排序,那是 Tree

2017-04-10 10:55:51 335

转载 Java 集合 2:HashMap(put方法的实现与哈希冲突)

HashMap 概念对于 Map ,最直观就是理解就是键值对,映射,key-value 形式。一个映射不能包含重复的键,一个键只能有一个值。平常我们使用的时候,最常用的无非就是 HashMap。HashMap 实现了 Map 接口,允许使用 null 值 和 null 键,并且不保证映射顺序。HashMap 有两个参数影响性能:初始容量:表示哈希表在其容量自动增加之前可以达到多满的一种尺度 加载因

2017-04-10 10:52:38 796

转载 Java 集合 1:Collection,List,ArrayList,Vector,LinkedList(实现方式,对比)

Collection 与 ListCollection 是 Java 集合的一个根接口,JDK 没有它的实现类。 内部仅仅做 add(),remove(),contains(),size() 等方法的声明。List 接口是Collection 接口的一个子类,在Collection 基础上扩充了方法。同时可以对每个元素插入的位置进行精确的控制,它的主要实现类有 ArrayList,Vector,Li

2017-04-10 10:47:45 305

原创 Java 集合总结(Collection系列与Map系列)

Java 集合总结(Collection系列与Map系列)

2017-04-09 20:44:03 341

java高级篇:JVM调优.mp4

分析常见的JVM调优技术及其相关条件,以及在实战中怎么使用到相关的技术进行调优,比较适合中高级开发进行学习,适合对JVM理解较深的开发学习

2020-09-19

Java面试.docx

java面试100题,其中包含常见的java基础面试,还包含面试过程中问的最多的算法题,题题都有相关解答

2020-09-19

空空如也

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

TA关注的人

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