Java
文章平均质量分 85
jiaaq2008
这个作者很懒,什么都没留下…
展开
-
为什么HashCode对于对象是如此的重要?
一个对象的HashCode就是一个简单的Hash算法的实现,虽然它和那些真正的复杂的Hash算法相比还不能叫真正的算法,它如何实现它,不仅仅是程序员的编程水平问题,而是关系到你的对象在存取是性能的非常重要的关系.有可能,不同的HashCode可能会使你的对象存取产生,成百上千倍的性能差别。 我们先来看一下,在JAVA中两个重要的数据结构:HashMap和Hashtable,虽然它们有很大的...原创 2014-05-04 20:20:32 · 98 阅读 · 0 评论 -
Java变量以及内存分配(非常重要)
不知道是第几次看thinking in java了。不是的翻翻总有新的收获。堆栈静态存储区域一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的...原创 2014-05-23 00:35:31 · 242 阅读 · 0 评论 -
simple-spring-memcached简介
memcached是一款非常优秀的分布式缓存工具,有效提升了按主键检索数据的性能问题。而simple-spring-memcached组件通过与spring框架整合,让memcached的调用变得更加简单。simple-spring-memcached本质上是采用了AOP的方式来实现缓存的调用和管理,其核心组件声明了一些Advice,当遇到相应的切入点时,会执行这些Advice来对memcach...原创 2014-06-07 17:24:00 · 88 阅读 · 0 评论 -
Java程序性能优化总结
一、避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 例子: import java.util.vector;class cel { void method (vector vector) { for (int i = 0; i < vector.s...原创 2014-06-14 19:26:53 · 76 阅读 · 0 评论 -
Java程序性能优化总结补充
数值表达式 1. 奇偶判断 不要使用 i % 2 == 1 来判断是否是奇数,因为i为负奇数时不成立,请使用 i % 2 != 0 来判断是否是奇数,或使用 高效式 (i & 1) != 0来判断。 2. 小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999上面的计算出的结果不是 0.9,而是一连串的小数。问题在...原创 2014-06-14 20:06:26 · 99 阅读 · 0 评论 -
深入理解Bloom Filter
Bloom Filter是1970年由Bloom提出的,最初广泛用于拼写检查和数据库系统中。近年来,随着计算机和互联网技术的发展,数据集的不断扩张使得 Bloom filter获得了新生,各种新的应用和变种不断涌现。Bloom filter是一个空间效率很高的数据结构,它由一个位数组和一组hash映射函数组成。Bloom filter可以用于检索一个元素是否在一个集合中,它的优点是空间效率和查询...原创 2014-06-23 14:33:52 · 101 阅读 · 0 评论 -
slf4j 使用介绍
很偶然的机会,发现了slf4j。同事在引入的其他包与现存的log4j产生冲突,只要加入这些包,原来的log4j就会失去作用,原来能够打印的日志,现在都不输出了。一时不知道该怎么办。后来在仔细查看日志,发现打印出来的信息有slf4j加载失败的信息。所以到网上搜索。可是,如果就加入某个包,是如何影响我的log输出的呢? SLF4J,即简单日志门面(Simple Logging Facad...原创 2014-07-31 09:18:23 · 120 阅读 · 0 评论 -
Java高手速成秘籍——Eclipse鲜为人知的快捷键
Java高手速成秘籍——Eclipse鲜为人知的快捷键,错过本文,那你绝对是错过了成为Java高手的机会。查看资源:1. Ctrl+Shift+R:打开资源这可能是所有快捷键组合中最省时间的了。这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml。美中不足的是这组快捷键并非在所有视图下都能用。2....原创 2014-03-29 00:48:16 · 233 阅读 · 0 评论 -
重写equal 的同时为什么必须重写hashcode?
hashCode是编译器为不同对象产生的不同整数,根据equal方法的定义:如果两个对象是相等(equal)的,那么两个对象调用hashCode必须产生相同的整数结果,即:equal为true,hashCode必须为true,equal为false,hashCode也必须为false,所以必须重写hashCode来保证与equal同步。class Student { int num; ...原创 2014-03-29 10:32:50 · 67 阅读 · 0 评论 -
从程序员到CTO的Java技术路线图
在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了。但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平。 Java程序员高级特性 反射、泛型、注释符、自动装箱和拆箱、枚举类、可变 参数、可变返回类型、增强循环、静态导入 ...原创 2014-04-10 16:00:23 · 101 阅读 · 0 评论 -
【推荐】深入理解Java内存模型--电子书
Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰java程序员,本文试图揭开java内存模型神秘的面纱。本文大致分三部分:重排序与顺序一致性;三个同步原语(lock,volatile,final)的内存语义,重排序规则及在处理器中的实现;java内存模型的设计,及其与处理器内存模型和顺序一致性内存模型的关系。本期主编:张龙http://www.infoq.co...原创 2014-04-12 11:44:52 · 185 阅读 · 0 评论 -
Hash表原理及Java实现
这篇博客主要探讨Hash表中的一些原理/概念,及根据这些原理/概念,自己设计一个用来存放/查找数据的Hash表,并且与JDK中的HashMap类进行比较。我们分一下七个步骤来进行。 一。 Hash表概念 二 . Hash构造函数的方法,及适用范围 三. Hash处理冲突方法,各自特征 四. Hash查找过程 五....原创 2014-04-17 20:45:22 · 95 阅读 · 0 评论 -
转--Bloom Filter概念和原理
Bloom Filter概念和原理焦萌 2007年1月27日 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不...原创 2014-04-17 20:46:31 · 87 阅读 · 0 评论 -
采用链地址法处理冲突构造哈希表
1、背景引入 (1)线性表和树等线性结构中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需要进行一系列和关键字的比较。理想的情况是希望不经过任何比较,一次存取便能够取到所查找的记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字和结构中一个唯一的存储位置相对应。因而在查找时,只要根据这个对应关系f找到...原创 2014-04-17 20:47:54 · 566 阅读 · 0 评论 -
Map接口之HashSet、Hashtable、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap
Map接口之HashSet、Hashtable、LinkedHashMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。Map接口定义了如下常用的方法:1、v...原创 2014-04-17 20:51:09 · 87 阅读 · 0 评论 -
常见hash算法的原理
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列...原创 2014-04-18 10:27:31 · 97 阅读 · 0 评论 -
从哈希存储到Bloom Filter
先解释一下什么是哈希函数。哈希函数简单来说就是一种映射,它可取值的范围(定义域)通常很大,但值域相对较小。哈希函数所作的工作就是将一个很大定义域内的值映射到一个相对较小的值域内。传统的哈希存储 假设要哈希的集合为S,它有n个元素。传统的哈希方法是,将哈希区域组织成h(h > n)个格子的列表,每一个格子都能存储S中的一个元素。存储时将S中的每一个元素映射到{0, 1...原创 2014-04-18 10:27:44 · 64 阅读 · 0 评论 -
Java基础问题:java.lang.String - intern()
原文: http://forum.javaeye.com/viewtopic.php?t=17912搂主的问题问的含含糊糊:flyjie给出了非常详细的解释,不过就是没有解释String实例化的特殊方面以及Intern()方法的含义-----------------------------------------------------------------------------------...原创 2014-05-23 00:16:18 · 106 阅读 · 0 评论 -
java的字符串常量池(转)
http://www.cnblogs.com/brokencode/archive/2011/08/24/2151450.htmltest1:package StringTest;public class test1 {/*** @param args*/public static void main(String[] args){String a = "a1";String...原创 2014-05-23 00:15:41 · 64 阅读 · 0 评论 -
在重写了对象的equals方法后,还需要重写hashCode方法吗?
首先说建议的情况: 比如你的对象想放到Set集合或者是想作为Map的key时(非散列的Set和Map,例如TreeSet,TreeMap等),那么你必须重写equals()方法,这样才能保证唯一性。当然,在这种情况下,你不想重写hashCode()方法,也没有错。但是,对于良好的编程风格而言,你应该在重写equals()方法的同时,也重写hashCode()方法。 然后再说说必须重写hashC...原创 2014-05-04 20:36:43 · 96 阅读 · 0 评论 -
如果两个对象不相同,他们的hashcode可能相同?
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。 那么Java运行时环境是如何判断HashSet中相同对象、HashMap中相同键的呢?当存储了“相同的东西”之后Java运行时环境又将如何来维护呢? 在研究这个问题之前,首先说明一下JDK对equals(Object obj)和hashcode()这两个方法...原创 2014-05-04 20:54:52 · 521 阅读 · 0 评论 -
java synchronized静态同步方法与非静态同步方法,同步语句块
进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁。 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间。而且可以选择要获取哪个对象的对象锁。但是如果在使用同步块机制时,如果使用过多的...原创 2014-05-04 21:16:36 · 92 阅读 · 0 评论 -
线程安全与锁优化
转载自http://xussen.iteye.com/blog/1677402 Brian Goetz对线程安全的定义:当多个线程访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调度方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的 并发处理的广泛应用是使得Amdahl...原创 2014-05-05 11:35:38 · 76 阅读 · 0 评论 -
java之yield(),sleep(),wait()区别详解
1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线...原创 2014-05-05 14:32:23 · 63 阅读 · 0 评论 -
java中关键字volatile的作用
用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) =========================分割线1==============...原创 2014-05-05 14:43:08 · 69 阅读 · 0 评论 -
Java线程同步中关键字synchronized详述
synchronized关键可以修饰函数、函数内语句。无论它加上方法还是对象上,它取得的锁都是对象,而不是把一段代码或是函数当作锁。1,当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一段时间只能有一个线程得到执行,而另一个线程只有等当前线程执行完以后才能执行这块代码。2,当一个线程访问object中的一个synchronize...原创 2014-05-05 15:11:30 · 70 阅读 · 0 评论 -
Java中的ReentrantLock和synchronized两种锁定机制的对比
多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 ——synchronized 和 volatile 。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使...原创 2014-05-05 15:35:55 · 72 阅读 · 0 评论 -
深入Java虚拟机JVM类加载初始化学习笔记
1. Classloader的作用,概括来说就是将编译后的class装载、加载到机器内存中,为了以后的程序的执行提供前提条件。2. 一段程序引发的思考:风中叶老师在他的视频中给了我们一段程序,号称是世界上所有的Java程序员都会犯的错误。诡异代码如下:package test01; class Singleton { public static Singl...原创 2014-05-08 17:18:24 · 70 阅读 · 0 评论 -
Java多线程中join方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。t.join(1000); //等待 t 线程,等待时间是1000毫秒 先上一段JDK中代码:Java代码 ...原创 2014-05-10 00:45:53 · 76 阅读 · 0 评论 -
【转】一致性 hash 算法( consistent hashing )
consistent hashing 算法早在 1997 年就在论文 Consistent hashing and random trees 中被提出,目前在cache 系统中应用越来越广泛;1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 obje...原创 2014-05-10 19:10:47 · 83 阅读 · 0 评论 -
Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型、GC工作原理,以及如何优化GC的性能、与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能。本文将从JVM内存模型、GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能。 一、Java内存模型 按照官方的说法:Java ...原创 2014-05-14 00:53:46 · 121 阅读 · 0 评论 -
java内存溢出和内存泄露
虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险。最近在网上搜集了一些资料,现整理如下: —————————————————————————————————————————— 一、为什么要了解内存泄露和内存溢出? 1、内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平...原创 2014-05-14 00:55:14 · 83 阅读 · 0 评论 -
转--深入理解Java内存模型—锁
锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1 ...原创 2014-05-14 00:57:37 · 81 阅读 · 0 评论 -
me_nginx+tomcat+memcached实现session共享配置过程
说明所有的配置以及软件都是在windows环境下进行的,都是用自己的电脑做服务器。要解决的问题在tomcat集群环境下的session共享 、缓存共享、 负载均衡。解决方案的选择 多个tomcat要一起协同工作有几种办法,可以考虑的方案有以下几个:1. 使用tomcat自带的cluster方式,多个tomcat间自动实时复制session信息,配置起...原创 2014-05-15 00:43:11 · 96 阅读 · 0 评论 -
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不...原创 2014-05-20 13:29:56 · 62 阅读 · 0 评论 -
Memcache工作原理
1 Memcache是什么Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。 ...原创 2014-04-29 00:24:17 · 99 阅读 · 0 评论