﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-nod0620-随笔分类-java</title><link>http://www.blogjava.net/nod0620/category/49445.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 08 Sep 2011 04:41:06 GMT</lastBuildDate><pubDate>Thu, 08 Sep 2011 04:41:06 GMT</pubDate><ttl>60</ttl><item><title>hashcode</title><link>http://www.blogjava.net/nod0620/archive/2011/09/07/358184.html</link><dc:creator>nod0620</dc:creator><author>nod0620</author><pubDate>Wed, 07 Sep 2011 07:11:00 GMT</pubDate><guid>http://www.blogjava.net/nod0620/archive/2011/09/07/358184.html</guid><wfw:comment>http://www.blogjava.net/nod0620/comments/358184.html</wfw:comment><comments>http://www.blogjava.net/nod0620/archive/2011/09/07/358184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nod0620/comments/commentRss/358184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nod0620/services/trackbacks/358184.html</trackback:ping><description><![CDATA[hashcode几点规定：<br /><div><ul><li>在 Java 应用程序执行期间，在对同一对象多次调用 <tt>hashCode</tt> 方法时，必须一致地返回相同的整数，前提是将对象进行  <tt>equals</tt> 比较时所用的信息没有被修改。  </li><li>如果根据 <tt>equals(Object)</tt> 方法，两个对象是相等的，那么对这两个对象中的每个对象调用  <code>hashCode</code> 方法都必须生成相同的整数结果。  </li><li>如果根据<a href="../../java/lang/Object.html#equals%28java.lang.Object%29"><code></code></a><tt> equals(Object)</tt>  方法，两个对象不相等，那么对这两个对象中的任一对象上调用 <tt>hashCode</tt> 方法<em></em>不要求一定生成不同的整数结果。</li></ul>HashMap使用分离链接法，就是在hashcode冲突的时候在hashcode对应的槽位使用链表，查找的时候先hashcode找到槽位，然后equals()方法找到链表中对应的对象。<br />jdk的容量是2^n次，找到槽位使用位与的方式代替模的方式提高性能<br />装载因子是装载的对象和hash表总数量的比值，记为&#955;，这个代表平均链表的长度，在一次不成功要查找的平均节点为<br /><div>&#955;,一次成功的查找则为1+&#955;/2<br /><br /><div>分离链接法之外还有线性探测法和平方探测法，双散列等探测法</div>探测法不是在冲突的时候利用链表进行存储，而是在冲突的位置往后查找一个空位置进行存储<br /><br /><div><div>线性探测法会遇到一次聚焦的问题，就是一个冲突的位置后面连续的位置都不为空<br /><br />那么可以进行平方探测法消除一次聚焦的问题，虽然我们引进了二次聚焦的较小影响的问题，流行的函数为f(i)=i^2。<br /><br />这个时候hash表的容量必须为素数，这样在表一半为空时，才能总数插入一个元素<br />如果容量为非素数的时候，备选位置要少很多<br /><br />网上讨论hashmap的个数为素数或者2^n次问题，是没有分清分离链接法和探测法，只有在探测法的时候，素数才是最有效的</div></div></div></div><img src ="http://www.blogjava.net/nod0620/aggbug/358184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nod0620/" target="_blank">nod0620</a> 2011-09-07 15:11 <a href="http://www.blogjava.net/nod0620/archive/2011/09/07/358184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>classloader记录</title><link>http://www.blogjava.net/nod0620/archive/2011/08/24/357127.html</link><dc:creator>nod0620</dc:creator><author>nod0620</author><pubDate>Wed, 24 Aug 2011 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/nod0620/archive/2011/08/24/357127.html</guid><wfw:comment>http://www.blogjava.net/nod0620/comments/357127.html</wfw:comment><comments>http://www.blogjava.net/nod0620/archive/2011/08/24/357127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nod0620/comments/commentRss/357127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nod0620/services/trackbacks/357127.html</trackback:ping><description><![CDATA[classloader是一个双亲委派模型的结构.<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/nod0620/hk7t8blx.jpg" height="281" width="167" /><br />一般是如上图结构<br /><div> Bootstrap ClassLoader/启动类加载器<br />他的parent为null, 主要负责'sun.boot.class.path'系统属性指定的 或 -Xbootclasspath 选项指定的jar包装入工作.<br /><div>Bootstrap ClassLoader是jvm控制的，不是java语言层面编写的，默认加载jdk_home/jre/lib/下面的jar包和其他相关的东西，如jdk的核心包rt.jar就是在这里被加载的<br /><br /><div>Extension ClassLoader/扩展类加载器<br />主要负责jdk_home/jre/lib/ext目录下('java.ext.dirs'系统属性指定)的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作,他的parent为 Bootstrap ClassLoader</div><br /><div>System ClassLoader/系统类加载器<br />主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.一般我们会配置环境变量classpath，这个就是载入classpath指定的路径下jar和class,<br />平常我们指定一个"."号，就是指定从当前目录下开始搜索class类.parent为 Extension ClassLoader.<br /><br /><div>User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)<br />在程序运行期间, 通过java.lang.ClassLoader的子类加载class文件.<br /><br /><br />classloader要加载class先从底向上传递给父亲加载类，最顶层的classloader如果能够加载就加载进来，不行的话，就自上而下传递，只到一个classloader能进行类的加载，<br />如果没有一个classloader能加载的话，就会抛出ClassNotFoundException或者NoClassDefFoundError异常，这个就是双亲委派模式<br /><br />classloader这种模式保证了不同的classloader之间类不会相互的影响，那么也保证了好的类不会被恶意的类所破坏，这个也是jvm沙箱模式安全的一个保证<br /><br />在不同classloader的同名的类实例不能互相沟通，类型转换，instanceof，如果这样做，则会抛出ClassCastException.所以抛出ClassCastException的原因不止和继承，实现有关系，<br />还和classloader有关系.<br /><br /><div>当运行时发现一个新class要load时，除代码已指定由哪classloader的实例load外，先由调用者的classloader所在的classloader tree去load，如果super类/interface类对于这个树是新的也一起会被load。这是caller classloader的概念.<br /><div>双亲委派可以被打破，全权负责也可被打破，所以运行时决定类来自哪里，还是由classloader树和load class的代码是怎样而决定。<br /></div><div><p>Thread Context  ClassLoader：线程上下文classloader，是hold住了一ClassLoader的实例，这个holder在线程运行流程里可以到达隐式传递classloader。这个classloader是一个不会主动load的实例，就是说在这个线程运行下遇到新类这个classloader不会主动去load，只有自己用显式代码或你看不见的jar里用显式代码用这个<div>classloader loadClass()或Class.forName()，才会生效。因此，caller classloader和 thread context  classloader，在执行到你的代码时，已定。并且执行流程的不同，到你代码时的入口也不同，被放置入thread的thread  context classloader和Caller ClassLoader不一定一样，因此是不稳定的<br /><br />需要稳定的话，就要保证在设计时就考虑到各种入口和用法的情况，然后得到确定的classloader存在 thread context classloader或者第三方的class loader中，tomcat的类加载体系就是这样做的.</div></p></div></div></div></div></div></div><img src ="http://www.blogjava.net/nod0620/aggbug/357127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nod0620/" target="_blank">nod0620</a> 2011-08-24 10:40 <a href="http://www.blogjava.net/nod0620/archive/2011/08/24/357127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>