`
wuhoujian322
  • 浏览: 65268 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java基础知识回顾第五篇 - 各种容器类的选择

阅读更多

    在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

 

 

注:以上提到的各种容器类,大家如果感兴趣,可以多看看底层源代码的实现,深入了解一下各自的实现,对它们有一个更深刻的认识。

阅读源码之后的心得,大家后面可以分享一下大笑

 

0
1
分享到:
评论

相关推荐

    Java 基础 第1阶段:基本语法-尚硅谷学习笔记(含面试题) 2023年

    2023年的"Java 基础 第1阶段:基本语法——尚硅谷学习笔记(含面试题)"涵盖了从环境搭建到程序设计的基本要素,旨在帮助学习者系统地理解并应用Java语言。 一、Java环境搭建 在开始Java编程之前,你需要安装Java ...

    Java Programming 24-Hour Trainer

    Java基础回顾 (Lesson5) - **数据类型与运算符**:复习Java中的各种数据类型和常用运算符。 - **流程控制语句**:再次强调循环和条件判断语句的重要性。 ##### 6. 包、接口与封装 (Lesson6) - **包的使用**:...

    java视频教程_黑马Java零基础辅导班[第二期]11天课件源码

    在第十一天的笔记中,可能详细记录了这些基础知识的应用。 2. **类与对象**:Java是一种面向对象的语言,理解类的定义、对象的创建以及封装、继承和多态等OOP(面向对象编程)原则至关重要。 3. **数组与集合**:...

    Java Concurrency Framework 的介绍

    ### Java Concurrency Framework 的介绍 #### 一、概述 ...对于初学者来说,理解这些基础知识是至关重要的第一步。随着对 Java 并发编程的深入学习,开发者将能够利用这些工具来构建复杂且高性能的应用程序。

    Java语言程序设计(第二版)课后第三章习题答案

    首先,让我们探讨Java的基础知识。Java的语法结构与C++类似,但更注重安全性。在第三章中,通常会涉及以下几个关键概念: 1. **变量和数据类型**:Java有八种基本数据类型,包括整型(byte, short, int, long)、...

    中文 Java编程思想(完整的中文简体第二版)

    ### 中文 Java编程思想...这些章节覆盖了Java编程的基础知识,从面向对象的基本概念出发,逐步深入到高级主题。通过学习本书,读者可以掌握Java编程的核心技术和最佳实践,为成为一名合格的Java程序员打下坚实的基础。

    高教类课件:Java程序设计(第2版)

    《Java程序设计(第2版)》是一本广泛应用于高等教育领域的教材,主要针对计算机科学与技术专业或相关专业学生,旨在教授Java编程语言的基础知识和高级特性。这本教材的内容通常涵盖以下几个核心知识点: 1. **Java...

    Java简明教程(第2版)课件

    5. **异常处理**:Java提供了异常处理机制,通过try-catch-finally语句块来捕获和处理运行时错误,保证程序的健壮性。 6. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList...

    Java程序设计复习大纲+复习题及答案.doc

    复习题包括单项选择题,测试学习者对Java基础知识的理解和应用能力。 通过这个复习大纲,学习者可以全面回顾Java程序设计的主要内容,加强理论知识,提高编程实践能力。对于准备考试或面试的人员来说,这是一个宝贵...

    java学习网站

    - 第五阶段:测试与部署。 #### 编码规范 - **Package命名规范**:遵循“反向域名”原则,例如`com.example.project`。 - **Class命名规范**:采用驼峰命名法,首字母大写,例如`UserManager`。 - **Method命名...

    JAVA 2 捷径教程 第二章 代码2

    在“JAVA 2 捷径教程 第二章 代码2”中,我们主要探讨的是Java编程语言的基础和进阶概念,尤其是与第二章相关的代码示例。本教程旨在帮助初学者快速掌握Java 2的核心知识,同时也适用于有一定经验的开发者进行回顾和...

    Java Threads 2rd

    ### Java Threads 2rd #### 书名:Java Threads 2rd ...以上是《Java Threads 2rd》这本书的主要内容概述,涵盖了Java线程技术的各个方面,从基础知识到高级主题均有涉猎,旨在帮助读者全面掌握Java中的线程编程技术。

    java核心笔记 这是很基础的笔记 我自己整理的

    这些"java核心笔记"涵盖了基础知识,是学习Java编程的绝佳起点。笔记共分为17天的学习内容,这意味着它将逐步引导你深入理解Java的核心概念。 第1天:Java简介与环境配置 在第一天,你会了解到Java的历史、特点以及...

    Java实习报告范文精选4篇.doc

    1. **Java基础知识**:实习报告提到,学习Java的初期主要是掌握基础概念和常识性知识,包括类、对象、继承、多态、接口等面向对象编程的核心概念。此外,还会接触到Java API,学习如何使用标准库中的类和方法,如...

    初学Java要注意什么.doc

    - 定期回顾所学内容,巩固基础知识。 - 关注社区动态和技术趋势,保持好奇心和技术敏感度。 #### 六、Java环境搭建 - **JDK安装**: - 下载并安装JDK。可从官方网站(现为...

    Manning.EJB.3.0.in.Action

    - **审查关系型数据库**:对关系型数据库的基础知识进行回顾。 - **注解参考**:EJB 3.0中使用的注解列表及其含义。 - **部署描述符参考**:部署描述符的格式和内容的详细说明。 通过以上内容,我们可以看到...

    昆明理工大学物联网工程专业java课程(课后答案)

    Java作为广泛应用于物联网设备开发的语言,其基础知识的学习对于物联网工程师来说至关重要。本课程涵盖了Java的多个核心章节,通过提供的课后答案,学生可以更好地理解和掌握每个章节的核心概念。 在Java的基础学习...

    北大青鸟培训java课件 连载第10章之13

    首先,我们需要回顾一下Java的基础知识,包括如何使用JBuilder来开发Java应用程序。JBuilder是一个集成开发环境(IDE),它简化了创建、编译、调试和运行Java程序的过程。在ACCP V4.0中,我们学习了创建工程,编写...

    Basic-Java-Programs:这是基本的Java程序的集合,以显示Java的基本技能和知识

    【Java基础程序集合】是一个资源...通过对上述Java基础知识的掌握,开发者能够编写出功能丰富的程序,并逐步进阶到更复杂的系统设计。这个"Basic-Java-Programs"集合中的实例将涵盖这些知识点,帮助你实践并巩固所学。

Global site tag (gtag.js) - Google Analytics