Java中对数据的存储会使用到集合类,下面我们来看看Java中常用的集合类。

Collection接口

集合的接口,可以简单的理解为可以动态扩充的数组。

Collection接口定义了很多相关的方法,基本上都是添加移除等管理元素相关的方法。

List接口

List接口是继承自Collection接口的子接口,其内部存放的元素对象是可以重复的。

下面我们来看两个比较常用的实现类:

ArrayList

JDK1.2推出,线程不安全类型,但执行效率高,在不涉及多线程的情况下使用:

 import java.util.ArrayList;
import java.util.List; public class Main
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}

Vector

JDK1.0推出,线程安全,但执行效率较ArrayList低,在涉及多线程时使用:

 import java.util.List;
import java.util.Vector; public class Main
{
public static void main(String[] args)
{
List<String> list = new Vector<String>();
list.add("A");
list.add("B");
list.add("C");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}

Set接口

Set接口是继承自Collection接口的子接口,其内部存放的元素对象是不可以重复的。

下面我们来看两个比较常用的实现类:

HashSet

散列存放数据,添加的数据是无序的;

 import java.util.HashSet;
import java.util.Set; public class Main
{
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("A");
set.add("A");
set.add("B");
set.add("B");
set.add("C");
set.add("D");
System.out.println(set);//[D, A, B, C]
}
}

TreeSet

有序存放数据,无论添加的数据顺序如何,最终可以获取的数据都是按顺序存放的:

 import java.util.Set;
import java.util.TreeSet; public class Main
{
public static void main(String[] args)
{
Set<String> set = new TreeSet<String>();
set.add("A");
set.add("A");
set.add("B");
set.add("B");
set.add("C");
set.add("D");
System.out.println(set);//[A, B, C, D]
}
}

Iterator接口

Java中的集合类都实现了Iterator接口,该接口实现了我们遍历集合中所有对象的方法,同时,迭代器也是23种设计模式中的一种,只不过Java中已经帮助我们实现了。

我们来看一个简单的例子:

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Main
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
//第一种循环方法
Iterator<String> i = list.iterator();
while(i.hasNext())
{
String str = i.next();
//删除元素 B
if(str.equals("B"))
{
i.remove();
}
System.out.println(str);
}
System.out.println("");
//第二种循环方法
for(Iterator<String> i2 = list.iterator(); i2.hasNext(); )
{
String str = i2.next();
System.out.println(str);
}
}
}

使用迭代器:先通过集合的方法iterator获取该集合的迭代器,让后调用hasNext判断是否还有下一个元素,如果有则调用next获取下一个元素并将迭代器的指针指向后面的元素,如果想移除当前的元素,不要调用集合的remove方法,调用迭代器的remove即可安全移除集合中的当前元素。

for each

在JDK1.5中,Java添加了for each循环用来方便的遍历集合的所有元素,本质上for each也是一个迭代器,但是for each不允许在循环中移除集合的元素,如下:

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Main
{
public static void main(String[] args)
{
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
//第一种循环方法
Iterator<String> i = list.iterator();
while(i.hasNext())
{
String str = i.next();
System.out.println(str);
}
System.out.println("");
//第二种循环方法
for (String str : list) {
System.out.println(str);
}
}
}

Map接口

Map使用键值对的方式来存储数据,我们主要来看看Map的两个实现类;

Hashtable

  • Hashtable中的方法是同步的即线程安全,执行效率较HashMap会低一些。
  • key和value都不允许出现null值。
  • Hashtable直接使用对象的hashCode。
  • Hashtable中hash数组默认大小是11,增加的方式是 old*2+1。
 import java.util.Hashtable;
import java.util.Map; public class Main
{
public static void main(String[] args)
{
Map<Integer, String> map = new Hashtable<Integer, String>();
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
if(map.containsKey(1))
{
System.out.println(map.get(1));
map.remove(1);
}
System.out.println(map.isEmpty());
}
}

HashMap

  • HashMap中的方法是异步的即线程不安全,执行效率较Hashtable快。
  • 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
  • 而HashMap重新计算hash值。
  • HashMap中hash数组的默认大小是16,而且一定是2的指数。
 import java.util.HashMap;
import java.util.Map; public class Main
{
public static void main(String[] args)
{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
if(map.containsKey(1))
{
System.out.println(map.get(1));
map.remove(1);
}
System.out.println(map.isEmpty());
}
}

