Thinking-in-Java 读书笔记-11-持有对象
原文地址
如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序。
通常,程序总是根据运行时才知道的某些条件去创建新对象,在此之前,不会知道所需对象的数量,甚至不知道确切的类型。为解决这个普遍的编程问题,需要在任意时刻和任意位置创建任意数量的对象。所以,就不能依靠创建命名的引用来持有每一个对象。
泛型和类型安全容器
在使用Java SE5
之前的容器是允许你向容器中插入不正确的类型,为了避免这种错误,在之后对类型进行严格的编译判断。只有相同的类型或者直属导出类才能创建容器。通过使用泛型,就可以在编译器防止将错误类型的对象放置在容器中。
基本概念
Java
容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:
- Collection。一个独立对象的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而 Set 不能有重复元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
- Map。一组成对的“键值对”对象,允许你使用键来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表允许我们使用另一对象来查找某个对象,它也被称为“关联数组”,因为他将某些对象与另外一些对象关联在一起了。Map 是强大的编程工具。
容器的打印
通过代码来看一下效果:
class PrintContainers {static Collection fill(Collection<String> collection) {collection.add("rat");collection.add("cat");collection.add("dog");collection.add("dog");return collection;}static Map fill(Map<String, String> map) {map.put("rat", "Fuzzy");map.put("cat", "Rags");map.put("dog", "Bosco");map.put("dog", "Spot");return map;}public static void main(String[] args) {System.out.println(fill(new ArrayList<String>()));System.out.println(fill(new LinkedList<String>()));System.out.println(fill(new HashSet<String>()));System.out.println(fill(new TreeSet<String>()));System.out.println(fill(new LinkedHashSet<String>()));System.out.println(fill(new HashMap<String, String>()));System.out.println(fill(new TreeMap<String, String>()));System.out.println(fill(new LinkedHashMap<String, String>()));}
}
输出结果:
[rat, cat, dog, dog]
[rat, cat, dog, dog]
[rat, cat, dog]
[cat, dog, rat]
[rat, cat, dog]
{rat=Fuzzy, cat=Rags, dog=Spot}
{cat=Rags, dog=Spot, rat=Fuzzy}
{rat=Fuzzy, cat=Rags, dog=Spot}
List
有两种 List类型的容器:
- ArrayList。它擅长于随机访问元素,但是在 List 中间插入数据和移除元素时比较慢。
- LinkedList。它通过代价低的在 List 中间进行插入和删除操作,提供了优化的顺序访问。 LinkedList在随机访问方面相对比较慢,但是它的特性集较 ArrayList 更大。
迭代器
迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序不必知道或关心该序列底层的结构。此外迭代器通常被称为 轻量级对象:创建它的代价小。
Java
的 Iterator 只能单向移动,这个 Iterator 只能用来:
- 使用方法
iterator()
要求容器返回一个Iterator
。 - 使用
next()
获得序列中的下一个元素。 - 使用
hasNext()
检查序列中是否还有元素。 - 使用
remove()
将迭代器新近返回的元素删除。
class IteratorTest {public static void main(String[] args) {List<Integer> data = new ArrayList<Integer>();data.add(1);data.add(2);data.add(3);data.add(4);data.add(5);ListIterator<Integer> integerListIterator = data.listIterator(2);while (integerListIterator.hasNext()) {Integer next = integerListIterator.next();System.out.println("next:" + next);}while (integerListIterator.hasPrevious()) {Integer previous = integerListIterator.previous();System.out.println("previous:" + previous);}}private static void iterator() {List<Integer> data = new ArrayList<Integer>();data.add(1);data.add(2);data.add(3);data.add(4);Iterator<Integer> iterator = data.iterator();while (iterator.hasNext()) {Integer next = iterator.next();System.out.println("data: " + next);}iterator = data.iterator();for (int i = 0; i < 4; i++) {iterator.next();iterator.remove();}System.out.println(data);}
}
Set
Set
不保存重复的元素(至于如何判断元素相同则较为复杂)。如果你视图将相同对象的多个实例添加到 Set
中,那么它就会阻止这种重复现象。
class SetTest {public static void main(String[] args) {Set<Integer> data = new HashSet<Integer>();data.add(1);data.add(2);data.add(3);data.remove(4);System.out.println(data.remove(1));System.out.println(data);}
}
Map
将对象映射到其他对象的能力是一种解决编程问题的杀手锏。
class MapTest {public static void main(String[] args) {Map<Integer, String> data = new HashMap<Integer, String>();data.put(2, "2");data.put(1, "1");data.put(3, "3");System.out.println(data);}
}
总结
Java
提供了大量持有对象的方式:
- 数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对结果做类型转换。它可以是多维的,可以保存基本类型的数据。但是,数组一旦生成,其容量就不能改变。
Collection
保存单一的元素,而Map
保存相关联的键值对。有了Java
的泛型,你就可以指定容器中存放的对象类型,因此你就不会讲错误类型的对象放置到容器中,并且在从容器中获取元素时,不必进行类型转换。- 像数组一样,
List
也建立数字索引与对象的关联,因此,数组和List
都是排好序的容器。List
能够自动扩充容量。 - 如果进行大量的随机访问,就是用
ArrayList
;如果经常从表中插入或删除元素,则应该使用LinkedList
。 - 各种
Queue
以及栈的行为,由LinkedList
提供支持。 Map
是一种将对象与对象相关联的设计。HashMap
设计用来快速访问,而TreeMap
保持 键 始终处于排序状态,所以没有HashMap
快。LinkedHashMap
保持元素插入的顺序,但是也通过散列提供了快速访问能力。Set
不接受重复元素。HashSet
提供最快的查询速度,而TreeSet
保持元素处于排序状态。LinkedHashSet
以插入顺序保存元素。- 新程序中不应该使用过时的
Vector
、Hashtable
和Stack
。
Thinking-in-Java 读书笔记-11-持有对象相关推荐
- think in java 读书笔记 2 —— 套接字
目录 think in java 读书笔记 1 --移位 think in java 读书笔记 2 -- 套接字 think in java 读书笔记 3 -- 数据报 概要 1. 套接字基本知识 2 ...
- head first java读书笔记
head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...
- Java读书笔记(4)-多线程(二)
Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...
- 《Head First设计模式》 读书笔记03 装饰对象
<Head First设计模式>读书笔记03 装饰对象 问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱. 饮料中需要加入各种调料,考虑在基类中加入一些 ...
- Java读书笔记(8)-单例模式
Java读书笔记(8)-单例模式 今天在阅读<Effective Java 2>第3条时,获知一种使用枚举enum实现单例模式的新方法,然而书上并没有就此展开深入说明,于是上网查阅了一些资 ...
- 《Essential C++》读书笔记 之 基于对象编程风格
<Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructor ...
- Effective Java读书笔记(二)
Effective Java 读书笔记 (二) 创建和销毁对象 遇到多个构造器参数时要考虑使用构建器 创建和销毁对象 何时以及如何创建对象? 何时以及如何避免创建对象? 如何确保它们能够适时地销毁? ...
- Effective Java 读书笔记(七):通用程序设计
Effective Java 读书笔记七通用程序设计 将局部变量的作用域最小化 for-each 循环优于传统的 for 循环 了解和使用类库 如果需要精确的答案请避免使用 float 和 doubl ...
- #java读书笔记#面向对象2
上一篇java读书系列笔记文章:#java读书笔记#面向对象1 14.Math类的使用(重点) (1)数学操作类:该类没有构造函数,方法均为静态的 (2)掌握内容 A:成员变量 **E:比任何其他值都 ...
最新文章
- 一位老哥写文怒刚 Redis 作者
- 如何快速掌握一门新技术/语言/框架…
- 2016021701 - 百位名人读书心法01
- Service Mesh 落地挑战
- 6-2 第六天 规划项目功能分布
- slf4j使用(二)
- Pandas之DataFrame的简单使用
- oracle人才盘点演示,Oracle 11g Golden Gate DDL单向同步实例演示
- java day13【Collection、泛型】
- 付费圈子来了,去还是不去?
- JDK安装与环境变量配置
- QT软件开发-基于FFMPEG设计视频播放器-流媒体播放器(五)
- oracle的多个exclude,记录一下expdp exclude的用法
- 国内主流新一代用户行为分析系统选型过程分享
- 运行jar包时报错:[mybatis-config.xml] cannot be opened because it does not exist
- webrtc thread introduce
- 【ST表】Zoning Houses
- XSSF实现Excel下拉和HSSF实现Excel下拉
- linux中查看隐藏文件夹_如何在Linux中隐藏图像中的文件或文件夹
- 漏洞深度分析|Thinkphp 多语言 RCE
热门文章
- 51单片机之IO口扩展——74HC165芯片并行转串行实验
- 过来人对研究生阶段的学习建议
- 九宫锁屏图案有多少种c语言编程,手机九宫格图案解锁问题,编程高手戳进来!...
- ubuntu 16.04 更改 ipv6、numa、thp、io scheduler
- 冲量在线创始人刘尧:以信创软硬件结合场景为突破口“占山为王”
- python语言描述兰伯特pdf_数据结构PYTHON语言描述 [美] Kenneth A. Lambert 兰伯特
- Java使用百度地图API,根据地址,查询地址坐标。
- mac办公软件里值得推荐给大家的好软件
- 服务器存储系统交付清单,附件三 软硬件交付清单(1).docx
- 区分浏览器,判断浏览器版本