1.Vector:用ArrayList代替Vector。
(1). Vector中所有的方法都是同步的,所以用Vector来存取元素的话效率比较低. ArrayList方法不是同步的.
(2).但有的时候,我们确实需要在多线程的情况下使用列表, 我们可以用Collections类中为我们提供的一个方法:public static <T> List<T> synchronizedList(List<T> list), 返回由指定列表支持的同步(线程安全的)列表。其它的Set, Map操作也是一样
2. Hashtable:用HashMap代替Hashtable。
(1).Hashtable中的方法是同步的, HashMap中的方法不是同步的.
(2).HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作。
3.Satck:用LinkedList代替Stack。
(1).Satck这个类在当初设计的时候就有一些潜在的问题, (Stack从Vector继承而来的public E elementAt(int index),不符合Stack数据结构特性, 所以我们不应该使用Stack这个类,如果我们需要Stack这种数据结构,我们可以自己编写一个(参考前面在介绍LinkedList的时, 用它来实现的栈这种数据结构))
4.Properties,属性类,从Hashtable继承而来,表示一个持久的属性集,存放字符串类型的键值对.
(1).打印系统属性的一个例子
import java.util.*;
class PropTest
{
public static void main(String[] args)
{
Properties pps=System.getProperties();
pps.list(System.out);
}
}
(2).获取配置文件中键值对的例子
import java.util.*;
import java.io.*;
class PropTest
{
public static void main(String[] args)
{
Properties pps=new Properties();
try
{
pps.load(new FileInputStream("winsun.ini"));
Enumeration enum=pps.propertyNames();
while(enum.hasMoreElements())
{
String strKey=(String)enum.nextElement();
String strValue=pps.getProperty(strKey);
System.out.println(strKey+"="+strValue);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
4.枚举(Enumeration )
(1). 枚举是一个接口, 在这个接口当中提供了两个方法
i.boolean hasMoreElements() : 测试此枚举是否包含更多的元素
ii: E nextElement() : 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。
(2),枚举的用法的迭代器很类似,先判断,然后获取下一个元素.(这种集合是1.0遗留下来的, 现在大多用Iterator,JAVA集合框架是在1.2以后才确定下来的)
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作。
分享到:
相关推荐
这个版本包含了`jdom-1.0.jar`包,它是JDOM 1.0的核心库文件,包含了所有必要的类和方法来处理XML。通过导入这个jar包,开发者可以在他们的项目中直接使用JDOM的功能,如读取XML文件、创建新的XML结构、修改现有XML...
版本1.0和1.1分别代表了这个工具的不同迭代,通常新版本会带来性能提升、功能增强或者修复已知问题。`solr-mongo-importer-1.1.0.jar`和`solr-mongo-importer-1.0.0.jar`就是这两个版本的实现,它们包含了导入过程所...
JAR(Java Archive)是Java平台上的归档文件格式,用于集合多个类文件和其他资源,便于部署和分发Java应用或库。 在实际使用中,首先需要在Solr中配置MongoDB连接信息,包括MongoDB的主机名、端口、数据库名、集合...
标题中的“KAFKA-3.1.1-1.3.1.1.p0.2-el7.parcel”指的是Apache Kafka的一个特定版本的软件包,适用于Red Hat Enterprise Linux 7(RHEL 7)系统。这个版本是3.1.1,并且可能是某个特定发行版或修补版的1.3.1.1.p0.2...
1. **引入Jaxen库**:首先,你需要将"jaxen-1.1-beta-6.jar"添加到你的项目类路径中,这可以通过构建工具(如Maven或Gradle)或者手动设置实现。 2. **创建XPath对象**:使用`XPathFactory`创建一个`XPath`实例,`...
- `commons-collections-3.1`:提供额外的集合类和算法。 - `dom4j-1.6.1.jar`:XML解析库。 - `javassist-3.12.0.GA.jar`:字节码操作库,用于动态创建类。 - `jta-1.1.jar`:事务管理接口,实现分布式事务。 - `...
- **Java 1.0**:第一个公开发布的版本,包含8个包,212个类。 - **Java 1.1**:已过时。 - **Java 2 (1.2)**:改名后的版本,包含59个包,1520个类。 - **Java 1.3, 1.3.1**:主要是对Java 2的一些bug进行修复。 - ...
2. **集合框架**:虽然 JDK 1.2 才完整引入了集合框架,但 JDK 1.1 已经引入了 `Vector` 和 `Stack` 类,它们是后来的 `ArrayList` 和 `LinkedList` 的前身,为存储和操作对象数组提供了便利。 3. **接口**:JDK ...
1. **JavaBeans**: JavaBeans是一种符合特定规范的Java类,通常用于构建组件或GUI应用程序。它们具有可设置的属性、构造方法和事件处理方法。BeanUtils库主要就是为了方便地操作这些JavaBeans的属性。 2. **属性...
在Java编程环境中,JAR(Java Archive)文件是一种打包格式,用于集合多个类文件、相关的元数据以及资源文件。在这个插件的JAR文件中,开发者可能定义了接口、类、方法等,用于处理用户身份验证、密码加密解密、...
- 学习 Java 语法的基本结构和规则,如变量、控制流语句、类和对象等。 - 实践基本的 Java SE API,包括字符串处理、异常处理、集合框架、I/O 操作、多线程等。 - 参考官方文档:...
**JAVA编码规范文档整合阿里巴巴Java开发规范手册** **1. 概览** 在软件开发过程中,遵循统一的编码规范是确保代码质量、可读性和团队协作效率的关键。阿里巴巴的Java开发规范提供了一套完整的指导原则,旨在提升...
随着版本的升级,JDK 1.1引入了JIT编译器,提高了性能,JDK 1.2则将Java技术划分为J2SE(Java标准版)、J2EE(Java企业版)和J2ME(Java微型版),并引入Swing组件库。JDK 1.3和1.4进一步增强了功能,如JNDI、JNI和...
其中`<init-param>`用于指定包含资源类的Java包名,而`<url-pattern>`则指定了Jersey servlet处理的所有URL模式。 通过这种方式,您就可以使用Eclipse和Tomcat构建并部署简单的RESTful Web服务了。接下来,您可以...
开发者需要使用轻量级的API来实现功能,例如使用`javax.microedition.io`包进行网络通信,`java.util`包的有限集合类等。 **四、开发与部署** 1. **开发工具**:早期的J2ME开发通常使用Sun Microsystems提供的...
- **1995年:Java 1.0** - 发布时间:1996年1月23日 - 代号:Oak - 类或接口数量:211 - 主要新特性或功能: - 纯解释执行的Java虚拟机(Sun Classic VM) - Applet - AWT - **1997年:Java 1.1** - 类或...
- **Java 2(J2SE 1.2、1.3、1.4)**:这个阶段的Java增加了大量的新特性,如Swing GUI组件库、集合框架等。 - **Java 5**:引入了泛型、枚举、注解等重要的语言特性。 - **Java 6**:增强了图形处理能力和安全性。 ...
##### 9.6 Java集合工具类:Collections - 提供静态方法对集合进行操作。 #### 10. Java常用类 ##### 10.1 System类 - 包含系统相关的操作方法。 ##### 10.2 Runtime类 - 提供了与当前Java应用的运行时系统相连接...
- **内容概述**:此描述简略,但从标题可以推测本书主要内容包括Java基础知识、面向对象编程、图形用户界面开发、异常处理、集合框架、多线程、网络编程等。 ### 部分内容示例解析: #### 1. Write Once, Run ...