《Java编程思想》笔记 第十一章 持有对象
1.保存对象引用
1.数组,数组具有固定大小
2.容器类,可自动调节大小
2.容器类
- List Set Queue Map 及常用的实现类
2.1 Collection (接口)
- 保存独立的元素序列,未使用泛型时保存Object对象。(独立并不是不同)
2.1.1 List(接口)
- 按插入顺序保存,可重复。
- ArrayList :先当于大小可变的数组,随机访问快,插入移除慢。
- LinkedList :插入移除快,访问慢。
2.1.2 Set(接口)
- 无序不能有重复元素
- 1.HashSet :最快获取元素,内部元素无规则排序。
- 1.1 LinkHashSet : 按插入顺序保存元素,也有HashSet的查询速度 .
- 2. TreeSet : 升序保存对象
2.1.3 Queue(接口)
- 容器的一端插入一端删除
- 1 PriorityQueue 优先队列
2.2 Map(接口)
- 保存键值对对象,键不能重复。键也是对象,值也是对象,按键查找。(也称映射表,关联数组,字典-->通过对象找对象)
- 2.1 HashMap : 查找获取速度快,内部无规则排序
- 2.1.1 LinkHashMap : 按插入顺序保存键,同时保存HashMap的查询速度
- 2.2 TreeMap : 键升序保存对象。
3.预定义泛型
3.1 未预定义泛型时向容器内存入的是Object对象,所以get()取出来的也是Object对象,需要具体类型对象还需强制转型
3.2 预定义泛型保存特点对象,可以防止将错误的类型放入容器中。 例如ArrayList<Apple>只保存Apple类型或者其子类型对象。
3.3 类型参数可以有多个但不可以是这样 ArrayList<Apple,Orange>。
3.4 向上转型对于泛型一样适用,可以把Apple的子类放入ArrayList中,用get(index)取出来还是原来的子类型。
3.添加一组元素
- Arrays类和Collections类中的一些方法可以向Collection中添加一组元素。
3.1 Arrays.asList()接受一个数组或者用逗号分割的元素列表(列表元素类型可不同),并将其转换成一个List对象返回。使用显式类型说明Arrays.<类型>asList()可以确定List保存的类型。注意:此List对象底层是数组,因此不可改变其大小,不能添加删除。
3.2 Collections.addAll(a,b) 接受一个Collection对象a,以及一个数组或者用逗号分割的列表b,将b中的元素添加到a中。
3.3 Collection.addAll(a) 只接受另一个Collection对象a,此方法运行速度快。
3.4 Collection的构造器可以接收一个Collection将自身初始化。
- 向Map中增加值 Map.put(key,value),取值Map.get(key)
4.容器打印
- 直接可打印,toString()方法已被覆写。
5.打印数组
- 打印数组必须使用Arrays.toString(arrays) 打印数组(数组也是对象,直接打印对象引用输出只是内存地址)
6.List中的一些方法
6.1 a.contains(reference)确定该引用指向的对象是否在列表中。
6.2 a.romove(reference/index)移除该引用指向/该索引的对象
6.3 a.indexOf(reference) 找出该引用指向对象的索引编号
6.4 a.subList(2,5) 从大列表a创建一个小列表从索引2开始,包括2,到5结束,不包括5。返回一个List
6.5 a.containsAll(b)确定b这个小列表是否在大列表中,与顺序无关。
6.6 a.retainAll(b ) a,b取交集,并给a
6.7 a.removeAll(b) 把a中所有在b中的元素移除。
6.8 set(index , A) 用A对象替换索引处的对象。
6.9 a.isEmpty() a是否为空
6.10 a.clean() 清空a
6.11 a.toArray() 将Collection转换为一个数组,无参数为Object数组,传入一个具体数组对象参数,则转换为该数组(类型不能错),如果传入的参数数组太小,将会自动创建合适大小的数组。
7.Iterator(接口) 迭代器
7.1 迭代器是个对象,它是用来遍历并选择序列中的对象
7.2 Iterator只能单向移动
7.3 用来产生迭代器对象的方法: iterator(),该方法属于Iterator接口。一个容器调用该方法就可返回一个迭代器对象,并且该对象准备好返回容器的第一个元素。可以把该迭代器对象看成一个游标,创建完成后指向容器序列的第一个元素之前。
Iterator<Apple> sl = al.iterator(); //sl就是迭代器,就相当于一个指针
7.4 sl.next()获取下一个元素,执行完next()后当前sl就指向这个位置不变
7.5 sl.remove()删除sl指向的元素,只有在next()执行之后指向一个存在元素才能使用,
7.6 sl.hasNext() 检查序列中是否还有元素,有返回true,无返回false。
8.ListIterator
- 一个功能更强大的Iterator子类型,只能用于List访问,而且可以双向移动。
8.1 previous() 获取前一个元素,hasPrevious()判断前一个元素存在不。
8.2 List调用listIterator()产生一个指向第一个元素之前的迭代器,如果时listIerator(n),则开始就指向第n个元素。
8.3 相比于iterator()产生的迭代器多了add()和set()方法,add()将在游标之前插入,set()将修改游标所指内容。
9.foreach与迭代器
9.1 foreach主要用于数组,也可用于所有Collection对象。这是因为Collection接口继承了Iterable接口。
9.2 Iterable接口包含一个产生Iterator对象的iterator()方法,只要实现Iterable接口,覆写iterator()就可用于foreach。大量类已经实现了Iterable接口并覆写了iterator()方法,如全部的Collection,但Map全不是。
执行foreach时会自动调用iterator()方法,该方法产生Iterator对象,该对象调用next() hasNext() remove()方法。
class Tr<T> implements Iterable {
public Iterator<T> iterator(){
return new Iterator<T>(){ @Override
public boolean hasNext() {
// TODO Auto-generated method stub
return false;
} @Override
public T next() {
// TODO Auto-generated method stub
return null;
} @Override
public void remove() {
// TODO Auto-generated method stub }
9.3 实现Collection必须要实现iterator(),因为Collection继承Iterable.
10.适配器
- 解决一个接口需要另一个接口的问题。比如想既能正向又能反向foreach一个List,如果重写iterator()那就失去了正向功能,解决办法就是添加一个方法,该方法能够产生一个Iterable对象,覆写该对象的iterator()方法使其具有反向功能。直接foreach该List对象则正向输出,foreach该对象添加的方法则反向输出。
11.LinkedList
- LinkedList 中的方法可以实现 栈 队列 或者双端队列的效果
12.Stack (类)栈
- 后进先出(LIFO)容器。
- jdk 提供的Stack类继承自Vector,Vector底层用数组实现的,push 、pop 性能大大降低,Stack最好使用链表实现。
boolean empty()
测试此堆栈是否为空。
E peek()
查看此堆栈顶部的对象,而不从堆栈中删除它。
E pop()
删除此堆栈顶部的对象,并将该对象作为此函数的值返回。
E push(E item)
将项目推送到此堆栈的顶部。
int search(Object o)
返回o的位置 - 可以使用LinkedList实现。
13. Set
- Set与Collection有着完全一样的接口,它没有其他额外的功能,不像List。在分类上可以把它俩分为平级,实际上Set就是ollection,只是行为不同。Set要保持元素独立,是基于对象值来确定归属
13.1 set1.contains/contiansAll(set2),用来确定set2是否归属与set1。
14.Map
14.1 map.containsKey(key),测试map是否包含该键,map.containsValue(value),测试map是否包含值。
14.2 Map可以返回它的键的Set,值的Collection,键值对的Set.
15.Queue (接口)
- 队列 先进先出(FIFO),并发编程中很重要。
15.1 offer() 将一个元素插入队尾或者返回false.
15.2 peek()和element()都在不移除的情况下返回队头。peek()在队列为空时返回null,element()则抛异常
15.3 poll()和remove()移除情况下返回队头。poll()在队列为空时返回null,remove()则抛异常
15.4 PriorityQueue
- 优先级队列。先进先出描述了最典型的队列规则 ,而优先级队列则声明下一个弹出最需要(优先级最高)的元素。
15.4.1 调用offer()方法时该对象会在队列中被排序,可以使用自己提供的Comparator来修改这一顺序。
15.4.2 在调用peek(),poll(),remove()方法时获取的元素总是优先级最高的。
16.队列规则
- 先进先出是典型的队列规则,队列规则是指给定一组队列中的元素情况下,确定下一个弹出的元素的规则。优先级队列就是一种非典型的队列。
知识点
1.最基本最可靠的容器: ArrayList, add()插入一个元素,get(index)按索引访问元素,size()返回容器内元素的数量。
2.所有 Collection 都可以使用 foreach
3.向Collection中添加多个new A()对象,这些对象不是同一个对象,Set中可存,索引也不同。
《Java编程思想》笔记 第十一章 持有对象的更多相关文章
- java编程思想笔记(1)
java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...
- Java编程思想 笔记
date: 2019-09-06 15:10:00 updated: 2019-09-24 08:30:00 Java编程思想 笔记 1. 四类访问权限修饰词 \ 类内部 本包 子类 其他包 publ ...
- #Java编程思想笔记(一)——static
Java编程思想笔记(一)--static 看<Java编程思想>已经有一段时间了,一直以来都把笔记做在印象笔记上,今天开始写博客来记录. 第一篇笔记来写static关键字. static ...
- 《Java编程思想》第一二章
前段时间一直通过网络教程学习Java基础,把面向对象部分学完之后本来打算继续深入学习,但是感觉自己操之过急了,基础根本不够扎实,所以入手了一本<Java编程思想>,希望先把基础打好,再深入 ...
- Java编程思想 4th 第2章 一切都是对象
Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情通过类对象协作来完成 ...
- 2.1(java编程思想笔记)位移操作
java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...
- java编程思想笔记(第一章)
Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...
- Java编程思想 4th 第1章 对象导论
所有编程语言都提供抽象机制. 面向对象编程似乎是一种很好的编程思想和方式,面向对象编程中的对象简洁描述是:对象具有状态.行为和标识.状态指的是数据存储,存储的数据能反应状态:行为指的是方法,方法表示对 ...
- Java编程思想笔记
打好java基础 后续会增加相应基础笔试题 目录如下 1 对象导论2 一切都是对象3 操作符4 控制执行流程5 初始化与清理6 访问控制权限7 复用类8 多态9 接口10 内部类11 持有对象12 通 ...
随机推荐
- 并查集——poj1308(并查集延伸)
题目链接:Is It A Tree? 题意:给你一系列形如u v的点对(u v代表一条由u指向v的有向边),请问由给你的点构成的图是不是一棵树? 树的特征:①每个节点(除了根结点)只有一个入度:②只有 ...
- SQL SERVER 查询语句学习:CHARINDEX
场景介绍 项目A需要一个批量删除的功能,之前我一直用SqlTransaction去处理,今天同事告诉我可以用CHARINDEX函数去解决问题,因此我今天就研究了一下. SQL语句 ---定义要删除的数 ...
- 权限管理UML设计草图
PS: 最近闲来无事,打算整一个权限管理模块.然而UML我只会看不会设计,现在的草图都是边学边做的,现在发出来,希望前辈们指点一二!先拜谢了! 搞开发也有2年多快三年了,我感觉自己基本上还是一个菜鸟 ...
- http请求的过程
http请求格式: http请求格式由四部分组成,分别是:请求行,请求头,空行,消息体,每个部分占一行. 请求行是消息体的第一行,由三部分组成,分别是:请求方法,请求资源的url,http的版本号. ...
- 51nod 1819 黑白树V2(树链剖分)
第一次写如此复杂的树链剖分, 感觉自己代码能力还是挺不错的,没有调试太久(2个小时) 最后代码量高达11K orz(大部分都是重复的线段树代码,以后可以考虑优化一下代码量) 题解: 首先就是要进行一次 ...
- MySQL in查询优化
https://blog.csdn.net/gua___gua/article/details/47401621 MySQL in查询优化<一> 原创 2015年08月10日 17:57: ...
- Angular 表单验证 基础篇
<div class="nav"> <h4>表单验证</h4> <form ng-app="myApp" name=& ...
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- [NOI2003] 文本编辑器 (splay)
复制炸格式了,就不贴题面了 [NOI2003] 文本编辑器 Solution 对于光标的移动,我们只要记录一下现在在哪里就可以了 Insert操作:手动维护中序遍历结果,即每次取中点像线段树一样一样递 ...
- POJ3259:Wormholes(spfa判负环)
Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 68097 Accepted: 25374 题目链接: ...