《Java编程思想》笔记 第十一章 持有对象

1.保存对象引用

1.数组,数组具有固定大小

2.容器类,可自动调节大小

2.容器类

  • List  Set  Queue  Map 及常用的实现类

2.1 Collectioon (接口)

  1. 保存独立的元素序列,未使用泛型时保存Object对象。(独立并不是不同)

2.1.1 List(接口)

  • 按插入顺序保存
  1. ArrayList :先当于大小可变的数组,随机访问快,插入移除慢。
  2. 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(),该方法属于Iterater接口。一个容器调用该方法就可返回一个迭代器对象,并且该对象准备好返回容器的第一个元素。可以把该迭代器对象看成一个游标,创建完成后指向容器序列的第一个元素之前。

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)容器。
  • Java 提供的Stack类继承自vector,vector底层用数组实现的,push 、pop 性能大大降低,Stack最好使用链表实现。
  • 可以使用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中可存,索引也不同。

原文地址:https://www.cnblogs.com/mibloom/p/9040399.html

时间: 2024-07-29 02:47:12

《Java编程思想》笔记 第十一章 持有对象的相关文章

《JAVA编程思想》学习笔记——第十一章 持有对象

JAVA容器类类库的用途是 "保存对象",并将其划分为两个不同的概念: 1) Collection.一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,而Set不能用重复元素.Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同) 2)Map.一组成对的 "键值对" 对象,允许你使用键来查找值.ArrayList允许你使用数字 Arrays.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数

Java编程思想笔记(一切都是对象)

1.用引用(遥控器)操控对象(电视机):String s = "asdf";     2.必须由你创建所有对象:String s = new String("asdf");     2(1).存储到什么地方:寄存器(快,不能直接控制).堆栈(1.堆栈指针若向下移动,则分配新的内存:若向上移动,则释放那些内存.2.Java数据存储于堆栈中——特别是对象引用,Java对象并不存储于其中.3.Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针).堆

Java编程思想笔记(第二章)

第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(reference)操作对象 类似遥控器(引用)来操作电视(对象) 在Java中你可以创建一个引用,但是没有与任何对象关联,比如: String s; 这个时候如果用则会报错.安全的做法是: 创建一个引用的同时并进行初始化 String s="1111"; 必须由你创建所有对象 New关键字的意思是给我一

java编程思想笔记(第一章)

Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5.某一特定类型的所有对象都可以接收同样的消息. Booch提出一种更简洁的描述: 对象拥有状态(state) 行为(behavior) 和标识(identity) 每个对象都有一个接口 每个对象都属于定义了特性和行为的某个类(特性可以理解为属性的状态,行为可以理解为method) 在面向对象的程序设

Java编程思想(第十一章持有对象)

1. 第11章 持有对象 java通过使用容器类来储存对象,与普通数组不同的是,普通数组的长度不可变. 1.1. 泛型与类型安全的容器 使用预定义的泛型,它指定了这个容器实例可以保存的类型,通过使用泛型,就可以在编译器防止将错误类型的对象放置到容器中. public class gerbil { private int gerbilNumber; public gerbil(int gerbilNumber){ this.gerbilNumber = gerbilNumber; } public

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

《Java编程思想》第一二章

前段时间一直通过网络教程学习Java基础,把面向对象部分学完之后本来打算继续深入学习,但是感觉自己操之过急了,基础根本不够扎实,所以入手了一本<Java编程思想>,希望先把基础打好,再深入学习. 不得不说这本书真的不是浪得虚名,对于我这样的新手看完一二章之后也觉得这本书值得买了.跟网上教程不同,这本书一开始便直接全面深入论述Java面向对象编程中对对象的理解,值得注意的是如果之前没有Java编程的基础,第一章看起来会比较吃力,而且效果也不太好,因为都是理论没有使用代码进行演示说明,所以作者也支

Java编程思想 4th 第2章 一切都是对象

Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情在类对象中完成. 在Java中,使用引用来操纵对象,在Java编程思想的第四版中,使用的术语是"引用(reference)",之前有读过Java编程思想第三版,在第三版中,使用的术语是"句柄(handle)",事实上,我觉得第三版的术语"句柄"更加形象传神,就像你用一个

Java编程思想笔记(持有对象)

1.泛型和类型安全的容器       2.基本概念       3.添加一组元素:Arrays.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数),并将其转换为一个LIst对象.Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分割的列表,将元素添加到Collection中.Collection.addAll()成员方法只能接受另一个Collection对象作为参数,因此它不如Arrays.asList()或Coll