
java程序语言
hust_dxxxd
这个作者很懒,什么都没留下…
展开
-
Java适配器模式、代理模式及动态代理
适配器模式和代理模式表面上看来都是通过添加中间层来解除紧耦合的问题,那么这两种模式有什么区别呢,刚学不久的人真心会感到混乱。 适配器模式主要解决的是接口的兼容性问题,比如有A、B两个接口,在客户端,应用程序主要使用的是A接口提供的服务,在使用的过程中,发现B接口和A接口提供的服务具有相似性,因此我想在不改动我应用程序的基础上也能获取B接口的服务。怎么办呢,如果对B接口(及实现它的子原创 2016-03-05 16:37:28 · 2031 阅读 · 0 评论 -
java初始化实例
偶然间看到这样一道题目(来自这位作者的博客):public class Base{ private String baseName = "base"; public Base() { callName(); } public void callName() { System. out. println(baseName); }原创 2016-04-20 11:06:41 · 432 阅读 · 0 评论 -
Java的并发
进程与线程进程是程序的执行实例,是cpu资源分配的最小单位 线程,进程中多个任务的同时执行,可以共享进程的内存、变量,良好的数据共享。竞争条件:计算的结果取决于多个线程(或者进程)执行的精确的时序,称为竞争条件(这样导致结果的错误或不可靠)。Thread类Thread类本身就实现了Runnable接口,构造方法可以传输一个Runnable。线程状态:就绪、执行和阻塞,另外还可以扩展为新建(n原创 2016-03-25 21:12:44 · 278 阅读 · 0 评论 -
Java的并发(二) 同步
一下内容主要是学习的博客http://www.cnblogs.com/dolphin0520/p/3923167.html 中的内容,加上自己的一些理解和找资料后的补充。同步问题在多线程程序中,因为各线程访问时机的不可控,在对共享资源的访问中很可能会产生不一致性,产生错误的结果。这就是线程安全问题。 这时候就需要对互斥资源(临界资源)进行访问的同步,一般都是通过对互斥资源进行序列化访问来解决的。一原创 2016-05-05 22:20:31 · 406 阅读 · 0 评论 -
链表有环找入口的问题
之前遇到过这个问题,记得方法是先分别用两个快、慢指针,让他们在环中相遇,然后一个从头结点,一个从相遇点,都一次走一步,相遇点即为入口点。 但是关于这个结论的证明,看了网上好几个博客,感觉都说的不够清晰,印象中有一篇讲得还不错,还算理解了它的思想,今天做题时想要去搜结果搜不到了。 这里写下我自己的一点理解: 其中p点为快慢指针的相遇点。原创 2016-05-17 15:35:44 · 506 阅读 · 1 评论 -
Java并发(三) JMM与volatile关键字
JMM规定原创 2016-05-06 18:36:39 · 704 阅读 · 0 评论 -
JVM的内存布局
JVM运行时,将内存分为如下几个区域:程序计数器:为线程私有,当多线程轮流执行时,就是同个各线程独立的程序计数器来实现。Java虚拟机栈:虚拟机栈也是线程私有的,虚拟机栈描述了Java方法执行的内存模型,每个方法在执行时都会创建一个栈帧,存储局部变量表,操作数栈,动态链接,方法出口等信息。该区域可能出现的StackOverflowError和OutOfMemoryError:线程请求的栈深度大于原创 2016-04-16 22:17:38 · 312 阅读 · 0 评论 -
Java并发(三) ThreadLocal关键字
TheadLocal称为线程本地存储,就是说一个变量,每个线程都有它的一个副本,并且相互之间是独立的。ThreadLocal类的实现下面是该类的提供的关键的几个方法:public T get() { }public void set(T value) { }public void remove() { }protected T initialValue() { }通过查看jdk中该类的源码,可原创 2016-05-09 17:17:36 · 937 阅读 · 0 评论 -
Java阻塞队列与管程
由于Java提供的用户级线程,这使得在Java中我们可以看到更多的关于线程的东西。最近看操作系统,在生产者消费者模型中,经典的信号量、互斥量解决方式之外,还有一种管程的解决方案。管程实际上是比信号量更高级的一种同步原语。发现在《现代操作系统》p79页中用管程实现生产者消费者问题的解法时,所用的管程不就是之前遇到过的阻塞队列解决方式吗?再回头看之前的 这篇博文最后一部分代码,发现两者本质上没有差别,这原创 2016-07-13 00:50:56 · 620 阅读 · 0 评论 -
String,StringBuffer,StringBuilder 三者的区别
String,StringBuffer,StringBuilder 三者的区别? String是final的,当对String进行改变的时候,其实会生成一个新对象:经常改变的对象建议不要使用String,而是使用StringBuffer或者StringBuilder。StringBuffer:对该对象本身进行操作。 StringBuilder:与StringBuffer类似,不过针对单线程设计的原创 2016-08-06 22:54:00 · 501 阅读 · 0 评论 -
java的枚举类型
java中的枚举?enum和Enum类 java中引入了枚举,通过enum关键字定义或者定义class继承Enum类。 直接使用常量的问题:一致性差(貌似enum也有这个问题?);没有命名空间;类型无意义; enum实际上采用了类似Map<id, value>这样的存储结构,所以可以通过enum.value(String)来获取对应的enum值。可以简单的理解为包含(id,value)对的对象原创 2016-08-06 23:56:23 · 253 阅读 · 0 评论 -
java集合框架
Q:LinkedList源码? 实现了List、Deque接口,底层实现是双向(循环)链表,head节点不包含数据,可被当作堆栈、队列或者双端队列使用。双端队列的插入,addBefore(e, entry)的实现。 构造新的Entry,前后指针分别指向 entry 的pre和entry,然后调整entry的next以及entry的previous。 ListIterator接口。可以被当原创 2016-08-07 21:32:18 · 341 阅读 · 0 评论 -
Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界转载 2016-08-10 01:34:25 · 414 阅读 · 0 评论 -
浅谈java异常[Exception]
一. 异常的定义在《java编程思想》中这样定义 异常:阻止当前方法或作用域继续执行的问题。虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常。绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败。之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意。记得当初学习java的时候,异常总是搞不太清楚,不知道这个异转载 2016-08-21 23:58:38 · 424 阅读 · 0 评论 -
javaIO流接口总结
Java流操作有关的类或接口:Java流类图结构: 流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。 IO流的分类根据处理数据类型的不同分为:字符流和字节流根据数据流向不同分为:输转载 2016-08-22 00:12:23 · 2853 阅读 · 0 评论 -
Java IO : 流,以及装饰器模式在其上的运用
流概述Java中,流是一种有序的字节序列,可以有任意的长度。从应用流向目的地称为输出流,从目的地流向应用称为输入流。Java的流族谱Java的 java.io 包中囊括了整个流的家族,输出流和输入流的谱系如下所示:InputStream和OutputStreamInputStream和OutputStream分别是输入输出流的顶级抽象父类,只定义了一转载 2016-08-22 00:27:42 · 638 阅读 · 0 评论 -
Java集合类中排序API的稳定性
最近写代码,题目要求排序是稳定的,之前一直用 Arrays.sort、Collections.sort等诸如此类的方法,没有在意是否稳定的。 查了一下:Arrays.sort(T[],Comparator原创 2016-09-02 16:34:46 · 4368 阅读 · 1 评论 -
JavaIO之OJ上面的输入输出
Scanner类Q:nextInt()、nextLine()、next()三个典型的方法有何区别? A:nextInt()读取下一个int型标志的token,焦点不会移动到下一行,使用nextLine()方法时会读取该行剩余的所有的内容,包括换行符,然后把焦点移动到下一行的开头,next()方法是以换行或者空格符为分界线接收下一个String类型变量。原创 2016-09-02 21:41:49 · 971 阅读 · 0 评论 -
Runnable、Callable和Future
我们通常说,在Java里面起多线程有两种方法:直接继承Thread类或者是实现Runnable接口。但是这两种方法都不能有直接的返回值,因为run方法是void类型,也没有提供其他的可以返回某类型的方法,我们可以通过线程间通信或者修改共享变量的方法来获取线程执行后的结果。 要直接实现返回变量类型,我们可以使用Callable接口public interface Callable {原创 2016-05-14 16:56:05 · 502 阅读 · 0 评论 -
Java堆中的对象分配、布局和访问
对象创建:通常情况下,对于程序中的创建新对象的指令,如new A(); 首先jvm要检查类A是否已经被加载到了内存,如果还没有,需要先触发类的加载、解析、初始化。 然后在堆上创建对象,在jvm中分为如下几步: 1. 在堆中分配相应大小的空间(空间大小怎么计算的,接下来说) 2. 完成实例数据部分的初始化工作(初始化为0值) 3. 完成对象头的填充:如对象自身的运行时数据、类型指针等。原创 2016-04-19 20:31:38 · 949 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier和Semaphore
三个并发编程中的辅助类CountDownLatch主要实现类似计数器的功能,原创 2016-05-13 22:16:32 · 379 阅读 · 0 评论 -
Java的抽象类与接口
java中的抽象类和接口从概念上有很多相似之处,但是所起的作用还是大有不同。定义抽象类:包含至少一个abstract关键字定义的方法,编译器强制要求类定义为abstract class,且默认public的。接口:看起来是比abstract类更高层次的抽象,所有方法都没有方法体,默认都为public。区别抽象类属于类的范畴,所有子类对其继承只能单继承,因此对于操作抽象类的方法,其操作对象只能是原创 2016-03-18 10:43:39 · 386 阅读 · 0 评论 -
Java的Integer缓存
Java的Integer缓存 腾讯笔试题遇到的,解释在这里。原创 2016-04-03 22:07:08 · 351 阅读 · 0 评论 -
Java学习资源
《快速高效学习Java编程在线资源Top 20》 http://www.importnew.com/16843.html。原创 2016-03-25 19:30:51 · 297 阅读 · 0 评论 -
Java类的加载和类加载器
关于java类的加载过程,一直弄的不是很懂,最近看了相关资料,来总结一下。1. 类加载过程类从被加载到虚拟机内存中开始,到使用之前,要经历加载、连接、初始化,三个阶段。连接包括:验证、准备、解析。上述顺序只是一个大致的参考,具体实现顺序可能有穿插。说有5种场景会触发类的初始化,前面的步骤自然要在初始化之前完成。 加载过程除了可以系统自动完成之外,也可能可以通过ClassLoader类来由程原创 2016-04-09 20:34:28 · 558 阅读 · 0 评论 -
Java的NIO
从JDK1.4开始,Java提供的java.nio.*包中,通过采用更接近操作系统IO的方式—通道和缓冲器, 提高了IO的速度,这里总结一二。FileChannel与ByteBuffer基本操作方式: 从FileInputStream/FileOutputStream的getChannel来获得对应的FileChannel,然后通过FileChannel.write(ByteBuff原创 2016-04-14 20:20:04 · 397 阅读 · 0 评论 -
Java虚拟机方法执行的概念模型
虚拟机的方法调用与数据结构栈帧(Stack Frame)是用于支持虚拟机方法调用和方法执行的数据结构,在JVM内存中,对应虚拟机栈的栈元素。 栈帧中包含:局部变量表,操作数栈,动态连接(?)和方法返回地址等信息。 其中局部变量表的大小,操作数栈的深度是在编译期间就确定的,具体来说存储在class文件方法表的Code属性中。这里我刚开始有个疑问,那对于递归函数来说,怎么能在编译期间确定递归深度呢?原创 2016-04-10 19:44:24 · 487 阅读 · 0 评论 -
二分查找实现细节
二分查找原理 与有序数组相关的问题,比如确定某个数是否在其中,采用二分查找可以达到log(n)的复杂度。虽然原理简单,但是要真正编码实现,而且无bug往往还不是那么容易。本人就实践过多次,每次写完后都要调试好几次才能去掉很多bug。但是在面试过程中,面试官看的就是你平时编码多不多,肯定不会让你有那么多机会调试,你最多可以心里调试一遍,这样往往就留下很多bug,一跑就很有可能出错。以下是我对b原创 2016-03-31 21:13:54 · 1169 阅读 · 0 评论 -
HashMap实现原理
Map用于实现关联数组,也就是用于保存(key,value)这样的数据结构。 在java中的基本实现有如下几类 实现 简介 HashMap 基于key的散列表实现,插入和查询键值对的速度为常数 LinkedHashMap 类似HashMap,但是通过额外的链表结构保持了插入的顺序 TreeMap 基于红黑树的排序树,节点为键值对,可返回子树 WeakHashMap原创 2016-05-11 11:23:05 · 682 阅读 · 0 评论 -
java迭代器和比较器
Iterable和Iterator两者都是与迭代器有关的接口,但是这两者具体有何区别和联系呢?public interface Iterable<T>{ Iterator<T> iterator();}public interface Iterator<E>{ boolean hasNext(); E next();}实际上,Iterable向外宣称了可迭代的特性,也就是原创 2016-05-11 16:02:36 · 1240 阅读 · 0 评论 -
Java并发(四)同步容器
首先一些概念:死锁: 多个线程都持有一部分资源,同时都在等待另外一部分资源的使用权,而这另外一部分资源又被其它线程所占有,类似这样的一种关系构成了一个循环等待链,使所有的线程都不能执行。死锁的几个条件: 互斥条件、请求保持条件、不剥夺条件、循环等待条件。原创 2016-05-10 21:17:31 · 379 阅读 · 0 评论 -
Java泛型中遇到的协变问题
学习Java的泛型写程序时经常出现编译器报错,对于数据类型的转换安全问题。以下为转载:看下面一段代码Number num = new Integer(1); ArrayList list = new ArrayList(); //type mismatchListextends Number> list = new ArrayList();list.add(n转载 2016-05-25 14:44:27 · 708 阅读 · 0 评论 -
并发容器ConcurrentHashMap
HashMap不是线程安全的容器,HashTable是同步的容器,但是在有大量线程竞争存在的时会产生严重的低效率的问题,并发容器可以比较好地解决这个问题。 ConcurrentHashMap将数据分为多段,然后每段数据分别有一把锁,当不同的线程分别访问不同的数据段时,申请的是不同的锁,因此不会产生竞争,大大地提高了访问效率。其实就是通过将数据分段,然后采用锁分段技术。 这里有一个问题: 如果将分原创 2016-05-12 16:38:05 · 328 阅读 · 0 评论 -
并发容器CopyOnWrite
CopyOnWrite,写时复制技术是并发容器的一种解决方案,即是说当有线程需要修改容器的内容时,会复制一份容器的副本进行修改。Java中实现了两个CopyOnWrite容器,CopyOnWriteArrayList和CopyOnWriteSet。CopyOnWrite容器可以实现并发地读,并且写也不会影响当前的并发读,但是写操作不能同时有多个线程,需要加锁。写完之后将新的容器赋值给旧的引用。该容器原创 2016-05-12 17:07:27 · 408 阅读 · 0 评论 -
并发:阻塞队列与生产者消费者模型
对于生产者消费者模型,如果我们采用常规的容器,那么我们需要同步,并且需要在生产者线程和消费者线程之间做wait和notify的线程间通信。而阻塞队列将同步操作和生产者和消费者间的通信在容器内部实现,使用起来就不需要我们自己做同步和线程通信了。 一个典型的应用场景就是socket客户端数据的读取和解析。另外关于生产者-消费者模型,下面是采用Object.wait(),Object.notify(原创 2016-05-12 20:58:11 · 617 阅读 · 0 评论 -
测试
public Future submit(Runnable task) { if (task == null) throw new NullPointerException(); RunnableFuture ftask = newTaskFor(task, null); execute(ftask); return ftask;原创 2016-05-12 21:21:08 · 296 阅读 · 0 评论 -
JVM垃圾回收和内存分配策略
JVM的垃圾回收原创 2016-04-19 11:42:07 · 512 阅读 · 0 评论 -
Java线程池核心类ThreadPoolExecutor
通常,当需要同时处理的任务比较多时,为了避免为每个任务开一个线程(因为这样会导致频繁的线程开启和销毁,开销较大),采用线程池技术来进行线程资源的复用。 在应用中,我们通常使用Executors类提供的静态方法来使用线程池:ExecutorService exec0 = Executors.newCachedThreadPool(); //创建一个缓冲池,缓冲池容量大小为Integer.MAX_原创 2016-05-13 20:23:54 · 1137 阅读 · 0 评论 -
Centos7安装JDK(tar.gz版)
原文:http://www.cnblogs.com/wangfajun/p/5257899.html==============Centos7安装JDK(tar.gz版)1.查找需要卸载的OpenJDK:# rpm -qa | grep java2:依次卸载rpm -e --nodeps javapackages-tools-3.4.1转载 2017-07-27 10:06:20 · 2058 阅读 · 0 评论