java 深入_Java深入 - 深入理解Java集合

集合

集合类存放于Java.util包中。

集合类型主要有3种:set(集)、list(列表包含Queue)和map(映射)。

Collection:Collection是集合的基本接口,List、Set、Queue的最基本的接口。

Iterator:迭代器,可以通过迭代器遍历集合中的数据

Map:是映射表的基础接口

List 有序集合

Java的List是非常常用的数据类型。List是有序的Collection。Java List一共三个实现类:分别是ArrayList、Vector和LinkedList。

ArrayList:ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

Vector:Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

LinkedList:LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

说明:

ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。

Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

一般使用ArrayList和LinkedList比较多

对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针

对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据

ArrayList

ArrayList是最常用的List实现类。ArrayList内部是通过数组实现的。所以只适合遍历或者随机查找。

常用的接口:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

list.add(int index,E element) 将数据新增到指定位置

list.add(E element) 将指定的元素添加到此列表的尾部。

list.addAll(Collection extendsE> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

list.addAll(int index,Collection extendsE> c) 从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。

list.clear() 移除此列表中的所有元素。

list.set(int index,E element) 用指定的元素替代此列表中指定位置上的元素。

list.get(int index) 返回此列表中指定位置上的元素。

list.size() 查看元素总个数

list.contains() 包含

例子:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test2 {

/**

* 入口函数

* @param args

*/

public static void main(String[] args) throws Exception {

/* 初始化一个数组 */

List list = new ArrayList();

/* 新增数据 */

for (int j = 0; j < 5; j++) {

list.add(j);

}

/* 总长度 */

System.out.println(list.size());

/* 删除一条数据 key=1 */

list.remove(1);

/* 遍历 */

for (int i = 0; i < list.size(); i++) {

System.out.println("for:" + list.get(i)); //获取值

}

/* 将一个集合合并 */

List list2 = new ArrayList();

list2.add(99);

list2.add(100);

list.addAll(list2);

/* 遍历2 */

Iterator it = list.iterator();

while (it.hasNext()) {

System.out.println("Iterator:" + it.next()); //获取值

}

/* 是否包含 */

if (list.contains(2)) {

System.out.println("包含");

}

/* 清空列表 */

list.clear(); //清除整个列表

}

}

LinkedList

是以链表的结构进行存储对象的,动态新增和删除是很快,但是遍历就很慢,并且不存在get()的操作,不能单个定位。说白了,ArrayList是顺序存储结构,LinkedList是链表存储结构。

常用接口:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public LinkedList() 生成空的链表

public LinkedList(Collection col): 复制构造函数

public boolean add(Object element) 添加元素

public boolean add(int index, Object element)

public boolean addFirst(Object element)

public boolean addLast(Object element)

list.addAll(Collection extendsE> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

list.removeFirst();

list.removeLast();

list.clear();

list.subList(2, 5).clear();

list.remove("2"); #删除特定元素

List myList = new ArrayList(list); #转ArrayList

lList.indexOf("2") 查找元素位置

lList.lastIndexOf("2");

lList.set(3, "Replaced");

lList.contains("4"); 确认是否存在

例子:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test2 {

/**

* 入口函数

* @param args

*/

public static void main(String[] args) throws Exception {

/* 生成一个LinkedList */

LinkedList list = new LinkedList();

list.add("a");

list.add("b");

list.add("c");

list.add("d");

/* list的size */

int size = list.size();

System.out.println(size);

/* 获取第一个和最后一个元素 */

String first = list.getFirst();

String last = list.getLast();

System.out.println("First:" + first + " Last:" + last);

/* 新增第一个和最后一个元素 */

list.addFirst("first");

list.addLast("last");

System.out.println("List内容 :" + list);

/* 移除最后一个和第一个 */

list.removeFirst();

list.removeLast();

System.out.println("List内容 :" + list);

/* 删除特定元素 */

list.remove("b");

System.out.println("List内容 :" + list);

/* 查找元素位置 */

int i = list.indexOf("c");

System.out.println("位置 :" + i);

/* 是否包含某个元素 */

if (list.contains("c")) {

System.out.println("包含");

}

/* 设置某个元素 */

list.set(1, "sadsad");

System.out.println("List内容 :" + list);

/* 转为ArrayList */

List aList = new ArrayList(list);

for (String s : aList) {

System.out.println("s = " + s);

}

/* 转为数组 */

String[] my = list.toArray(new String[list.size()]);

for (int j = 0; j < my.length; j++) {

System.out.println(my[j]);

}

/* 组装list */

LinkedList list2 = new LinkedList();

list.add("ddd");

list.add("111");

list.addAll(list2);

System.out.println("List内容 :" + list);

/* 遍历 */

Iterator lit = list.iterator();

while (lit.hasNext()) {

System.out.println(lit.next());

}

/* 清除 */

list.clear();

System.out.println("List内容 :" + list);

}

}

Set 集合

Set集合的几个特点:

Set集合不允许出现重复数据

允许包含值为null的元素,但最多只能有一个null元素。

TreeSet

TreeSet的几个特点:

TreeSet中不能有重复的元素;

TreeSet具有排序功能,缺省是按照自然排序进行排列

TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法

基于TreeMap实现

例子:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test {

public static void main(String[] agrs) {

/**

* TreeSet中不能有重复的元素;

* TreeSet具有排序功能;

* TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复 、以及确定元素的顺序 靠的都是这个方法

* 如果自定义类,则可以实现Comparable接口,并且实现compareTo,完成自定义去重

*/

TreeSet set = new TreeSet();

/* 新增数据 */

set.add("abc");

set.add("xyz");

set.add("bcd");

set.add("bac");

TreeSet set2 = new TreeSet();

set2.add("TTT");

set2.add("zzz");

set2.add("zzz");

/* 新增一个集合 */

set.addAll(set2);

Iterator it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

/* 获取第一个元素 */

String first = set.first();

System.out.println("first:" + first);

/* 获取最后一个元素 */

String last = set.last();

System.out.println("last:" + last);

/* 是否包含某个元素 */

if (set2.contains("TTT")) {

System.out.println("contains:true");

}

/* 判断是否为空 */

if (set.isEmpty()) {

System.out.println("空");

}

/* 元素个数 */

System.out.println("元素个数:" + set.size());

/* 清空集合 */

set.clear();

}

}

HashSet

HashSet的几个特点:

HashSet中不能有重复的元素;

HashSet是无序的

HashSet也是基于HashMap实现

例子:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test {

public static void main(String[] agrs) {

/**

* HashSet中不能有重复的元素;

* HashSet是无序的

* HashSet也是基于HashMap实现

*/

Set set = new HashSet();

/* 新增数据 */

set.add("abc");

set.add("xyz");

set.add("bcd");

set.add("bac");

Set set2 = new HashSet();

set2.add("TTT");

set2.add("zzz");

set2.add("zzz");

/* 新增一个集合 */

set.addAll(set2);

/* 判断是否为空 */

if (set.isEmpty()) {

System.out.println("空");

}

/* 元素个数 */

System.out.println("元素个数:" + set.size());

/* 移除元素 */

set.remove("zzz");

Iterator it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

/* 是否包含某个元素 */

if (set2.contains("TTT")) {

System.out.println("contains:true");

}

/* 清空集合 */

set.clear();

}

}

Map

Map集合主要有:HashMap,TreeMap

HashMap

HashMap特点:

HashMap是无序的散列映射表;

HashMap通过Hash 算法来决定存储位置

底层实现是哈希表

例子:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test {

public static void main(String[] agrs) {

/**

* HashMap是无序的散列映射表;

* HashMap通过Hash 算法来决定存储位置

*/

HashMap map = new HashMap();

/* 填充数据 */

map.put("username", "initphp");

map.put("age", "100");

/* 获取元素个数 */

System.out.println(map.size());

/* put all */

HashMap map2 = new HashMap();

map2.put("username2", "initphp2");

map2.put("age2", "1002");

map.putAll(map2);

/* 通过Key遍历HashMap */

Iterator it = map.keySet().iterator();

while (it.hasNext()) {

String key = (String) it.next();

System.out.println("key:" + key + " value:" + map.get(key));

}

/* 是否包含某个key */

if (map.containsKey("age")) {

System.out.println("是否包含某个key");

}

/* 判断是否为空 */

if (map.isEmpty()) {

System.out.println("空");

}

/* 删除某个元素 */

map.remove("age");

/* 清空Map表 */

map.clear();

}

}

TreeMap

TreeMap的特点:

适用于按自然顺序或自定义顺序遍历键(key)。

底层是二叉树

提供compareTo,可以定义排序方法

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test {

public static void main(String[] agrs) {

/**

* 1. 适用于按自然顺序或自定义顺序遍历键(key)。

* 2. 底层是二叉树

* 3. 提供compareTo,可以定义排序方法

*/

TreeMap map = new TreeMap();

/* 填充数据 */

map.put("username", "initphp");

map.put("age", "100");

/* 获取元素个数 */

System.out.println(map.size());

/* put all */

TreeMap map2 = new TreeMap();

map2.put("username2", "initphp2");

map2.put("age2", "1002");

map.putAll(map2);

/* 通过Key遍历HashMap,是有序的 */

Iterator it = map.keySet().iterator();

while (it.hasNext()) {

String key = (String) it.next();

System.out.println("key:" + key + " value:" + map.get(key));

}

/* 是否包含某个key */

if (map.containsKey("age")) {

System.out.println("是否包含某个key");

}

/* 判断是否为空 */

if (map.isEmpty()) {

System.out.println("空");

}

String first = map.firstKey();

String last = map.lastKey();

System.out.println("first:" + first);

System.out.println("last" + last);

/* 删除某个元素 */

map.remove("age");

/* 清空Map表 */

map.clear();

}

}

Queue

LinkedList就是一个Queue。

常用的Queue有:PriorityQueue、ConcurrentLinkedQueue、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue

PriorityQueue

例子:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片

public class Test {

public static void main(String[] agrs) {

/* 生成一个LinkedList */

PriorityQueue queue = new PriorityQueue();

queue.add("a");

queue.add("b");

queue.add("c");

queue.add("d");

/* queue的size */

int size = queue.size();

System.out.println(size);

/* 删除特定元素 */

queue.remove("b");

System.out.println("List内容 :" + queue);

/* 是否包含某个元素 */

if (queue.contains("c")) {

System.out.println("包含");

}

/* 组装list */

PriorityQueue queue2 = new PriorityQueue();

queue2.add("ddd");

queue2.add("111");

queue.addAll(queue2);

System.out.println("List内容 :" + queue);

/* 遍历 */

Iterator lit = queue.iterator();

while (lit.hasNext()) {

System.out.println(lit.next());

}

/* 从队列头部弹出一个元素 */

String string = queue.poll();

System.out.println("poll:" + string);

string = queue.poll();

System.out.println("poll:" + string);

/* 从尾部头部弹出一个元素 */

string = queue.peek();

System.out.println("peek:" + string);

System.out.println("List内容 :" + queue);

/* 清除 */

queue.clear();

System.out.println("List内容 :" + queue);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入java虚拟机第二版 第1章 Java体系结构介绍 1.1 为什么使用Java 1.2 网络带来的挑战和机遇 1.3 体系结构 1.3.1 Java虚拟机 1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系结构对平台无关的支持 2.2.1 Java平台 2.2.2 Java语言 2.3.3 Java class文件 . 2.2.4 可伸缩性 2.3 影响平台无关性的因素 2.3.1 Java平台的部署 2.3.2 Java平台的版本 2.3.3 本地方法 2.3.4 非标准运行时库 2.3.5 对虚拟机的依赖 2.3.6 对用户界面的依赖 2.3.7 Java平台实现中的bug 2.3.8 测试 2.4 平台无关的七个步骤 2.5 平台无关性的策略 2.6 平台无关性和网络移动对象 2.7 资源页 第3章 安全 3.1 为什么需要安全性 3.2 基本沙箱 3.3 类装载器体系结构 3.4 class文件检验器 3.4.1 第一趟:class文件的结构检查 3.4.2 第二趟:类型数据的语义检查 3.4.3 第三趟:字节码验证 3.4.4 第四趟:符号引用的验证 3.4.5 二进制兼容 3.5 Java虚拟机中内置的安全特性 3.6 安全管理器和Java API 3.7 代码签名和认证 3.8 一个代码签名示例 3.9 策略 3.10 保护域 3.11 访问控制器 3.11.1 implies()方法 3.11.2 栈检查示例 3.11.3 一个回答“是”的栈检查 3.11.4 一个回答“不”的栈检查 3.11.5 doPrivileged()方法 3.11.6 doPrivileged()的一个无效使用 3.12 Java安全模型的不足和今后的发展 方向 3.13 和体系结构无关的安全性 3.14 资源页 第4章 网络移动性 4.1 为什么需要网络移动性 4.2 一种新的软件模式 4.3 Java体系结构对网络移动性的支持 4.4 applet:网络移动性代码的示例 4.5 Jini服务对象:网络移动对象的示例 4.5.1 Jini是什么 4.5.2 Jini如何工作 4.5.3 服务对象的优点 4.6 网络移动性:Java设计的中心 4.7 资源页 第5章 Java虚拟机 5.1 Java虚拟机是什么 5.2 Java虚拟机的生命周期 5.3 Java虚拟机的体系结构 5.3.1 数据类型 5.3.2 字长的考量 5.3.3 类装载器子系统 5.3.4 方法区 5.3.5 堆 5.3.6 程序计数器 5.3.7 Java栈 5.3.8 栈帧 5.3.9 本地方法栈 5.3.10 执行引擎 5.3.11 本地方法接口 5.4 真实机器 5.5 一个模拟:“Eternal Math” 5.6 随书光盘 5.7 资源页 第6章 Java class文件 6.1 Java class文件是什么 6.2 class文件的内容 6.3 特殊字符串 6.3.1 全限定名 6.3.2 简单名称 6.3.3 描述符 6.4 常量池 6.4.1 CONSTANT_Utf8_info表 6.4.2 CONSTANT_Integer_info表 6.4.3 CONSTANT_Float_info表 6.4.4 CONSTANT_Long_info表 6.4.5 CONSTANT_Double_info表 6.4.6 CONSTANT_Class_info表 6.4.7 CONSTANT_String_info表 6.4.8 CONSTANT_Fieldref_info表 6.4.9 CONSTANT_Methodref_info表 6.4.10 CONSTANT_InterfaceMethodref_ info表 6.4.11 CONSTANT_NameAndType_info 表 6.5 字段 6.6 方法 6.7 属性 6.7.1 属性格式 6.7.2 Code属性 6.7.3 ConstantValue属性 6.7.4 Deprecated属性 6.7.5 Exceptions属性 6.7.6 InnerClasses属性 6.7.7 LineNumberTable属性 6.7.8 LocalVariableTable属性 6.7.9 SourceFile属性 6.7.10 Synthetic属性 6.8 一个模拟:“Getting Loaded” 6.9 随书光盘 6.10 资源页 第7章 类型的生命周期 7.1 类型装载、连接与初始化 7.1.1 装载 7.1.2 验证 7.1.3 准备 7.1.4 解析 7.1.5 初始化 7.2 对象的生命周期 7.2.1 类实例化 7.2.2 垃圾收集和对象的终结 7.3 卸载类型 7.4 随书光盘 7.5 资源页 第8章 连接模型 8.1 动态连接和解析 8.1.1 解析和动态扩展 8.1.2 类装载器与双亲委派模型 8.1.3 常量池解析 8.1.4 解析CONSTANT_Class_info入口 8.1.5 解析CONSTANT_Fieldref_info 入口 S.1.6 解析CONSTANT_Methodref_info 入口 8.1.7 解析CONSTANT_Interface- Methodref_info入口 8.1.8 解析CONSTANT_String_info入口 8.1.9 解析其他类型的入口 8.1.10 装载约束 8.1.11 编译时常量解析 8.1.12 直接引用 8.1.13 _quick指令 8.1.14 示例:Salutation程序的连接 8.1.15 示例:Greet程序的动态扩展 8.1.16 使用1.1版本的用户自定义类装 载器 8.1.17 使用1.2版本的用户自定义类装 载器 8.1.18 示例:使用forName()的动态扩展 8.1.19 示例:卸载无法触及的greeter类 8.1.20 示例:类型安全性与装载约束 8.2 随书光盘 8.3 资源页 第9章 垃圾收集 9.1 为什么要使用垃圾收集 9.2 垃圾收集算法 9.3 引用计数收集器 9.4 跟踪收集器 9.5 压缩收集器 9.6 拷贝收集器 9.7 按代收集的收集器 9.8 自适应收集器 9.9 火车算法 9.9.1 车厢、火车和火车站 9.9.2 车厢收集 9.9.3 记忆集合和流行对象 9.10 终结 9.11 对象可触及性的生命周期 9.11.1 引用对象 9.11.2 可触及性状态的变化 9.11.3 缓存、规范映射和临终清理 9.12 一个模拟:“Heap of Fish” 9.12.1 分配鱼 9.12.2 设置引用 9.12.3 垃圾收集 9.12.4 压缩堆 9.13 随书光盘 9.14 资源页 第10章 栈和局部变量操作 10.1 常量入栈操作 10.2 通用栈操作 10.3 把局部变量压入栈 10.4 弹出栈顶部元素,将其赋给局部变量 10.5 wide指令 10.6 一个模拟:“Fibonacci Forever” 10.7 随书光盘 10.8 资源页 第11章 类型转换 11.1 转换操作码 11.2 一个模拟:“Conversion Diversion” 11.3 随书光盘 11.4 资源页 第12章 整数运算 12.1 二进制补码运算 12.2 Inner Int:揭示Java int类型内部性质 的applet 12.3 运算操作码 12.4 一个模拟:“Prime Time” 12.5 随书光盘 12.6 资源页 第13章 逻辑运算 13.1 逻辑操作码 13.2 一个模拟:“Logical Results” 13.3 随书光盘 13.4 资源页 第14章 浮点运算 14.1 浮点数 14.2 Inner Float:揭示Java float类型内部 性质的applet 14.3 浮点模式 14.3.1 浮点值集合 14.3.2 浮点值集的转换 14.3.3 相关规则的本质 14.4 浮点操作码 14.5 一个模拟:“Circle of Squares” 14.6 随书光盘 14.7 资源页 第15章 对象和数组 15.1 关于对象和数组的回顾 15.2 针对对象的操作码 15.3 针对数组的操作码 15.4 一个模拟:“Three—Dimensional Array” 15.5 随书光盘 15.6 资源页 第16章 控制流 16.1 条件分支 16.2 五条件分支 16.3 使用表的条件分支 16.4 一个模拟:“Saying Tomato” 16.5 随书光盘 16.6 资源页 第17章 异常 17.1 异常的抛出与捕获 17.2 异常表 17.3 一个模拟:“Play Ball!” 17.4 随书光盘 17.5 资源页 第18章 finally子句 18.1 微型子例程 18.2 不对称的调用和返回 18.3 一个模拟:“Hop Around” 18.4 随书光盘 18.5 资源页 第19章 方法的调用与返回 19.1 方法调用 19.1.1 Java方法的调用 19.1.2 本地方法的调用 19.2 方法调用的其他形式 19.3 指令invokespecial 19.3.1 指令invokespecial和[init]()方法 19.3.2 指令invokespecial和私有方法 19.3.3 指令invokespecial和super关键字 19.4 指令invokeinterface 19.5 指令的调用和速度 19.6 方法调用的实例 19.7 从方法中返回 19.8 随书光盘 19.9 资源页 第20章 线程同步 20.1 监视器 20.2 对象锁 20.3 指令集中对同步的支持 20.3.1 同步语句 20.3.2 同步方法 20.4 Object类中的协调支持 20.5 随书光盘 20.6 资源页 附录A 按操作码助记符排列的指令集 附录B 按功能排列的操作码助记符 附录C 按操作码字节值排列的操作码助
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值