|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
再说说缺点:首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。这已笔者写的第三篇Java杂记了,光荣前两篇一向失掉论坛伴侣们的撑持勉励,还看人人持续斧正不敷的地方。笔者也一向巴望经由过程如许体例苏醒的自审,来寻觅本人手艺上的不敷的地方,但愿和配合喜好Java的同仁们一同进步。
前两次分离报告了关于jvm、jdk、jre、collection、classLoader和一些DesignPattern的自我了解。此次仍旧禁绝备入手下手过渡到j2ee中,由于以为另有一些噜苏的j2se的成绩没有总结终了。
1.关于Object类了解
人人都晓得Object是一切Java类的基类,意味着一切的Java类城市承继了Object的11个办法。倡议人人往看看Object的11个成员函数的源代码,就会晓得默许的完成体例。好比equals办法,默许完成就是用"=="来对照,即间接对照内存地点,前往true大概false。而toString()办法,前往的串构成体例是——
"getClass().getName()+"@"+Integer.toHexString(hashCode())"
实在不必我过量的注释,人人都能看懂这个串的构成。接上去再看看hashCode():
publicnativeinthashCode();
因为是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()办法究竟做甚么用?
学过数据布局的课程人人城市晓得有一种布局叫hashtable,目标是经由过程给每一个对象分派一个独一的索引来进步查询的效力。那末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()办法:
returnA[0]“+”A[1]“+”A[2]“+”A[3];//显现上对照直不雅
然后使用toString()来盘算hashCode():
returnthis.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的办法被挪用的时分,锁实际上是加载对象上,固然假如是静态类则是加在类上的锁,挪用停止锁被排除。它的完成道理很复杂,仅仅是不让第二把锁再次被加在统一个对象或类上,仅此罢了。一个复杂的例子足以申明成绩:
classA{
synchronizedvoidf(){}
voidg(){}
}
当A的一个对象a被第一个线程挪用其f()办法的时分,第二个线程不克不及挪用a的synchronized办法比方f(),由于那是在试图在对象上加第二把锁。但挪用g()倒是能够的,由于并没有在统一对象上加两把锁的举动发生。
如许人人能了解了麽?分明它的道理能更好的匡助人人计划同步机制,不要滥用加锁。
PS:下篇笔者企图入手下手对J2ee打仗到的各个方面来举行总结,谈谈本人的履历和设法。但愿人人还能自始自终的撑持笔者写下往,斧正不敷的地方。
来自:http://topic.csdn.net/u/20070924/21/18482496-082f-4907-8751-b80ab5d56622.html?seed=1386683868
在性能方面,在windows平台下,.net网页编程可能是占强项,要是把.net网页编程放在sun开发的操作系统上去运行呢?根本就运行不了,.net网页编程对其它操作系统的支持也很弱,性能也可能比不上java。 |
|