- 浏览: 143097 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (152)
- 资讯 (53)
- 随笔 (11)
- 学习 (10)
- 算法 (6)
- 模式 (4)
- 性能 (2)
- 源码 (1)
- java (15)
- jquery (0)
- linux (10)
- html5 (1)
- jboss (4)
- struts (2)
- NA (1)
- jbpm (1)
- oracle (4)
- eclipse (1)
- play (6)
- ios (1)
- Objective-C (1)
- mysql (1)
- nosql (1)
- redis (4)
- 总结 (4)
- 面试 (4)
- vue (1)
- Mac (1)
- 原型设计 (1)
- sharding-jdbc (0)
- shardingsphere (1)
- shardingjdbc (1)
- zookeeper (1)
- kafka (2)
- 腾讯云 (1)
- Docker (1)
最新评论
-
szh_java:
问楼主一个问题,我在ejb中使用了log4j,用weblogi ...
JBoss EJB应用程序迁移到WebLogic上 -
429537044:
多谢楼主分享
eclipse + jbpm5 + jboss的集成配置 -
qingling600:
现在这个JS 怎么不能下载啊。。。
12306辅助js 实现自动登录 自动查票 自动订单 -
dx1234xd:
搞错了吧,怎么从时间比直接比出速度比了?忽略路程不算?
IQ题 -
woshifeixiaochuan:
很不错,学习了,谢谢
html5-canvas
7. Java集合类
我们在写程序的时候并不是每次只使用一个对象, 更多的是对一组对象进行操作, 这就需要知道如何组合这些对象, 还有在编码的时候我们有时并不知道到底有多少对象,它们需要进行动态的分配存放。
Java的集合类只能容纳对象句柄, 对于简单类型的数据存放, 只能通过数据来存放, 数组可以存放简单类型的数据也能存放对象。
Java提供了四种类型的集合类: Vector(矢量), BitSet(位集), Stack(堆栈), Hashtable(散列表)。
1. 矢量: 一组有序的元素, 可以通过index进行访问。
2. 位集: 其实就是由二进制位构成的Vector, 用来保存大量”开-关”信息, 它所占的空间比较小, 但是效率不是很高, 如果想高效率访问, 还不如用固定长度的数组。
3. 堆栈: 先入后出(LIFO)集合, java.util.Stack类其实就是从Vector继承下来的, 实现了pop, push方法。
4. 散列表: 由一组组“键--值”组成, 这里的键必须是Object类型。 通过Object的hashCode进行高效率的访问。
对于这些集合之间的关联关系见下图, 其中标色的部分为我们常用的类。
由上图可以看出, 基本接口有两个:
Collection: 所有的矢量集合类都从它继承下去的, 但并不直接从它继承下去的。 List与Set这两个接口直接继承了Collection, 他们的区别是List里面可以保存相同的对象句柄, 而Set里面的值是不重复的。 我们经常用的Vector与ArrayList就是从List继承下去的, 而HashSet是从Set继承的。
Map:散列表的接口, Hashtable与HashMap继承了这个接口。
下面给出常用集合类的常用方法。
/** * Vector 与 ArrayList的操作几乎是一样的 * 常用的追加元素用add(), 删除元素用remove() * 取元素用get(), 遍历它可以循环用get()取. 或者 * 先得到一个Iterator, 然后通过遍历Iterator的方法 * 遍历Vector或ArrayList */ // 生成一个空的Vector Vector vector = new Vector(); // 在最后追加一个元素。 vector.add("one"); vector.add("two"); // 在指定的地方设置一个值 vector.set(0, "new one"); // 移走一个元素或移走指定位置的元素 vector.remove(0); // 用for循环遍历这个Vector for (int i = 0; i < vector.size(); i++) { String element = (String) vector.get(i); } // 用枚举器(Enumeration)遍历它(只有Vector有,ArrayList没有) Enumeration enu = vector.elements(); while (enu.hasMoreElements()) { enu.nextElement(); } // 用反复器(Iterator)遍历它 Iterator it = vector.iterator(); while (it.hasNext()) { it.next(); } /** * Hashtable与HashMap的操作, 追加元素用put(不是add) * 删除元素用remove, 遍历可以用Iterator 既可以遍历 * 它的key, 也可以是value */ // 生成一个空的Hashtable或HashMap Hashtable hashtable = new Hashtable(); // 追加一个元素 hashtable.put("one", "one object value"); // 删除一个元素 hashtable.remove("one"); // 用Iterator遍历 Iterator keyIt = hashtable.keySet().iterator(); while (keyIt.hasNext()) { Object keyName = keyIt.next(); String value = (String) hashtable.get(keyName); } Iterator valueIt = hashtable.values().iterator(); while (valueIt.hasNext()) { valueIt.next(); } // 用Enumeration遍历, 只有Hashtable有, HashMap没有. Enumeration enu = hashtable.elements(); while (enu.hasMoreElements()) { enu.nextElement(); }
说明: Enumeration是老集合库中的接口, 而Iterator是新集合(1.2)中出现的, 而Vector与Hashtable也都是老集合中的类, 所以只有Vector与Hashtable可以用Enumeration。
Vector与ArrayList对比:
虽然在使用的时候好象这两个类没什么区别, 它们都是从List继承下来的, 拥有相同的方法, 但它们的内部还是有些不同的,
Ø 首先Vector在内部的一些方法作了线程同步(synchronized)。 同步的代价就是降低了执行效率, 但提高了安全性。而ArrayList则是线程不同步的, 可以多线程并发读写它。
Ø 内部数据增长率。 所有的这些矢量集合在内部都是用Object的数组进行存储和操作的。 所以也就明白了为什么它可以接受任何类型的Object, 但取出来的时候需要进行类型再造。 Vector与ArrayList具有自动伸缩的功能, 我们不用管它size多大, 我们都可以在它的后面追加元素。 Vector与ArrayList内部的数组增长率是不一样的, 当内部的数组不能容纳更多元素的时候, Vector会自动增长到原两倍大小, ArrayList会变为原一倍半大小, 而不是我们所想象的一个元素一个元素的增长。
Hashtable与HashMap对比:
Hashtable与HashMap都是从Map继承下来的, 方法几乎都一样, 它们内部有两个不同点:
Ø 与Vector和ArrayList一样, 它们在线程同步是不同的, Hashtable在内部做了线程同步, 而HashMap是线程不同步的。
Ø HashMap的键与值都可以为null, 而Hashtable不可以, 如果你试图将一个null值放到Hashtable里面去, 会抛一个NullPointException的。
性能对比:
抛开不常用的集合不讲, 每种集合都应该有一个我们常用的集合类, 而在不同的场合下应该使用效率最高的一个。 一般来说我推荐尽量使用新的集合类, 除非不得已, 比如说需要用用了老集合类写的产品的程序。 也就是说尽量使用ArrayList与HashMap, 而少使用Vector与Hashtable。
Ø 在单线程中使用ArrayList与HashMap, 而在多线程中如果需要进行线程同步可以使用Vector与Hashtable, 但也可以用synchronized对ArrayList与HashMap进行同步, 不过同步后的ArrayList与HashMap是比Vector与Hashtable慢的。 不过我认为需要进行线程同步的地方并不多。 如果一个变量定义在方法内部同时只可能有一个线程对之进行操作, 就不必要进行同步, 如果定义在类的内部并且不是静态的, 属于实例变量, 而这个类并没有被多线程使用也就不必要同步。
一般自己写的程序很少会自己去另开线程的, 但在Web开发的时候, 如果用了Servlet, 则每个request都是一个线程, 也就是说每个Servlet都是在多线程环境下运行的, 如果Servlet中使用了全局静态的成员变量就得小心点儿, 如果需要同步就得在方法上加上synchronized修饰符, 如果允许多个线程操作它, 并且你知道不会有什么冲突问题就可以大胆的使用ArrayList与HashMap。 另外如果在多线程中有线程在对ArrayList或HashMap进行修改(结构上的修改), 而有一个线程在用Iterator进行读取操作, 这个时候就有可能会抛ConcurrentModificationException, 因为用Iterator的时候, 不允许原List的结构改变。但可以用get方法来取。
常用技巧:
1. 采用面向接口的编程技巧, 比如现在需要写一个共通函数,对矢量集合类诸如Vector,ArrayList,HashSet等等进行操作, 但我并不知道最终用户会具体传给我什么类型的类, 这个时候我们可以使用Collection接口, 从而使代码具有很大的灵活性。 代码示例如下:
/** * 将list里面的所有元素用sep连接起来, * list可以为Vector, ArrayList, HashSet等。 */ public static String join(String sep, Collection list) { StringBuffer sb = new StringBuffer(); Iterator iterator = list.iterator(); while (iterator.hasNext()) { sb.append(iterator.next()); if (iterator.hasNext()) { sb.append(sep); } } return sb.toString(); }
2. 利用Set进行Unique, 比如有一组对象(其中有对象是重复的), 但我们只对不同的对象感兴趣, 这个时候可以使用HashSet这个集合类, 然后可以通过覆盖Object的equals方法来选择自定义判断相等的rule。 缺省的是地址判断。 例:
class DataClass { private String code = null; private String name = null; public void setCode(String code) { this.code = code; } public String getCode() { return this.code; } public void setName(String name) { this.name = name; } public String getName() { return this.name; } public boolean equals(DataClass otherData) { if (otherData != null) { if (this.getCode() != null && this.getCode().equals(otherData.getCode()) { return true; } } return false; } } DataClass data1 = new DataClass(); DataClass data2 = new DataClass(); data1.setCode("1"); data2.setCode("1"); HashSet singleSet = new HashSet(); singleSet.add(data1); singleSet.add(data2);
结果singleSet里面只有data1, 因为data2.equals(data1), 所以data2并没有加进去。
3. 灵活的设计集合的存储方式, 以获得较高效的处理。 集合里面可以再嵌套集合, 例:在ArrayList里面存放HashMap, HashMap里面再嵌套HashMap。
发表评论
-
【温故】Java中的ReentrantLock和synchronized两种锁定机制的对比
2016-04-12 18:57 584多线程和并发性并不是什么新内容,但是 Java 语言设计中 ... -
【温故】 java序列化和反序列化
2016-01-22 12:01 5921.java对象序列化 在保存磁盘文件,网络上传输数据, ... -
多线程中的long和double
2015-12-31 11:37 613在看一些代码的时候,会发现在定义long型和double型的 ... -
Java中的Integer.toHexString(int i)
2015-10-04 15:16 738在Java中,如果想要把一个十进制整数转换为十六进制,可以使 ... -
Java 常用API的运用,效率及技巧十一
2012-01-01 00:19 1004常用设计模式 1.Singleton模式 Singleto ... -
Java 常用API的运用,效率及技巧十
2011-12-31 09:08 87810. JDBC类库 有了 JDBC,向各种关系数据库发送 ... -
Java 常用API的运用,效率及技巧九
2011-12-31 09:06 7589. Exceptions Ja ... -
Java 常用API的运用,效率及技巧八
2011-12-31 09:06 8848.ResourceBundle, Properties R ... -
Java 常用API的运用,效率及技巧六
2011-12-31 09:05 8246. Java IO系统 ... -
Java 常用API的运用,效率及技巧五
2011-12-30 10:33 8795.Class, ClassLoader Java是一种介于 ... -
Java 常用API的运用,效率及技巧四
2011-12-30 10:28 9194.数值,字符,布尔对象与简单类型的操作 简单的对照表如下: ... -
Java 常用API的运用,效率及技巧三
2011-12-30 10:27 15553.String, StringBuffer 3.1 基本 ... -
Java 常用API的运用,效率及技巧二
2011-12-30 10:25 8062.System System类位于pack ... -
Java 常用API的运用,效率及技巧一
2011-12-30 10:18 7581. Java面向对象基本概 ...
相关推荐
Java学习的常用API是开发者日常编码和学习过程中不可或缺的参考资料,尤其对于初学者,理解并掌握这些API至关重要。本资源集合了多个领域的API文档,包括Struts2、Spring、Hibernate、MySQL、Oracle以及一些基础技术...
对于开发者来说,深入理解和熟练运用Java API是提高编程效率和编写高质量代码的关键。通过阅读JDK_API_1_6_zh_CN.CHM这份中文参考文档,开发者可以详细了解到每个类的功能、方法的使用以及参数的含义,从而更好地...
以上就是关于"java 常用工具类"的一些关键知识点,了解并熟练运用这些工具类可以显著提高我们的编程效率,减少代码量,同时使得程序更易于理解和维护。通过阅读博文链接中的内容,可以深入学习和掌握更多实用技巧。
在"JAVA初学者 第6到第8章"的学习资料中,你将深入理解这两个主题,并了解一些常用的Java编程技巧。 首先,让我们来探讨接口。在Java中,接口是一种完全抽象的类型,它只包含常量和抽象方法的声明,不包含任何实现...
以上仅是Java常用方法的一小部分,实际上Java API包含数千个方法。通过深入学习和实践,你可以掌握更多高效编程技巧,提升自己的编程能力。在实际工作中,结合《Java常用方法大全》这样的参考资料,可以随时查阅和...
这篇博客“java常用正则表达式(转)”可能详细介绍了Java如何使用正则表达式进行各种操作。虽然没有具体的描述内容,但我们可以从标题和标签中推测,这篇博客可能涵盖了以下几个方面: 1. **正则表达式基础**: -...
10. **标准库和API**:Java的标准库提供了大量预定义的类和方法,如日期时间API、网络编程API、XML处理等,熟悉这些API能极大地提高开发效率。 通过对这些知识点的学习和实践,开发者不仅能掌握Java的基础开发技巧...
"Java程序设计技巧1001例"这个资源显然旨在帮助开发者深入理解和运用这些技巧。以下是一些重要的Java编程技巧,涵盖了基础到高级的各个方面。 1. **异常处理**:在Java中,使用try-catch-finally语句块来处理异常是...
在Java编程语言中,了解和熟练使用常用的包以及...理解并熟练运用这些知识,将有助于提升Java编程的效率和质量。在实际开发中,还会涉及到更多高级特性和技巧,如多线程、并发控制、设计模式等,都需要不断学习和实践。
在Java编程中,掌握一些高效的编码技巧能显著提升代码质量并减少错误。以下是一些关键的知识点,基于提供的文件内容...在实际开发中,灵活运用这些技巧,不仅可以编写出高质量的代码,还能避免常见错误,提升开发效率。
Java编程语言在IT行业中占有重要地位,而Java开发者在日常工作中常常会接触到各种框架,以提升开发效率和软件质量。本教程重点聚焦于两个著名的Java框架:Activiti和Dubbo,它们分别在业务流程管理和分布式服务领域...
在Java程序设计的世界里,掌握各种技巧是提升编程效率和代码质量的关键。"Java程序设计技巧1001例"是一本深入浅出的指南,它涵盖了从基础到高级的各种编程实践,旨在帮助开发者们更好地理解和运用Java语言。在这个...
这些API的使用是Java编程实践中的常见任务,理解和熟练运用它们能大大提高开发效率。 在描述中提到“实务入门”,这意味着本书不仅会讲解理论知识,还会结合实际案例,提供代码示例和练习,帮助读者将所学知识应用...
3. **Java框架**:Spring、MyBatis、Hibernate等,是企业级开发中常用的工具,掌握它们可以提高开发效率。 4. **Java最佳实践**:包括代码规范、设计模式、重构技巧等,帮助写出更高质量的代码。 5. **开源社区**...
Java程序设计是编程领域中的重要一环,尤其对于初学者来说,掌握其基本概念和实践技巧至关重要。"Java程序设计教程第五版教材(美国)"是一本面向初学者的指南,旨在帮助读者深入理解Java编程语言,并通过实际例题来...
8. **JVM**: 对Java虚拟机(JVM)的理解,包括内存管理(堆、栈、方法区)、垃圾回收机制、类加载过程以及性能优化技巧,对于写出高效且稳定的Java应用至关重要。 9. **Spring框架**: Spring是Java企业级应用中最...
下面我们将深入探讨Java中常用的正则表达式及其应用。 1. **正则表达式基础** - **字符类**:`[]`用于定义一个字符集合,例如`[abc]`匹配'a'、'b'或'c'。 - **量词**:`*`表示零个或多个,`+`表示一个或多个,`?`...
函数式编程在Java 8之后得到了加强,你可以通过阅读本书了解Lambda表达式、Stream API和方法引用来简化代码,提高代码的可读性和效率。 网络编程也是Java的一大特色,书中可能会涵盖Socket编程,让你学会如何创建...