几种数据结构,就把这几样拿出来实现了一下,比较他们的效率。
其中链表和哈希表是直接调用的java.util包下的LinkedList类和HashTable类。
hash算法是采用%操作(mod),效率不是很高,但是作为hash表的代表应该问题不是很大。
创建100万个对象将其放入存储结构中,然后进行增加、删除、查找操作。
每次操作后调用system.nanoTime()方法,获取时间数据。代码如下:
/** * 测试数组时间的方法 */ public void f1(){ int i[] = new int[1000000]; long time1 = System.nanoTime(); //创建一个数组 for(int a=0;a<i.length;a++){ i[a] = a; } long time2 = System.nanoTime(); System.out.println("创建数组时间:"+(time2-time1)); //插入 time1 = System.nanoTime(); int b[] = new int[1000001]; int c = 100; for(int a=0;a<b.length;a++){ if(a<99){ b[a]=i[a]; }else if(a==99){ b[a] = c; }else{ b[a] = i[a-1]; } } time2 = System.nanoTime(); System.out.println("插入数组时间:"+(time2-time1)); //删除 time1 = System.nanoTime(); int d = 99; for(int a = 0;a<i.length;a++){ if(a<d){ i[a]=b[a]; }else{ i[a]=b[a+1]; } } time2 = System.nanoTime(); System.out.println("删除数组时间:"+(time2-time1)); //查找 time1 = System.nanoTime(); int e = 678; for(int a = 0;a<i.length;a++){ if(i[a] ==e){ // System.out.println("找到了e"); } } time2 = System.nanoTime(); System.out.println("查找数组的时间:"+(time2 - time1)); } /** * 链表 */ public void f2(){ // User deleteUser = null; //创建链表 long time1 = System.nanoTime(); for(int i = 0;i<1000000;i++){ User u = new User(i); u1.add(u); } long time2 = System.nanoTime(); System.out.println("创建链表的时间:"+(time2 - time1)); //插入 time1 = System.nanoTime(); User u = new User(99999999); u1.add(100, u); time2 = System.nanoTime(); System.out.println("插入链表的时间:"+(time2 - time1)); //删除 time1 = System.nanoTime(); u1.remove(100); time2 = System.nanoTime(); System.out.println("删除链表的时间:"+(time2 - time1)); //查找 time1 = System.nanoTime(); int findId = 999; for(User findUser:u1){ if(findUser.id == findId){ System.out.println("找到了对应的链表中的对象"); } } time2 = System.nanoTime(); System.out.println("查找链表的时间:"+(time2 - time1)); } /** * hash算法测试 */public void f4(){ Hashtable<User, Integer> ht = new Hashtable<User, Integer>(); long time1 = System.nanoTime(); for(int i=0;i<1000000;i++){ User u = new User(i); //这里默认的put方法自带的hash算法是采用%操作(mod)使数据分布在编号为0~10的bucket中 ht.put(u, i); } long time2 = System.nanoTime(); System.out.println("创建哈希表的时间:"+(time2 - time1)); time1 = System.nanoTime(); int cutId = 999; int cutID2 = 2; User cutU = new User(cutId); cutU.id2 = cutID2; ht.put(cutU, cutId); time2 = System.nanoTime(); System.out.println("插入哈希表的时间:"+(time2 - time1)); time1 = System.nanoTime(); int delId = 999; User delU = new User(delId); ht.remove(delU); time2 = System.nanoTime(); System.out.println("删除哈希表的时间:"+(time2 - time1)); time1 = System.nanoTime(); int findId = 999; ht.get(new User(findId)); time2 = System.nanoTime(); System.out.println("查找哈希表的时间:"+(time2 - time1)); }
一共进行了4次测试:数据如下:
由图可知,哈希表的平均创建时间最长,但是插入、删除和查找平均用时最少。数组创建用时最少,但是插入、删除操作用时最多,查找用时仅次于链表。链表除了查找用时最大,其余都排在数组和哈希表之间。
由以上数据可知,数组的优势在于创建数组用时少,可以适用于规模较小的数据。
链表创建时间比哈希表稍快(约17倍),但是查找用时是哈希表的1000倍以上,是数组的7倍左右。这意味着你要花较多的时间来方便你的插入、删除,但是查找还是算了吧,反正我是不会想经常去查链表里存储的东西的。
哈希表在插入、删除、以及查找操作方面有着优异的表现,但是超长的创建时间提醒:除非你之后要进行大量的增删查改,不然还是用数组来的方便快捷。每次执行代码我的机器总是在创建哈希表的时候要停顿一下。
相关推荐
### Collection的增删查改详解 #### 一、Collection接口概览 `Collection`是Java集合框架中的根接口,它代表一组对象,这些对象也被称为元素。`Collection`接口提供了基本的操作方法,如添加(add)、删除(remove)、...
这就是其他数据结构如链表、集合、哈希表等存在的原因,它们在特定场景下提供了更好的性能和灵活性。 在实际编程中,了解何时使用数组以及如何有效地操作数组至关重要。例如,在上述的Array专题Applet示例中,我们...
分析`java.util.LinkedList`的源码,可以了解其内部如何维护节点的链接以及执行增删查改操作的具体步骤。例如,`add()`方法是如何添加元素的,`remove()`方法是如何删除元素的,`get()`方法是如何查找元素的。 7. ...
- HashMap利用数组和链表(或红黑树)的数据结构,提供快速的增删查改操作,其时间复杂度通常为O(1)。 - `containsKey()`:直接通过哈希函数定位,时间复杂度为O(1)。 - `containsValue()`:需要遍历所有的键值对...
在广东工业大学的实验报告中,学生可能需要实现这些数据结构的函数接口,如数组的增删查改、链表的遍历、栈的压弹栈操作、队列的入队和出队、树的遍历和查找、图的邻接矩阵或邻接表表示,以及哈希表的插入和查找功能...
这些类和接口提供了高效的数据组织和操作方法,如增删查改。了解它们的区别和适用场景是提高代码效率的关键。 5. **树结构**:二叉树、AVL树、红黑树等是常见的树形数据结构。在Java中,TreeSet和TreeMap利用红黑树...
- 数据库操作:实现增删查改等基本数据库操作,可能用到集合或数据库API。 - 会员管理:涉及到用户信息的存储和管理。 9. 学生成绩管理: - 数据结构:使用数组或链表存储成绩,实现排序、查找等功能。 - 文件...
红黑树是一种自平衡的二叉搜索树,它通过添加额外的信息(节点颜色)来保持树的平衡,从而保证增删查改操作的最坏情况时间复杂度为O(log n)。 堆是一种特殊的完全二叉树,所有节点都满足堆性质:如果一个节点的值...
- **ArrayList与LinkedList**:数组和链表实现,增删查改效率对比。 - **HashMap与TreeMap**:哈希表和红黑树实现,遍历和查找性能。 - **HashSet与LinkedHashSet**:无序和有序集合,以及元素唯一性保证。 5. *...
- 搜索机制:为了快速找到特定联系人,可以使用哈希表或二分查找法(如果链表已排序)优化查找效率。 - 排序:对通讯录进行排序可以按字母顺序排列姓名,也可以根据其他字段如生日等进行排序。 3. **文件操作**:...
`iterator()`方法返回的迭代器可用于遍历集合并执行增删查改操作,迭代器提供了如下方法: - `boolean hasNext()`: 判断是否还有更多元素。 - `Object next()`: 获取并返回下一个元素。 - `void remove()`: 移除当前...
- **SQL操作**:执行增删查改操作,使用Statement或PreparedStatement。 - **结果集处理**:遍历和处理查询返回的结果集。 10. **Java开发工具** - **JDK(Java Development Kit)**:包含了开发和运行Java应用...
可能会让你实现这些数据结构的基本操作,比如数组的查找、排序,链表的插入、删除,栈的压入、弹出,队列的入队、出队,哈希表的增删查改等。 3. **算法**:常见算法题包括排序(冒泡、选择、插入、快速、归并等)...
例如,使用适当的排序算法可以提高程序的执行速度,使用哈希表可以实现高效的查找功能,利用二叉搜索树可以快速地进行增删查改操作。此外,掌握递归和迭代等基本算法设计技巧,可以帮助解决复杂的问题。 总的来说,...
红黑树是一种自平衡的二叉查找树,它通过在节点中引入红黑属性来保证树的平衡,从而确保增删查改操作的时间复杂度稳定在O(logn)。 哈希表是一种根据关键码的值而直接进行访问的数据结构,它通过散列函数将关键码...
假设我们要实现一个简单的文件管理系统,该系统需要支持文件的增删查改操作,同时还要能够快速地找到指定的文件。这里我们可以使用哈希表(散列表)来实现。 哈希表通过哈希函数将键映射到表的一个位置来访问记录,...
此外,为了提高查询效率,可以考虑使用哈希表或者二叉搜索树。哈希表通过计算哈希值实现快速定位,适合于姓名的快速查找;而二叉搜索树则保证了数据的有序性,支持快速的区间查询和排序。如果进一步优化,还可以引入...
Java集合框架中的`Collection`接口是所有单值容器的基础接口,它定义了基本的增删查改元素的方法。`Collection`有两个主要的子接口:`List`和`Set`。`List`接口要求元素保持特定的顺序,并允许重复元素;而`Set`接口...