遍历Map

直接上代码:

 import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; public class Main
{
public static void main(String[] args)
{
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "A");
map.put(2, "B");
map.put(3, "C");
//获取键和值
for(Map.Entry<Integer, String> entry : map.entrySet())
{
System.out.println(entry.getKey() + ": " + entry.getValue());
}
System.out.println("");
//只获取键
for(Integer key : map.keySet())
{
System.out.println(key);
}
System.out.println("");
//只获取值
for(String value : map.values())
{
System.out.println(value);
}
System.out.println("");
//使用迭代器
//在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。
Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext())
{
Map.Entry<Integer, String> entry = iterator.next();
System.out.println(entry.getKey() + ": " + entry.getValue());
}
System.out.println("");
//通过键获取值,效率最低不建议使用
for(Integer key : map.keySet())
{
String value = map.get(key);
System.out.println(key + ": " + value);
}
}
}

Java学习笔记(八):集合类的更多相关文章

  1. Java 学习笔记 (八) Java 变量

    head first java page85 实例变量是声明在类内而不是方法中 class Horse{ private double height=15.2; private String bree ...

  2. Java学习笔记八(反射)

    1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...

  3. Java学习笔记八:Java的流程控制语句之循环语句

    Java的流程控制语句之循环语句 一:Java循环语句之while: 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...

  4. Java学习笔记八

    IO流:就是input/output输入/输出流. 一.字节流操作文件的便捷类:FileWriter和FileReader import java.io.FileWriter; import java ...

  5. Java学习笔记(八)面向对象---抽象类

    当多个类中出现相同功能,但是功能主体不同时,我们可以向上抽取,只抽取功能定义,而不抽取功能主体. 抽象类的特点 抽象方法一定在抽象类中. 抽象方法和抽象类都必须被abstract关键字修饰. 抽象类不 ...

  6. 20145330第八周《Java学习笔记》

    20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...

  7. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  8. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  9. 20145230《java学习笔记》第九周学习总结

    20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...

  10. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. PHP适合做大型网站吗?

    1. 对递归的不良支持 递归是一种函数调用自身的机制.这是一种强大的特性可以把某些复杂的东西变得很简单.有一个使用递归的例子是快速排序(quicksort).不幸的是,PHP并不擅长递归.Zeev,一 ...

  2. iDSDT搞定显卡和声卡 黑苹果不纠结

    原帖:http://www.lovelucy.info/idsdt-mac-video-audio-drive.html 之前写过PC机上装Mac OS X系统,准备工作中最纠结的就是驱动了.在网络上 ...

  3. Android 实现emoji表情的demo

    Android 实现emoji表情的例子,网上看到的,记录一下. 请看下图 : 项目下载地址:http://download.csdn.net/detail/abc13939746593/741397 ...

  4. window.history

    作者:zccst 旧版: forword() backword() go(number) HTML5中新增了 onhashchange  浏览器兼容性较好,用得较多 pushState / repla ...

  5. POJ 2136 Vertical Histogram

    题意:按样例那样模拟…… 解法:模拟…… 代码: #include<stdio.h> #include<iostream> #include<algorithm> ...

  6. android 触摸事件、点击事件的区别

    针对屏幕上的一个View控件,Android如何区分应当触发onTouchEvent,还是onClick,亦或是onLongClick事件? 在Android中,一次用户操作可以被不同的View按次序 ...

  7. HDU 2222 (AC自动机模板题)

    题意: 给一个文本串和多个模式串,求文本串中一共出现多少次模式串 分析: ac自动机模板,关键是失配函数 #include <map> #include <set> #incl ...

  8. JavaScript UI技术选型

    ExtJS l ExtJS(TODO:找旧版本,类似现在EasyUI插件的旧版本)简介:纯JS支持:IE6授权:GPLv3授权.商业授权($329/人) l Ext.NET简介:ExtJS的NET封装 ...

  9. DOM笔记(三):Element接口和HTMLElement接口

    一.Element接口 Element接口表示一个元素,该接口扩展自Node接口,自然继承了Node接口的属性和方法,也有一套针对元素的属性和方法. Element接口常见的属性比较少,常用的就是一个 ...

  10. Python对象初探

    数据结构 PyObject_HEAD //对象公共头部   Py_ssize_t ob_refcnt; //对象引用数 PyTypeObject *ob_type; //对象类型 PyObject_V ...