原文地址:http://bbs.51cto.com/thread-604335-1.html
1. 关于Object类理解
大家都知道Object是所有Java类的基类, 意味着所有的Java类都会继承了Object的11个方法。建议大家去看看Object的 11个成员函数的源代码,就会知道默认的实现方式。比如equals方法,默认实现就是用"=="来比较,即直接比较内存地址,返回true 或者 false。而toString()方法,返回的串组成方式是??
"getClass().getName() + "@" + Integer.toHexString(hashCode())"
其实不用我过多的解释,大家都能看懂这个串的组成。接下来再看看hashCode():
public native int hashCode();
由于是native方法,跟OS的处理方式相关,源代码里仅仅有一个声明罢了。我们有兴趣的话完全可以去深究它的hashCode到底是由OS怎么样产生的呢?但笔者建议最重要的还是先记住使用它的几条原则吧!首先如果equals()方法相同的对象具有相通的hashCode,但equals ()对象不相通的时候并不保证hashCode()方法返回不同的整数。而且下一次运行同一个程序,同一个对象未必还是当初的那个hashCode() 哦。
其余的方法呢?nofigy()、notifyAll()、clone()、wait()都是native方法的,说明依赖于操作系统的实现。最后一个有趣的方法是finalize(),类似C++的析构函数,签名是protected,证明只有继承扩展了才能使用,方法体是空的,默示什么也不做。它的作用据笔者的了解仅仅是通知JVM此对象不再使用,随时可以被销毁,而实际的销毁权还是在于虚拟机手上。那么它真的什么也不做麽?未必,实际上如果是线程对象它会导致在一定范围内该线程的优先级别提高,导致更快的被销毁来节约内存提高性能。其实从常理来说,我们也可以大概这样猜测出jvm做法的目的。
2. 关于重载hashCode()与Collection框架的关系
笔者曾经听一位搞Java培训多年的前辈说在他看来hashCode方法没有任何意义,仅仅是为了配合证明具有同样的hashCode会导致equals 方法相等而存在的。连有的前辈都犯这样的错误,其实说明它还是满容易被忽略的。那么hashCode()方法到底做什么用?
学过数据结构的课程大家都会知道有一种结构叫hash table,目的是通过给每个对象分配一个唯一的索引来提高查询的效率。那么Java也不会肆意扭曲改变这个概念,所以hashCode唯一的作用就是为支持数据结构中的哈希表结构而存在的,换句话说,也就是只有用到集合框架的 Hashtable、HashMap、HashSet的时候,才需要重载hashCode()方法,
这样才能使得我们能人为的去控制在哈希结构中索引是否相等。笔者举一个例子:
曾经为了写一个求解类程序,需要随机列出1,2,3,4组成的不同排列组合,所以笔者写了一个数组类用int[]来存组合结果,然后把随机产生的组合加入一个HashSet中,就是想利用HashSet不包括重复元素的特点。可是HashSet怎么判断是不是重复的元素呢?当然是通过 hashCode()返回的结果是否相等来判断啦,可做一下这个实验:
int[] A = {1,2,3,4};
int[] B = {1,2,3,4};
System.out.println(A.hashCode());
System.out.println(B.hashCode());
这明明是同一种组合,却是不同的hashCode,加入Set的时候会被当成不同的对象。这个时候我们就需要自己来重写hashCode()方法了,如何写呢?其实也是基于原始的hashCode(),毕竟那是操作系统的实现, 找到相通对象唯一的标识,实现方式很多,笔者的实现方式是:
首先重写了toString()方法:
return A[0]“+” A[1]“+” A[2]“+” A[3]; //显示上比较直观
然后利用toString()来计算hashCode():
return this.toString().hashCode();
这样上述A和B返回的就都是”1234”,在测试toString().hashCode(),由于String在内存中的副本是一样的,”1234”.hashCode()返回的一定是相同的结果。
说到这,相信大家能理解得比我更好,今后千万不要再误解hashCode()方法的作用。
3. 关于Class类的成员函数与Java反射机制
很早刚接触Java就听很多老师说过Java的动态运行时机制、反射机制等。确实它们都是Java的显著特点,运行时加载笔者在第一篇介绍过了,现在想讲讲反射机制。在Java中,主要是通过java.lang包中的Class类和Method类来实现内存反射机制的。
熟悉C++的人一定知道下面这样在C++中是做不到的: 运行时以字符串参数传递一个类名,就可以得到这个类的所有信息,包括它所有的方法,和方法的详细信息。还可以实例化一个对象,并通过查到的方法名来调用该对象的任何方法。这是因为Java的类在内存中除了C++中也有的静态动态数据区之外,还包括一份对类自身的描述,也正是通过这描述中的信息,才能帮助我们才运行时读取里面的内容,得到需要加载目标类的所有信息,从而实现反射机制。大家有没有想过当我们需要得到一个JavaBean的实例的时候,怎么知道它有哪些属性呢?再明显简单不过的例子就是自己写一个JavaBean的解析器:
a. 通过Class.forName(“Bean的类名”)得到Class对象,例如叫ABeanClass
b. 通过ABeanClass的getMethods()方法,得到Method[]对象
c. 按照规范所有get方法名后的单词就代表着该Bean的一个属性
d. 当已经知道一个方法名,可以调用newInstance()得到一个实例,然后通过invoke()方法将方法的名字和方法需要用的参数传递进去,就可以动态调用此方法。
当然还有更复杂的应用,这里就不赘述,大家可以参考Class类和Method类的方法。
4. 坦言Synchronize的本质
Synchronize大家都知道是同步、加锁的意思,其实它的本质远没有大家想得那么复杂。声明Synchronize的方法被调用的时候,锁其实是加载对象上,当然如果是静态类则是加在类上的锁,调用结束锁被解除。它的实现原理很简单,仅仅是不让第二把锁再次被加在同一个对象或类上,仅此而已。一个简单的例子足以说明问题:
class A{
synchronized void f(){}
void g(){}
}
当A的一个对象a被第一个线程调用其f()方法的时候,第二个线程不能调用a的synchronized方法例如f(),因为那是在试图在对象上加第二把锁。但调用g()却是可以的,因为并没有在同一对象上加两把锁的行为产生。
分享到:
相关推荐
《基于Activiti5工作流实战企业协同OA办公系统教程》是一门深度解析如何利用Activiti5框架构建高效、协同的企业办公自动化(OA)系统的专业课程。该教程旨在帮助IT从业者和对企业信息化有兴趣的学习者掌握工作流引擎...
51CTO的优势在于其内容的全面性和时效性,每天更新的技术新闻、深度解读文章和技术博客,使读者能够及时掌握行业动态。此外,51CTO还提供了在线教育服务,包括视频课程、实战培训等,帮助用户实现技术能力的快速提升...
在IT行业中,日志记录是系统...同时,通过自定义解析器和过滤器,我们可以对日志进行深度定制,满足特定的应用场景需求。这种方案尤其适用于大数据和微服务架构,因为它们通常需要高效、可扩展的日志管理和分析能力。
5. **51CTO下载-MYSQL高效编程.pdf**:这本书可能关注于编写高效的MySQL代码,包括最佳实践、避免常见的性能陷阱以及使用高级特性来提升代码效率。 6. **涂抹MySQL 跟着三思一步一步学MySQL.pdf**:这可能是一本以...
3. **TiGERTiAN博客(http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html)**:专注于Java和Android技术的深度解析。 4. **CSDN博客...
4. "5_3_3 使用Spring对JDBC的DAO支持类 - 51CTO_COM.mht":这部分可能深入讲解了如何使用Spring的JDBC模板(JdbcTemplate)来实现DAO层,这是Spring提供的一种简化数据库操作的工具。 5. "Spring3_0_2 使用 ...
- **网址**: [Hadoop Hive SQL 语法解释](http://jeffxie.blog.51cto.com/1365360/317524) - **内容概述**: - **Hive简介**: 简要介绍了Hive作为数据仓库工具的基本功能和优势。 - **SQL语句**: 提供了Hive SQL...
2. [ITEYE博客关于REST风格服务的深度解析](http://fuyanqing03.iteye.com/blog/478684) #### 基于XFire的SOAP服务 SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换结构化的信息,尤其是在...
为了更好地保障Web应用安全,日本Web应用安全领域权威专家德丸浩撰写了一部《Web应用安全权威指南》,与OWASP北京区负责人、51CTO信息安全专家OWASP子明携手,共同为业界贡献了一本全面深入的安全指南。 《Web应用...