- 博客(35)
- 资源 (7)
- 收藏
- 关注
原创 剑指offer-数组中的逆序对
数组中的逆序对题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如: 例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i< j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),
2016-06-30 16:44:37 968
原创 剑指offer-丑数
丑数 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路挺简单的,直接看代码:package com.genge.offer;/** * Created by Genge on 2016-06-30. */public class GetUglyNumbe
2016-06-30 11:38:08 456
原创 Java源代码分析之LinkedList
package java.util;import java.util.function.Consumer;/** * 非同步,双向链表(具有队列、栈的特性),可以加入null,fail-fast * 同步: List list = Collections.synchronizedList(new LinkedList(...)); * 关于fail-fast 更多信息,请看http://bl
2016-06-29 15:38:31 418
原创 JAVA中浅复制与深复制
JAVA中浅复制与深复制1.浅复制与深复制概念⑴浅复制(浅克隆)被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。 ⑵深复制(深克隆)被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的
2016-06-29 15:31:20 512
原创 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
整数中1出现的次数(从1到n整数中1出现的次数) 求出1 ~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解决思路 常规思路(暴力解决),一个数一个数的计数寻找
2016-06-28 22:34:28 14151 2
原创 剑指offer-最小的K个数
最小的K个数 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。输入 int[] input:待搜索的数组 ; int k:需要找出最小的数量输出 当k大于input长度时,返回空(非null);当k小于input长度时,返回input中最小的k个数字思路最粗暴方式,对数组所有元素排序(快排)利用冒泡排序
2016-06-27 21:45:39 562
原创 剑指offer-数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。基本上有三种思路首先对数组排序,然后统计某个数出现的次数,发现超过数组长度一半就返回结果求出数组中最大数,然后声明一个额外的数组counts,数组大小为最大
2016-06-27 19:26:55 497
原创 Java源代码分析之Vector数组
Vector源码分析每个Java程序员应该的特性可变长数组(grow or shrink)能够使用索引获取值(accessed using an integer index)多线程环境下线程安全类图package java.util;import java.util.function.Consumer;import java.util.function.Predicate;import
2016-06-27 16:16:38 2084
原创 JDK源码一句注释:c.toArray might (incorrectly) not return Object[] (see 6260652)
最近在看JDK的源码:CopyOnWriteArrayList.Java和ArrayList.java,这2个类的构造函数,注释中有一句话看不懂。[java] view plain copy public ArrayList(Collectionextends E> c) { elementData = c.toArray(); size
2016-06-17 21:40:42 2017
原创 Java集合迭代器之fail-fast机制
在JDK的Collection中我们时常会看到类似于这样的话: 例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器
2016-06-17 17:40:09 746 1
原创 Java源代码分析之Stack栈
Stack 源代码分析每个Java程序员应该了解的特性LIFO后进先出的特性在多线程环境下线程安全类图可以看到Stack直接继承Vector类层次图可以看到,jdk还啰嗦的为大家添加了一个实现类,StringStack,其实根本没必要的吧,大体看了下,一共只有5个方法,加一个序列号字段,内部实现全部是复用父类的方法,完全可以自己实现的,有点多余啦,另外在继承Vector类中也就Stack了,
2016-06-16 10:44:57 1017
原创 Java数据结构之多项式加法和乘法实现
Java数据结构复习之多项式加法和乘法实现存储结构 数组链表数组实现package com.genge.jichu.polyn;/** * 用数组表示的多项式,以及相关实现 * Created by Genge on 2016-06-15. */public class Polynomial { /** * 多项式的加法 * * @param a
2016-06-15 19:07:34 9152 2
原创 Java源代码分析之StringBuffer
StringBuffer源码分析每个Java程序员基本都了解的长度可变字符操作工具类在多线程环境下线程安全额,好像想不到其他的呢?所以需要去阅读并分析源码StringBuffer类图,如下可以看到 StringBuffer继承自AbstractStringBuilder(实现了Appendable接口),实现了Serializable和CharSequence接口。源码分析(加入自己所
2016-06-14 20:49:11 1735
原创 Java多种方式自定义序列化
我们知道,通过实现java.io.Serializable接口可以使得该类的实例能够被序列化。例如如下的Person类,import java.io.Serializable;public class Person implements Serializable { private String name; private int age; public P
2016-06-14 20:45:07 3820
原创 Java并发编程:Callable、Future和FutureTask
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。
2016-06-13 17:20:32 371
原创 公平锁与非公平锁
在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:public ReentrantLock() {sync = new NonfairSync();}在公平的锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上,则允许‘插队’:当一个线程请求非公平锁时,如果在发出请求的同时该锁变成可用状态,那么这个线程会跳过队列中所有的等待线程而获得锁。
2016-06-12 16:31:23 681
原创 Java中13个原子操作类
原子更新方式原子更新基本类型原子更新数组原子更新引用原子更新属性(字段)原子更新基本类型AtomicBoolean :原子更新布尔类型AtomicInteger: 原子更新整型AtomicLong: 原子更新长整型原子更新数组AtomicIntegerArray :原子更新整型数组里的元素AtomicLongArray :原子更新长整型数组里的元素AtomicReferenceAr
2016-06-12 15:12:35 3747 1
原创 ConcurrentHashMap、HashMap、HashTable区别
线程不安全的HashMap 多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next的节点永远不为空,就会产生死循环的Entry。package com.genge.multithread;import java.util.HashMap;import
2016-06-10 14:51:02 609
原创 Java多线程基础知识疑难点
最简单Java程序包含有哪些线程Threadyield误用线程优先级Priority参数靠谱吗Daemon线程会导致finally不能执行线程中断状态判断使用模板设计模式实现独占锁同步组件AQS队列同步器独占式同步状态获取与释放过程最简单Java程序包含有哪些线程?代码为证:/** * Created by Genge on 2016-06-07. */public class M
2016-06-10 14:16:05 1583
转载 深入理解Java内存模型——volatile
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0L
2016-06-06 15:46:01 329
原创 Java并发:volatile内存可见性和指令重排
volatile两大作用1、保证内存可见性2、防止指令重排 此外需注意volatile并不保证操作的原子性。(一)内存可见性1 概念 JVM内存模型:主内存和线程独立的工作内存Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存(比如CPU的寄存器),线程只能访问自己的工作内存
2016-06-06 15:33:37 1041
转载 Java内存模型之重排序
什么是重排序请先看这样一段代码1public class PossibleReordering {static int x = 0, y = 0;static int a = 0, b = 0;public static void main(String[] args) throws InterruptedException { Thread one = new Thr
2016-06-06 15:14:17 1508
原创 Spring 源码下载---从github导入源码到idea
先说说大家都知道的步骤安装git或者github客户端java环境JDK安装gradle下载安装git clone github上spring源码gradlew cleanIdea :spring-oxm:compileTestJavaimport导入project大概也就这么多吧下面我来分享我导入的时候几个问题选择git还是github客户端? 这个真的跟你的网速有关了,网速好
2016-06-05 10:39:21 3636
转载 浅谈Java泛型中的extends和super关键字
通配符在本文的前面的部分里已经说过了泛型类型的子类型的不相关性。但有些时候,我们希望能够像使用普通类型那样使用泛型类型:向上造型一个泛型对象的引用向下造型一个泛型对象的引用向上造型一个泛型对象的引用例如,假设我们有很多箱子,每个箱子里都装有不同的水果,我们需要找到一种方法能够通用的处理任何一箱水果。更通俗的说法,A是B的子类型,我们需要找到一种方法能够将C类型的实例
2016-06-03 15:07:59 1221
原创 JVM 并发性: 阻塞还是不阻塞?
在任何并发性应用程序中,异步事件处理都至关重要。事件来源可能是不同的计算任务、I/O 操作或与外部系统的交互。无论来源是什么,应用程序代码都必须跟踪事件,协调为响应事件而采取的操作。Java 应用程序可采用两种基本的异步事件处理方法:该应用程序有一个协调线程等待事件,然后采取操作,或者事件可在完成时直接执行某项操作(通常采取执行应用程序所提供的代码的方式)。让线程等待事件的方法被称为阻塞 方法。让
2016-06-02 16:10:22 1220 1
原创 网络编程:Reactor与Proactor的概念(设计模式)
1、标准定义两种I/O多路复用模式:Reactor和Proactor一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理
2016-06-02 14:36:02 980
原创 Java NIO系列教程(十二) Java NIO与IO
当学习了Java NIO和IO的API后,一个问题马上涌入脑海:我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。Java NIO和IO的主要区别下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。IO NIO面向流
2016-06-02 12:22:23 391
原创 Java NIO系列教程(十一) Pipe
Java NIO 管道是2个线程之间的单向数据连接。Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取。这里是Pipe原理的图示:创建管道通过Pipe.open()方法打开管道。例如:1Pipe pipe = Pipe.open();向管道
2016-06-02 11:21:25 431
原创 Java NIO系列教程(十) Java NIO DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道。因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入。它发送和接收的是数据包。打开 DatagramChannel下面是 DatagramChannel 的打开方式:1DatagramChannel channel = DatagramChan
2016-06-02 11:14:57 316
原创 Java NIO系列教程(九) ServerSocketChannel
Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样。ServerSocketChannel类在 java.nio.channels包中。这里有个例子:01ServerSocketChannel serverSocketChannel = Serv
2016-06-02 11:12:21 337
原创 Java NIO系列教程(八) SocketChannel
Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道。可以通过以下2种方式创建SocketChannel:打开一个SocketChannel并连接到互联网上的某台服务器。一个新连接到达ServerSocketChannel时,会创建一个SocketChannel。打开 SocketChannel下面是SocketChannel的打开方式:
2016-06-02 11:08:52 277
原创 Java NIO系列教程(七) FileChannel
Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。打开FileChannel在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、OutputStream或RandomAcc
2016-06-02 10:57:12 245
原创 Java NIO系列教程(六) Selector
Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。下面是本文所涉及到的主题列表:为什么使用Selector?Selector的创建向Selector注册通道SelectionKey通过Selector选择通道wakeUp()close()完整
2016-06-02 10:42:49 433
原创 Java NIO系列教程(五) 通道之间的数据传输
在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel。transferFrom()FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此
2016-06-02 10:16:27 331
原创 Java NIO系列教程(四) Scatter/Gather
Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作。分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中。因此,Channel将从Channel中读取的数据“分散(scatter)”到多个Buffer中。聚集(ga
2016-06-02 10:11:30 297
高质量C++。doc
2018-11-27
prototype1.7.js
2014-08-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人