Java笔记整理:持有对象
作者:网络转载 发布时间:[ 2016/9/8 10:18:32 ] 推荐标签:测试开发技术 Java
如果一个程序只包含固定数量的且生命周期都是已知的对象,那么这是一个非常简单的程序
JAVA实用类库提供了一套容器类,其中基本的类型是List,Set,Queue和Map。也称为集合类?
可以将任意数量的对象放置到容器中?
JAVA中的容器都是类,也是说JAVA没有直接的关键字支持
泛型
泛型指定了容器中元素的类型,访问元素时返回的是泛型类型的引用,可能需要自己转型?
可以为容器指定多个泛型?
使用泛型,可以在编译期防止错误类型的放置
打印对象时可能产生的无符号十六进制数,是由hashCode方法产生的
基本概念
容器类可以分为两个概念
Collection:独立元素的序列,元素的排序服从一条或多条规则。其中包含:
List:必须按照插入的顺序保存元素 Set:不能有重复元素 Queue:按照排队规则来确定对象产生的顺序(通常与被插入顺序相同)
所有的Collection对象能使用foreach语法遍历
Map:一组成对的“键值对”对象,允许使用键来查找值。映射表允许使用一个对象(不是引用)来查找另一个对象 添加一组元素
Arrays.asList()方法接受一个数组,或者一个用逗号分隔的元素列表(可变参数),并将其转换为一个List对象?
Collections.addAll()方法接受一个Collection对象,以及一个数组或是逗号分隔的列表,将元素添加到Collection对象中?
Collection.addAll()方法接受一个Collection对象,将该对象的元素添加到方法调用者中
Collection.addAll()运行更快,但不够灵活
Arrays.asList()方法返回的List是和数组链接在一起的,因此不能对返回的List做插入和删除操作?
可以指定asList方法返回列表的目标类型:Arrays.asList()
对于Map的初始化,除了用另一个Map之外,没有其他的初始化方式
容器的打印
对于数组,必须使用Arrays.toString()方法进行打印?
对于容器,则无需任何帮助?
对于Set和Map,除了LinkedHash的,其他类型的都不是按插入顺序存储的
List
有两种类型的List:
ArrayList:擅长随机访问元素,但是中间插入和移除元素较慢 LinkedList:优化中间插入和移除元素,随机访问较慢,但是特性集比ArrayList大
contain:确定某个对象是否在列表中(containsAll,顺序无关)?
indexOf:发现对象在List中所处位置的索引编号,如果没有则返回-1?
remove:移除一个对象,如果成功返回true,否则(比如不存在)返回false(removeAll,顺序无关)?
subList:从列表中创建出一个片段?
retainAll:查找两个列表的交集?
set:在指定的索引处将原先的元素替换?
toArray:默认将列表转换成一个Object数组,如果参数提供特定类型的数组,则会返回一个这个类型的数组(如果能通过类型检查),如果提供的数组够大,会将元素放在这个数组中
List的addAll方法支持在中间插入一个序列
迭代器
JAVA的Iterator只能单向移动?
使用容器的iterator()方法获得该容器的一个迭代器,该迭代器将准备好返回序列的第一个元素?
next():返回下一个元素,即第一次调用next方法时将返回第一个元素?
hasNext():检查是否还有元素?
remove():将迭代器next产生的后一个元素删除,即使用remove前必须先调用next
迭代器的好处:将遍历序列的操作和序列底层的结构分离。迭代器统一了对容器的访问方式
ListIterator
ListIterator可以双向移动?
previous():返回当前元素并移动到上一个元素(和next相反)?
nextIndex():返回下一次next方法将访问的下标?
previousIndex():返回下一次previous方法将访问的下标?
previousIndex = nextIndex - 1?
set():替换访问过的后一个元素
可以给listIterator()方法传入一个int参数来返回一个指向指定下标元素的迭代器
LinkedList
LinkedList添加了可以使其用作栈,队列或双端队列的方法?
getFirst():返回列表的头,如果列表为空则抛出NoSuchElementException?
element():同上?
peek():同上,但列表为空时返回null
remove():移除并返回列表的头,如果列表为空则抛出NoSuchElementException?
removeLast():同上?
poll():同上,但列表为空时返回null
element?
getFirst,get(int),getLast?
offerFirst,offer,offerLast?
peekFirst,peek,peekLast?
pollFirst,poll,pollLast
pop,push?
remove() = removeFirst(),remove(int), remove(Object)?
removeFirst, removeLast?
removeFirstOccurrence,removeLastOccurrence
Stack
Stack继承自Vector类,因此是线程安全的
Set
通常会选择一个HashSet的实现,因为查找是Set重要的操作?
Set具有和Collection完全一样的接口,因此没有任何额外的功能(实际上Set是Collection)
HashSet使用了散列,TreeSet将元素存储在红黑树数据结构中?
如果希望得到排序的结果,可以使用TreeSet?
可以向TreeSet的构造器传入一个比较器Comparator(String.CASE_INSENSITIVE_ORDER)?
contains():测试对象是否在集合中
Map
容器不能用于基本类型?
containsKey:键是否存在?
containsValue:值是否存在?
keySet:返回包含所有键的集合(在foreach语句被使用)?
values:返回包含所有值得Collection(值可以重复)?
entrySet:返回所有键值对的集合
Queue
先进先出(FIFO)的容器?
LinkedList之所有支持队列的行为,是因为它实现了Queue接口?
相关方法:offer,peek,poll,add,remove
PriorityQueue
当使用offer方法往PriorityQueue插入元素时,会在队列中被排序(维护一个堆),默认排序方式是自然排序。当调用peek,poll,remove方法,都会确保获得优先级大的元素(小的值拥有大优先级)?
可以自定义Comparator(Collections.reverseOrder())
Collection和Iterator
AbstractCollection提供了Collection的默认实现,如果要自定义Collection,可以创建AbstractCollection的子类型?
必须要自己实现iterator()和size()方法
foreach和迭代器
foreach语法可以适用于任何Collection对象?
Iterable接口包含了一个能产生迭代器的iterator()方法,任何实现Iterable的类都能用于foreach语句?
Collection类是Iterable,但Map不是?
数组不是Iterable,但可以用于foreach,而且数组没有自动包装机制,数组不能转成Iterable
适配器方法惯用法
如果直接将对象置于foreach语句中,将得到默认的迭代器(调用了iterable())?
如果在Iterable类中添加方法,返回一个产生反向迭代器的Iterable对象(该类操作的是原Iterable对象的数据),相当于调用一个方法,将自己变成另一种Iterable在返回,而这种Iterable能够返回反向的迭代器
Arrays.asList方法产生的队列,如果对其进行修改,也会影响到原数组
总结 suzuki一旦生成,不能改变容量 Collection保存单一元素,Map保存相关联的键值对。容器会自动调整尺寸。容器不能持有基本类型。容器有自动包装机制 如果需要大量的随机访问,应该使用ArrayList,如果需要经常从表中插入或删除元素,应该使用LinkedList 各种Queue以及栈的行为,由LinkedList提供支持 新程序不应使用过时的Vector,Hashtable和Stack
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11