Java日常
文章平均质量分 88
子不语xuan
这个作者很懒,什么都没留下…
展开
-
8张图理解Java
一图胜千言,下面图解均来自Program Creek 网站的Java教程,目前它们拥有最多的票选。如果图解没有阐明问题,那么你可以借助它的标题来一窥究竟。1、字符串不变性下面这张图展示了这段代码做了什么12String s = "abcd";s = s.concat("ef");转载 2016-05-28 11:36:28 · 294 阅读 · 0 评论 -
多线程 - 线程池的实现
概述系统启动一个新线程的成本是比较高的,因为它需要与系统交互,使用线程池可以有效地控制系统中并发线程的数量。尤其是当系统中需要创建大量生命周期很短的线程时,这种效果尤为明显。线程池会在程序启动时创建一定数量的线程。当程序将一个Runnable对象或Callable对象传给线程池,线程池会启动一个线程来执行它的run()方法或call()方法。当run()方法或call()方法执行结原创 2016-05-22 20:40:41 · 475 阅读 · 0 评论 -
ConCurrent并发包 - Lock详解
synchronized的缺陷我们知道,可以利用synchronized关键字来实现共享资源的互斥访问。Java 5在java.util.concurrent.locks包下提供了另一种来实现线程的同步访问,那就是Lock。既然有了synchronized来实现线程同步,Java为什么还需要提供Lock呢?synchronized是Java的一个关键字,当我们使用synchroni原创 2016-08-15 21:56:23 · 3748 阅读 · 0 评论 -
浅谈RMI - 搭建一个简单的RMI程序
RMI是Remote Method Invoke的缩写,是JDK提供的一个完善的、简单易用的远程调用框架,它要求客户端和服务器端都是Java程序。下面简述RMI的基本原理:如下图所示,RMI采用代理来负责客户端和服务器之间socket通信的细节。RMI框架分别为远程对象生成了客户端代理和服务器代理,位于客户端的代理称为存根(Stub),位于服务器端的代理称为骨架(Skeleton)。原创 2016-05-19 11:50:22 · 10081 阅读 · 3 评论 -
关于synchronized的几点说明
任何线程进入同步代码块,同步方法之前,必须先获得对同步监视器的锁定。由于程序无法显式释放对同步监视器的锁定,那么究竟何时会释放同步监视器锁呢?当前线程的同步代码块或同步方法正常执行结束;当前线程在同步代码块或同步方法中遇到break或return语句返回;当前线程在执行同步代码块或同步方法时发生了未处理的Error或Exception,导致程序异常结束;当前线程在同步代码块或同步方法中调用wait()方法。原创 2016-08-20 22:13:11 · 569 阅读 · 0 评论 -
Java对象的浅拷贝与深拷贝
浅拷贝与深拷贝浅拷贝(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对拷贝对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制基本数据类型,而不复制引用类型的对象。深拷贝(深克隆):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的原创 2016-08-02 22:12:31 · 1121 阅读 · 0 评论 -
ConcurrentHashMap数据结构分析
引言HashMap是线程不安全的数据结构,在单线程环境下有较好的执行效率,但不适用于多线程的应用。HashTable使用synchronized来保证线程安全,但在线程竞争激烈的情况下效率非常低下。当一个线程访问HashTable的同步方法时,其他的线程要访问同步方法只能进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能进行put操作,连get操作也不允许。基于以上原因,Con原创 2016-08-02 21:21:04 · 4787 阅读 · 1 评论 -
Java对象初始化
引言先做一道测试题:class Foo { int i; Foo() { i = 1; int x = getValue(); System.out.println(x); } protected int getValue() { return i; }}class Bar extends Foo { int j; Bar() { super()原创 2016-06-14 20:56:02 · 550 阅读 · 0 评论 -
多线程 - Callable接口
概述从Java 5开始,Java就提供了Callable接口,可以把它看作是Runnable接口的增强版:Callable接口提供了一个call()方法作为线程执行体,它可以有返回值,并且可以抛异常。但是如何获取call()方法的返回值呢?Java 5提供了Future接口来代表call()方法的返回值,并为Future接口提供了FutureTask实现类,该类实现了Callabl原创 2016-05-20 21:00:51 · 311 阅读 · 0 评论 -
javax.swing.Timer的使用
一、Timer的使用Timer(int delay, ActionListener listener):创建一个每delay毫秒将通知其侦听器的Timer.#delay:延迟的毫秒数,0表示启动后立刻执行。#listener:侦听器对象,可以为null。javax.swing.Timer的官方文档是这样解释的:public class Timerextends O原创 2016-06-03 09:59:28 · 3714 阅读 · 0 评论 -
Java基础--定时任务Timer
一、Timer介绍 java.util.Timer java.util.TimerTaskTimer是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,而且是一个抽象类,如下所示: public abstract class TimerTask implements Runnable转载 2016-06-03 09:39:15 · 447 阅读 · 0 评论 -
Java回调机制(callback)
最近学习java,接触到了回调机制(CallBack)。初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义。当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题。但是,对于初学的我来说,缺了一个循序渐进的过程。此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教!开始之前,先想象一转载 2016-05-20 19:55:09 · 353 阅读 · 0 评论 -
集合框架 - HashSet和HashMap实现原理
HashSet的实现HashSet是基于HashMap实现的,只使用HashMap的key来实现各种特性,用PRESENT构造一个虚假的value。所以HashSet判断两个Key是否相等的机制和HansMap是一模一样的:equals返回true并且和hashCode返回值相同。下面是HashSet的部分实现,看代码:private transient HashMap map;原创 2016-05-20 15:31:46 · 439 阅读 · 0 评论 -
集合框架 - ArrayList的实现原理
ArrayList是基于数组实现的,并且可以动态扩容。下面简述一下ArrayList的特性:(1)get和set操作性能很高,可以按索引获取;(2)在末尾add和remove的效率也很高,不需要移动元素;(3)常规的add和remove性能不佳,视具体情况而定。(4)动态扩容,和数组相比最大的优势。原创 2016-05-19 21:35:53 · 301 阅读 · 0 评论 -
Java 8: Stream API 快速入门
为什么需要Stream?Java语言中集合是使用最多的API,几乎每个Java程序都会用到集合操作, 这里的Stream和IO中的Stream不同,它提供了对集合操作的增强,极大的提高了操作集合对象的便利性。集合对于大多数编程任务而言都是基本的,为了解释集合是怎么工作,我们想象一下当下最火的外卖APP, 当我们点菜的时候需要按照距离、价格、销量等进行排序后筛转载 2017-09-06 12:40:41 · 606 阅读 · 0 评论