Java学习笔记(八):集合类
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学习笔记(八):集合类的更多相关文章
- Java 学习笔记 (八) Java 变量
head first java page85 实例变量是声明在类内而不是方法中 class Horse{ private double height=15.2; private String bree ...
- Java学习笔记八(反射)
1.介绍 反射为Java程序在执行时提供了动态的能力.利用反射能够在执行时对程序进行动态的控制.本篇博客着重解说一下Java中的反射. 2.Class类的使用 在Java执行过程中,每一个类被载入后都 ...
- Java学习笔记八:Java的流程控制语句之循环语句
Java的流程控制语句之循环语句 一:Java循环语句之while: 生活中,有些时候为了完成任务,需要重复的进行某些动作.如参加 10000 米长跑,需要绕 400 米的赛道反复的跑 25 圈.在 ...
- Java学习笔记八
IO流:就是input/output输入/输出流. 一.字节流操作文件的便捷类:FileWriter和FileReader import java.io.FileWriter; import java ...
- Java学习笔记(八)面向对象---抽象类
当多个类中出现相同功能,但是功能主体不同时,我们可以向上抽取,只抽取功能定义,而不抽取功能主体. 抽象类的特点 抽象方法一定在抽象类中. 抽象方法和抽象类都必须被abstract关键字修饰. 抽象类不 ...
- 20145330第八周《Java学习笔记》
20145330第八周<Java学习笔记> 第十五章 通用API 通用API 日志:日志对信息安全意义重大,审计.取证.入侵检验等都会用到日志信息 日志API Logger:注意无法使用构 ...
- Java IO学习笔记八:Netty入门
作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- 20145230《java学习笔记》第九周学习总结
20145230 <Java程序设计>第9周学习总结 教材学习内容 JDBC JDBC简介 JDBC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商则对接口进行操作, ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- WebActivatorEx
using System; using NLog; using System.Web.Optimization; [assembly: WebActivatorEx.PreApplicationSta ...
- UVa 11722 (概率 数形结合) Joining with Friend
高中也做个这种类似的题目,概率空间是[t1, t2] × [s1, s2]的矩形,设x.y分别代表两辆列车到达的时间,则两人相遇的条件就是|x - y| <= w 从图形上看就是矩形夹在两条平行 ...
- 解析CSS加密技术之“障眼法”
CSS(Cascading Style Sheet,可译为“层叠样式表”或“级联样式表”)是一组格式设置规则,用于控制Web页面的外观.通过使用CSS样式设置页面的格式,可将页面的内容与表现形式分离. ...
- SharedPreferencesUtil
用于缓存一个临时的变量 比如 SharedPreferencesUtil.put(getApplicationContext(), "userImage", user.conten ...
- codeforces 333A - Secrets
题意:保证不能正好配齐n,要求输出可以用的最大硬币数. 注意如果用到某种硬币,那么这种硬币就有无穷多个.所以11=3+3+3+3,12=9+9,13=3+3+3+3+3 #include<cst ...
- Linux编译安装Darwin Streaming Server 6.0.3
买回来VPS后就一直想在上面搭建一个流媒体服务,在网上搜索了很多资料,大部分都是介绍Linux中安装Darwin Streaming Server 5.5.5版本,因为这个版本提供了针对linux的安 ...
- Linux如何统计进程的CPU利用率
1.0 概述 在Linux的/proc文件系统,可以看到自启动时候开始,所有CPU消耗的时间片:对于个进程,也可以看到进程消耗的时间片.这是一个累计值,可以"非阻塞"的输出.获得一 ...
- WPF如何在同一个区域依次叠加显示多张图片呢?
正如标题的问题,有时需要在已显示的图片的右上角(或其他区域)显示小图标,譬如下图的患者头像右上角显示病情图标:(这里不采用事先用PS编排成一个图片文件的方式,因为此方式普适性不好) 解决方案:绘制该复 ...
- kettle连接hadoop&hdfs图文详解
1 引言: 项目最近要引入大数据技术,使用其处理加工日上网话单数据,需要kettle把源系统的文本数据load到hadoop环境中 2 准备工作: 1 首先 要了解支持hadoop的Kettle版本情 ...
- javascript 面向对象制作坦克大战 (一)
PS:这个坦克大战是在网上下的一段源码之后,自己进行的重写. 写这个的目的是为了巩固自己这段时间对js的学习.整理到博客上,算是对自己近端时间学习js的一个整理. 同时也希望可以帮助到学习js的园 ...