




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 class.forname(xxx.xx.xx) 返回的是一个类首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。a a = (a)class.forname(pacage.a).newinstance();这和你a a = new a();是一样的效果。关于补充的问题答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。class.forname(xxx.xx.xx)返回的是一个类class.forname(xxx.xx.xx)的作用是要求jvm查找并加载指定的类,也就是说jvm会执行该类的静态代码段动态加载和创建class 对象,比如想根据用户输入的字符串来创建对象string str = 用户输入的字符串 ;class t = class.forname(str);t.newinstance();在初始化一个类,生成一个实例的时候,newinstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。java中工厂模式经常使用newinstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:class c = class.forname(“example”);factory = (exampleinterface)c.newinstance();其中exampleinterface是example的接口,可以写成如下形式:string classname = example;class c = class.forname(classname);factory = (exampleinterface)c.newinstance();进一步可以写成如下形式:string classname = readfromxmlconfig;/从xml 配置文件中获得字符串class c = class.forname(classname);factory = (exampleinterface)c.newinstance();上面代码已经不存在example的类名称,它的优点是,无论example类怎么变化,上述代码不变,甚至可以更换example的兄弟类example2 , example3 , example4,只要他们继承exampleinterface就可以。从jvm的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newinstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是class的静态方法forname()所完成的,这个静态方法调用了启动类加载器,即加载 java api的那个加载器。现在可以看出,newinstance()实际上是把new这个方式分解为两步,即首先调用class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forname时获得更好的灵活性,提供给了一种降耦的手段。最后用最简单的描述来区分new关键字和newinstance()方法的区别:newinstance: 弱类型。低效率。只能调用无参构造。new: 强类型。相对高效。能调用任何public构造。下面内容转自/iceman1952/archive/2007/03/07/1523025.aspx介绍的是 forname() 和 classloader 的 loadclass 方法。现在终于知道了为什么 forname()是会执行 static 语句,因为默认情况它总是初始化这个被装载的类。关于forname()方法这个方法总是返回要加载的类的class类的实例1、forname(string classname)单参数时, initialize=truea.总是使用当前类装载器(也就是装载执行forname()请求的类 的类装载器) b.总是初始化这个被装载的类(当然也包括:装载、连接、初始化)2、forname(string classname, boolean initialize, classloader loader) a.loader指定装载参数类所用的类装载器,如果null则用bootstrp装载器。b.initialize=true时,肯定连接,而且初始化了;c.false时,绝对不会初始化,但是可能被连接了,但是这里有个例外,如果在调用这个forname()前,已经被初始化了,那么返回的类型也肯定是被初始化的(当然,这里也暗含着:被同一个loader所装载的,而且这个类被初始化了)关于用户自定义的类装载器的loadclass()方法1、loadclass(string name)单参数时, resolve=falsea.如果这个类已经被这个类装载器所装载,那么,返回这个已经被装载的类型的class的实例,否则,就用这个自定义的类装载器来装载这个class,这时不知道是否被连接。绝对不会被初始化b.这时唯一可以保证的是,这个类被装载了。但是不知道这个类是不是被连接和初始化了2、loadclass(string name, boolean resolve)a.resolve=true时,则保证已经装载,而且已经连接了。resolve=falses时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接2java map 集合类简介了解最常用的集合类型之一 map 的基础知识以及如何针对您应用程序特有的数据优化 map。java.util 中的集合类包含 java 中某些最常用的类。最常用的集合类是 list 和 map。list 的具体实现包括 arraylist 和 vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。list 适用于按数值索引访问元素的情形。map 提供了一个更通用的元素存储方法。map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将 list 看作是具有数值键的 map。而实际上,除了 list 和 map 都在定义 java.util 中外,两者并没有直接的联系。本文将着重介绍核心 java 发行套件中附带的 map,同时还将介绍如何采用或实现更适用于您应用程序特定数据的专用 map。了解 map 接口和方法java 核心类中有很多预定义的 map 类。在介绍具体实现之前,我们先介绍一下 map 接口本身,以便了解所有实现的共同点。map 接口定义了四种类型的方法,每个 map 都包含这些方法。下面,我们从两个普通的方法(表 1)开始对这些方法加以介绍。表 1:覆盖的方法。我们将这 object 的这两个方法覆盖,以正确比较 map 对象的等价性。equals(object o)比较指定对象与此 map 的等价性hashcode()返回此 map 的哈希码map 构建map 定义了几个用于插入和删除元素的变换方法(表 2)。表 2:map 更新方法: 可以更改 map 内容。clear()从 map 中删除所有映射remove(object key)从 map 中删除键和关联的值put(object key, object value)将指定值与指定键相关联clear()从 map 中删除所有映射putall(map t)将指定 map 中的所有映射复制到此 map尽管您可能注意到,纵然假设忽略构建一个需要传递给 putall() 的 map 的开销,使用 putall() 通常也并不比使用大量的 put() 调用更有效率,但 putall() 的存在一点也不稀奇。这是因为,putall() 除了迭代 put() 所执行的将每个键值对添加到 map 的算法以外,还需要迭代所传递的 map 的元素。但应注意,putall() 在添加所有元素之前可以正确调整 map 的大小,因此如果您未亲自调整 map 的大小(我们将对此进行简单介绍),则 putall() 可能比预期的更有效。查看 map迭代 map 中的元素不存在直接了当的方法。如果要查询某个 map 以了解其哪些元素满足特定查询,或如果要迭代其所有元素(无论原因如何),则您首先需要获取该 map 的“视图”。有三种可能的视图(参见表 3)所有键值对 参见 entryset()所有键 参见 keyset()有值 参见 values()前两个视图均返回 set 对象,第三个视图返回 collection 对象。就这两种情况而言,问题到这里并没有结束,这是因为您无法直接迭代 collection 对象或 set 对象。要进行迭代,您必须获得一个 iterator 对象。因此,要迭代 map 的元素,必须进行比较烦琐的编码iterator keyvaluepairs = amap.entryset().iterator();iterator keys = amap.keyset().iterator();iterator values = amap.values().iterator();值得注意的是,这些对象(set、collection 和 iterator)实际上是基础 map 的视图,而不是包含所有元素的副本。这使它们的使用效率很高。另一方面,collection 或 set 对象的 toarray() 方法却创建包含 map 所有元素的数组对象,因此除了确实需要使用数组中元素的情形外,其效率并不高。我运行了一个小测试(随附文件中的),该测试使用了 hashmap,并使用以下两种方法对迭代 map 元素的开销进行了比较:int mapsize = amap.size(); iterator keyvaluepairs1 = amap.entryset().iterator();for (int i = 0; i mapsize; i+) map.entry entry = (map.entry) keyvaluepairs1.next(); object key = entry.getkey(); object value = entry.getvalue(); . object keyvaluepairs2 = amap.entryset().toarray();for (int i = 0; i (map 大小),则调整 map 大小例如,如果默认负载因子为 0.75,默认容量为 11,则 11 x 0.75 = 8.25,该值向下取整为 8 个元素。因此,如果将第 8 个项添加到此 map,则该 map 将自身的大小调整为一个更大的值。相反,要计算避免调整大小所需的初始容量,用将要添加的项数除以负载因子,并向上取整,例如, 对于负载因子为 0.75 的 100 个项,应将容量设置为 100/0.75 = 133.33,并将结果向上取整为 134(或取整为 135 以使用奇数)奇数个存储桶使 map 能够通过减少冲突数来提高执行效率。虽然我所做的测试(关联文件中的 并未表明质数可以始终获得更好的效率,但理想情形是容量取质数。1.4 版后的某些 map(如 hashmap 和 linkedhashmap,而非 hashtable 或 identityhashmap)使用需要 2 的幂容量的哈希函数,但下一个最高 2 的幂容量由这些 map 计算,因此您不必亲自计算。负载因子本身是空间和时间之间的调整折衷。较小的负载因子将占用更多的空间,但将降低冲突的可能性,从而将加快访问和更新的速度。使用大于 0.75 的负载因子可能是不明智的,而使用大于 1.0 的负载因子肯定是不明知的,这是因为这必定会引发一次冲突。使用小于 0.50 的负载因子好处并不大,但只要您有效地调整 map 的大小,应不会对小负载因子造成性能开销,而只会造成内存开销。但较小的负载因子将意味着如果您未预先调整 map 的大小,则导致更频繁的调整大小,从而降低性能,因此在调整负载因子时一定要注意这个问题。选择适当的 map应使用哪种 map? 它是否需要同步? 要获得应用程序的最佳性能,这可能是所面临的两个最重要的问题。当使用通用 map 时,调整 map 大小和选择负载因子涵盖了 map 调整选项。以下是一个用于获得最佳 map 性能的简单方法1. 将您的所有 map 变量声明为 map,而不是任何具体实现,即不要声明为 hashmap 或 hashtable,或任何其他 map 类实现。map criticalmap = new hashmap(); /好hashmap criticalmap = new hashmap(); /差这使您能够只更改一行代码即可非常轻松地替换任何特定的 map 实例。下载 doug lea 的 util.concurrent 程序包 (/dl/classes/edu/oswego/cs/dl/util/concurrent/intro.html)。将 concurrenthashmap 用作默认 map。当移植到 1.5 版时,将 java.util.concurrent.concurrenthashmap 用作您的默认 map。不要将 concurrenthashmap 包装在同步的包装器中,即使它将用于多个线程。使用默认大小和负载因子。监测您的应用程序。如果发现某个 map 造成瓶颈,则分析造成瓶颈的原因,并部分或全部更改该 map 的以下内容:map 类;map 大小;负载因子;关键对象 equals() 方法实现。专用的 map 的基本上都需要特殊用途的定制 map 实现,否则通用 map 将实现您所需的性能目标。map 选择也许您曾期望更复杂的考量,而这实际上是否显得太容易? 好的,让我们慢慢来。首先,您应使用哪种 map?答案很简单: 不要为您的设计选择任何特定的 map,除非实际的设计需要指定一个特殊类型的 map。设计时通常不需要选择具体的 map 实现。您可能知道自己需要一个 map,但不知道使用哪种。而这恰恰就是使用 map 接口的意义所在。直到需要时再选择 map 实现 如果随处使用“map”声明的变量,则更改应用程序中任何特殊 map 的 map 实现只需要更改一行,这是一种开销很少的调整选择。是否要使用默认的 map 实现? 我很快将谈到这个问题。同步 map同步与否有何差别? (对于同步,您既可以使用同步的 map,也可以使用 collections.synchronizedmap() 将未同步的 map 转换为同步的 map。后者使用“同步的包装器”)这是一个异常复杂的选择,完全取决于您如何根据多线程并发访问和更新使用 map,同时还需要进行维护方面的考虑。例如,如果您开始时未并发更新特定 map,但它后来更改为并发更新,情况将如何? 在这种情况下,很容易在开始时使用一个未同步的 map,并在后来向应用程序中添加并发更新线程时忘记将此未同步的 map 更改为同步的 map。这将使您的应用程序容易崩溃(一种要确定和跟踪的最糟糕的错误)。但如果默认为同步,则将因随之而来的可怕性能而序列化执行多线程应用程序。看起来,我们需要某种决策树来帮助我们正确选择。doug lea 是纽约州立大学奥斯威戈分校计算机科学系的教授。他创建了一组公共领域的程序包(统称 util.concurrent),该程序包包含许多可以简化高性能并行编程的实用程序类。这些类中包含两个 map,即 concurrentreaderhashmap 和 concurrenthashmap。这些 map 实现是线程安全的,并且不需要对并发访问或更新进行同步,同时还适用于大多数需要 map 的情况。它们还远比同步的 map(如 hashtable)或使用同步的包装器更具伸缩性,并且与 hashmap 相比,它们对性能的破坏很小。util.concurrent 程序包构成了 jsr166 的基础;jsr166 已经开发了一个包含在 java 1.5 版中的并发实用程序,而 java 1.5 版将把这些 map 包含在一个新的 java.util.concurrent 程序包中。所有这一切意味着您不需要一个决策树来决定是使用同步的 map 还是使用非同步的 map, 而只需使用 concurrenthashmap。当然,在某些情况下,使用 concurrenthashmap 并不合适。但这些情况很少见,并且应具体情况具体处理。这就是监测的用途。结束语通过 oracle jdeveloper 可以非常轻松地创建一个用于比较各种 map 性能的测试类。更重要的是,集成良好的监测器可以在开发过程中快速、轻松地识别性能瓶颈 - 集成到 ide 中的监测器通常被较频繁地使用,以便帮助构建一个成功的工程。现在,您已经拥有了一个监测器并了解了有关通用 map 及其性能的基础知识,可以开始运行您自己的测试,以查明您的应用程序是否因 map 而存在瓶颈以及在何处需要更改所使用的 map。以上内容介绍了通用 map 及其性能的基础知识。当然,有关特定 map 实现以及如何根据不同的需求使用它们还存在更多复杂和值得关注的事项,这些将在本文第 2 部分中介绍。jack shirazi是 oreilly 的“java 性能调整”的作者,以及受欢迎的 javaperformancet 网站(提供 java 性能信息的全球知名站点)的总监。jack 在 java 性能领域提供咨询并著书立说。他还监督 javaperformancet 提供的信息,其中包括每年大约发布 1000 条性能技巧以及许多有关性能工具、讨论组等内容的文章。jack 早年还曾发布有关蛋白质结构预测以及黑洞热力学方面的文章,而且在其空闲时还对某些 perl5 核心模块作出了贡献。3java学习之iterator(迭代器)的一般用法 (转)/amboyna/archive/2007/09/25/904804.html迭代器(iterator)迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。java中的iterator功能比较简单,并且只能单向移动: (1) 使用方法iterator()要求容器返回一个iterator。第一次调用iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.iterable接口,被collection继承。 (2) 使用next()获得序列中的下一个元素。 (3) 使用hasnext()检查序列中是否还有元素。 (4) 使用remove()将迭代器新返回的元素删除。iterator是java迭代器最简单的实现,为list设计的listiterator具有更多的功能,它可以从两个方向遍历list,也可以从list中插入和删除元素。迭代器应用:list l = new arraylist();l.add(aa);l.add(bb);l.add(cc);for (iterator iter = l.iterator(); iter.hasnext();) string str = (string)iter.next();system.out.println(str);/*迭代器用于while循环iterator iter = l.iterator();while(iter.hasnext()string str = (string) iter.next();system.out.println(str);*/4用saxreader解析xml文档/seayqrain/article/details/5024068使用saxreader需要导入dom4j-full.jar包。 dom4j是一个java的xml api,类似于jdom,用来读写xml文件的。dom4j是一个非常非常优秀的java xml api,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在sourceforge上找到它。 使用举例:1. s.xml内容xhtmlview plaincopy1. 2. 3. 4. 2.解析c-sharpview plaincopy1. importjava.io.file;2. importjava.io.fileinputstream;3. importjava.io.filenotfoundexception;4. importjava.util.iterator;5. importjava.util.list;6. importorg.dom4j.document;7. importorg.dom4j.documentexception;8. importorg.dom4j.element;9. importorg.dom4j.io.saxreader;10. importorg.dom4j.tree.abstractattribute;11. 12. publicclassreadxmltest13. 14. publicstaticvoidmain(stringargs)15. filexmlfile=newfile(c:/s.xml);16. fileinputstreamfis=null;17. try18. fis=newfileinputstream(xmlfile);19. catch(filenotfoundexceptione)20. e.printstacktrace();21. system.err.println(fileisnotexsit!);22. 23. 24. saxreadersaxreader=newsaxreader();25. listrowlist=null;26. try27. /生成文档对应实体28. documentdoc=saxreader.read(fis);29. /获取指定路径下的元素列表,这里指获取所有的data下的row元素30. rowlist=doc.selectnodes(/data/row);31. catch(documentexceptione)32. e.printstacktrace();33. 34. 35. 36. for(iteratoriter=rowlist.iterator();iter.hasnext();)37. /获得具体的row元素38. elementelement=(element)iter.next();39. /获得row元素的所有属性列表40. listelementlist=element.attributes();41. for(iteratoriter1=elementlist.iterator();iter1.hasnext();)42. /将每个属性转化为一个抽象属性,然后获取其名字和值43. abstractattributeaa=(abstractattribute)iter1.next();44. system.out.println(name:+aa.getname()+;value:+aa.getvalue();45. 46. /输出:47. /name:querydto.enterpriseid;value:gfd48. /name:querydto.loginname;value:gdfg49. /name:querydto.state;value:050. system.out.println(element.getname();51. /输出:52. /row53. /取得row元素的querydto.enterpriseid属性的值54. system.out.println(element.attributevalue(querydto.enterpriseid);55. /输出:56. /gfd57. /如果element下有子元素,(类似width=*),要想获得该子元素的值,可以用如下方法58. system.out.println(element.elementtext(width);/因为没有,所以输出为null。59. 60. 61. 62. 5 getclass(),class属性和getname()解析一、getclass方法:类型:public final class getclass()功能:返回该对象的运行时类的java.lang.class对象(api上的解释)有方法类型可以知道,该方法只能由类的实例变量调用例子:javaview plaincopy1. jbuttonb1=newjbutton(button1);2. system.out.println(b1.getclass();输出:class javax.swing.jbuttonclass属性当你要获得一个类的class对象时(作函数参数的时候),你不能调用getclass方法,那你只能用类名.class来达到效果例子:javaview plaincopysystem.out.println(jbutton.class);输出:class javax.swing.jbuttongetname方法:类型:public string getname()功能:以string形式返回次class对象所表示的实体名称例子:javaview plaincopy1. jbuttonb1=newjbutton(button1);2. system.out.println(b1.getname();输出:javax.swing.jbutton可以发现用class属性和getclass返回的输出是一样的,用getname返回的比前面两种少了class和一个空格。.eclipse工具 可以按.然后马上提示很多方法 供你选择那他如何知道.了以后有哪些方法?他用的语法就是getclass().getmethods();二、.class其实是在java运行时就加载进去的getclass()是运行程序时动态加载的下面以例子说明:1. 首先建一个基类baseclass2. 3. packageclassyongfa;4. 5. publicclassbaseclass6. 7. privatestringheight;8. publicstringgetheight()9. 10. returnheight;11. 12. 13.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中修辞手法比喻的课件
- 高三高原反应课件
- 2024学年嘉兴市高三语文上学期期中考试卷附答案解析
- 高一生物必修二卵母细胞课件
- 高一女性的课件
- 2025秋苏教版(2024)小学科学二年级上册(全册)教学设计(附目录P123)
- 互联网投资担保合同签订流程及风险控制策略
- 离职员工知识产权保护及竞业限制协议范本
- 生态环境局等行政协调的生态修复项目监理合同
- 离婚协议书(含子女监护权及探望权)
- 污水处理厂设备更新项目可行性研究报告
- 2025反洗钱知识题库及答案
- 第十四章 全等三角形 单元测试(含部分解析) 2025-2026学年人教版八年级数学上册
- 2025年中式烹调师(技师)考试题库及答案
- 小儿疱疹性咽峡炎护理查房
- 中班健康:变质食物不能吃
- 初中英语新人教版八年级上册全册单词(2025秋)
- 支气管扩张伴咯血的护理
- 小红书自媒体教你小红书种草方案
- 村居法律明白人培训课件
- 6.3.3 点到直线的距离 课件-2025-2026学年高一数学高教版2023修订版基础模块 下册
评论
0/150
提交评论