在Java实际开发中,我们会常常用到容器,那么各种容器类我们该如何进行抉择呢?在这里进行一个简单的总结。
1、对List的选择
对于随机访问的get()和set()操作,背后有数组支撑的List仅仅ArrayList稍微快一点,但是对于LinkedList,相同的操作会产生高昂的性能消耗,因为它本身就不是针对随机访问操作而设计的。
避免使用Vector,它只是存在于支持遗留代码的类库中。最佳的做法就是将ArrayList作为默认首选,只有当你需要使用额外的功能的时候,或者当程序的性能因为经常进行插入和删除操作而变差的时候,就去选择LinkedList。如果元素的数量确定,那么我们既可以选择List,也可以选择真正的数组。
如果是在多线程环境下呢?我们选择CopyOnWriteArrayList!
补充:List有序。
package com.tu.test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ListTest {
public static void main(String[] args){
System.out.println("ArrayList:");
List<Object> myList = new ArrayList<Object>();
myList.add("WuHoujian");
myList.add(null);
myList.add(null);
System.out.println(myList.toString());
System.out.println("index of null is :" + myList.indexOf(null));
System.out.println("LinkedList:");
LinkedList<Object> myLinkedList = new LinkedList<Object>();
myLinkedList.addFirst("test11");
myLinkedList.addFirst("test22");
myLinkedList.addFirst(null);
myLinkedList.addFirst(null);
System.out.println(myLinkedList.toString());
System.out.println("index of null is :" + myLinkedList.indexOf(null));
}
}
输出:
ArrayList:
[WuHoujian, null, null]
index of null is :1
LinkedList:
[null, null, test22, test11]
index of null is :0
2、对Set的选择
HashSet的性能基本上总是比TreeSet好,特别是在添加和查询元素的时候。那什么时候我们应该选择TreeSet呢?当我们需要一个排好序的Set时,就选择TreeSet,因为其内部结构支持排序。
LinkedHashSet和HashSet呢?由于LinkedHashSet是由链表实现的,插入删除元素操作需要更高的代价,所以我们也需要结合具体的场景进行选择(类似LinkedList和ArrayList)。
补充:Set的底层实现是基于Map实现的,HashSet底层是HashMap,TreeSet底层是TreeMap。从下面代码我们可以看出,HashSet是无序的,TreeSet会进行排序。
package com.tu.test;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetTest {
public static void main(String [] args){
System.out.println("HashSet:");
Set<Object> set1 = new HashSet<Object>();
set1.add("test111");
set1.add("test222");
set1.add("test333");
System.out.println(set1.toString());
System.out.println(set1.iterator().next());
System.out.println("TreeSet:");
TreeSet<Object> set2 = new TreeSet<Object>();
set2.add("a4");
set2.add("a2");
set2.add("a5");
System.out.println(set2.toString());
}
}
输出:
HashSet:
[test222, test111, test333]
test222
TreeSet:
[a2, a4, a5]
3、对Map的选择
排除IdentityHashMap,所有的Map实现的插入操作都会随着Map尺寸的变大而明显变慢。
Hashtable的性能和HashMap大体上相当,因为HashMap是用来代替Hashtable的。那么它们两者之间有什么区别呢?主要有三点:第一点就是Hashtable是基于旧的Dictionary实现的,而HashMap是Map接口的实现;第二点就是Hashtable是同步的,在多线程环境中使用,而HashMap不是同步的;第三点不同就是HashMap可以允许一个key为null,任意个value为null。
TreeMap通常比HashMap要慢。同TreeSet一样,TreeMap是一种创建有序列表的表达方式。
LinkedHashMap在插入时比HashMap慢一点,因为它除了维护散列数据结构之外,还需要维护链表结构。
补充:从下面的Demo以及输出结果可以看出,在Map中null元素永远被放在第一个元素;另外当键值相同时,表面上看到的是覆盖,底层实际上依旧保持着原有的数据。看了源代码会知道,Map底层是基于数组实现,数组类型是Entry类型,包括key,value,next和hash几个属性,当有重复的键值(准确地说是key的hash值),原有的值value会被放到Entry的next属性中,这样也解决了Map的冲突问题。
package com.tu.test;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class MapTest {
public static void main(String[] args) {
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("name", "WuHoujian");
map1.put(null, "I'm null");
Object str = map1.put("name", "William");
System.out.println("有两个相同的key,前一次的值为:" + str);
int i = 1;
for (Entry<String, Object> entry : map1.entrySet()) {
System.out.println("map中第" + i +"元素:" + entry.getKey() + "=" + entry.getValue());
i++;
}
}
}
输出:
有两个相同的key,前一次的值为:WuHoujian
map中第1元素:null=I'm null
map中第2元素:name=William
注:以上提到的各种容器类,大家如果感兴趣,可以多看看底层源代码的实现,深入了解一下各自的实现,对它们有一个更深刻的认识。
阅读源码之后的心得,大家后面可以分享一下
相关推荐
2023年的"Java 基础 第1阶段:基本语法——尚硅谷学习笔记(含面试题)"涵盖了从环境搭建到程序设计的基本要素,旨在帮助学习者系统地理解并应用Java语言。 一、Java环境搭建 在开始Java编程之前,你需要安装Java ...
Java基础回顾 (Lesson5) - **数据类型与运算符**:复习Java中的各种数据类型和常用运算符。 - **流程控制语句**:再次强调循环和条件判断语句的重要性。 ##### 6. 包、接口与封装 (Lesson6) - **包的使用**:...
在第十一天的笔记中,可能详细记录了这些基础知识的应用。 2. **类与对象**:Java是一种面向对象的语言,理解类的定义、对象的创建以及封装、继承和多态等OOP(面向对象编程)原则至关重要。 3. **数组与集合**:...
### Java Concurrency Framework 的介绍 #### 一、概述 ...对于初学者来说,理解这些基础知识是至关重要的第一步。随着对 Java 并发编程的深入学习,开发者将能够利用这些工具来构建复杂且高性能的应用程序。
首先,让我们探讨Java的基础知识。Java的语法结构与C++类似,但更注重安全性。在第三章中,通常会涉及以下几个关键概念: 1. **变量和数据类型**:Java有八种基本数据类型,包括整型(byte, short, int, long)、...
### 中文 Java编程思想...这些章节覆盖了Java编程的基础知识,从面向对象的基本概念出发,逐步深入到高级主题。通过学习本书,读者可以掌握Java编程的核心技术和最佳实践,为成为一名合格的Java程序员打下坚实的基础。
《Java程序设计(第2版)》是一本广泛应用于高等教育领域的教材,主要针对计算机科学与技术专业或相关专业学生,旨在教授Java编程语言的基础知识和高级特性。这本教材的内容通常涵盖以下几个核心知识点: 1. **Java...
5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,保证程序的健壮性。 6. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList...
复习题包括单项选择题,测试学习者对Java基础知识的理解和应用能力。 通过这个复习大纲,学习者可以全面回顾Java程序设计的主要内容,加强理论知识,提高编程实践能力。对于准备考试或面试的人员来说,这是一个宝贵...
- 第五阶段:测试与部署。 #### 编码规范 - **Package命名规范**:遵循“反向域名”原则,例如`com.example.project`。 - **Class命名规范**:采用驼峰命名法,首字母大写,例如`UserManager`。 - **Method命名...
在“JAVA 2 捷径教程 第二章 代码2”中,我们主要探讨的是Java编程语言的基础和进阶概念,尤其是与第二章相关的代码示例。本教程旨在帮助初学者快速掌握Java 2的核心知识,同时也适用于有一定经验的开发者进行回顾和...
### Java Threads 2rd #### 书名:Java Threads 2rd ...以上是《Java Threads 2rd》这本书的主要内容概述,涵盖了Java线程技术的各个方面,从基础知识到高级主题均有涉猎,旨在帮助读者全面掌握Java中的线程编程技术。
这些"java核心笔记"涵盖了基础知识,是学习Java编程的绝佳起点。笔记共分为17天的学习内容,这意味着它将逐步引导你深入理解Java的核心概念。 第1天:Java简介与环境配置 在第一天,你会了解到Java的历史、特点以及...
1. **Java基础知识**:实习报告提到,学习Java的初期主要是掌握基础概念和常识性知识,包括类、对象、继承、多态、接口等面向对象编程的核心概念。此外,还会接触到Java API,学习如何使用标准库中的类和方法,如...
- 定期回顾所学内容,巩固基础知识。 - 关注社区动态和技术趋势,保持好奇心和技术敏感度。 #### 六、Java环境搭建 - **JDK安装**: - 下载并安装JDK。可从官方网站(现为...
- **审查关系型数据库**:对关系型数据库的基础知识进行回顾。 - **注解参考**:EJB 3.0中使用的注解列表及其含义。 - **部署描述符参考**:部署描述符的格式和内容的详细说明。 通过以上内容,我们可以看到...
Java作为广泛应用于物联网设备开发的语言,其基础知识的学习对于物联网工程师来说至关重要。本课程涵盖了Java的多个核心章节,通过提供的课后答案,学生可以更好地理解和掌握每个章节的核心概念。 在Java的基础学习...
首先,我们需要回顾一下Java的基础知识,包括如何使用JBuilder来开发Java应用程序。JBuilder是一个集成开发环境(IDE),它简化了创建、编译、调试和运行Java程序的过程。在ACCP V4.0中,我们学习了创建工程,编写...
【Java基础程序集合】是一个资源...通过对上述Java基础知识的掌握,开发者能够编写出功能丰富的程序,并逐步进阶到更复杂的系统设计。这个"Basic-Java-Programs"集合中的实例将涵盖这些知识点,帮助你实践并巩固所学。