List、Set
来源:互联网 发布:软件检测工程师 编辑:程序博客网 时间:2024/06/05 18:19
Collection
|——List:列表
特点:
1, 有序(存储元素的顺序和取出元素的顺序一致)
2, 该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。
3, 它可以存储重复元素
常见子类对象:学习该对象的特有数据结构及相关特点
|——Vector:JDK1.0就存在了。底层是数组结构的。可变长度数组。
原理:一旦原数组长度不够,会创建新数组,长度为原来的2倍,将原数组的元素复制到新数组中,并将新元素添加到数组中
*Vector是同步的
|——ArrayList:底层是数组结构,也是支持长度可变数组的。是不同步的。
替代了Vector,因为效率高,查询效率高,但是增删的效率很低
|——LinkedList:底层是链接列表结构,简称链表结构。是不同步的。这个结构的好处:对元素的增删效率很高,查询的效率很低
|——Set:集:中的方法和Collection一致,只要重点注意它的子类对象即可。取出元素只能使用迭代器。非同步的。
特点:
1,不包含重复元素。(最大的特点)
2,这个集合存入元素的顺序和取出元素的顺序不一定一致。(具体的容器对象数据结构不同,顺序也有不同)
|——HashSet:底层数据结构是哈希表,不保证顺序,是不同步的。
哈希表:提供数组的查询效率而出现的
将要存储的元素先通过哈希算法算出一个哈希值来标示存储的位置,代表着元素。要找元素时,先将该元素通过哈希算法算出哈希值,再通过哈希值到哈希表中去查找
特点:
1, 不关系元素的顺序
2, 提高了查询效率
3, 不可能出现重复元素,因为哈希值都不同,即使相同,会再次判断两个元素的equals内容是否相同。所以哈希表要保证元素的唯一性,必须要依赖于两个方法。
1, hashCode
2, equals
|——TreeSet:可以给Set集合中的元素进行指定顺序的排序
默认情况下,是通过元素的自然顺序排的序
他保证元素唯一性的依据是看比较方法的返回结果是否是0,是0就视为元素相同,不存。
自然顺序:就是元素自身的具备的比较性实现了Comparable接口的compareTo方法
TreeSet排序的方式一:让元素自身具备比较性,需要实现Comparable接口,覆盖compareTo方法。这种比较方式成为自然顺序排序
如果元素自身不具备比较性或者具备的比较性(自然顺序)不是所需要的。这时只能用第二种方式
TreeSet排序的方式二:让容器自身具备比较性。容器一初始化就具备了比较功能。因为容器是在对象构造时完成的。通过查阅,有一个构造方法TreeSet(comparator),在容器初始化时可以指定一个比较器。
需要实现Comparator接口,覆盖compare方法即可。
所以这种方式称为比较器排序。
List接口中的特有方法
因为该接口的特点是对元素有索引标示。
所以它的特有方法应该都是围绕着索引定义的
1, 添加
voidadd(index,element);
booleanaddAll(index,collection);
2, 删除
objectremove(index);获取并删除
3, 获取
获取元素:
Objectget(index);获取
获取元素索引:
intindexOf(object);
intlastIndexOf(object);
获取子列表:
List subList(fromIndex,toIndex):获取列表中的一部分,包含fromindex位置,不包含toIndex位置
4, 修改
Objectset(index,element):替换指定位置的元素,并返回被替换掉的元素。
List接口是可以对元素进行增删改查操作的
*只有这个集合具备着增删改查。具备的原因:因为有索引。
当集合进行迭代时,在迭代的过程,如果用集合对象对元素进行了修改。
而迭代器是不知道的,所以在迭代的过程中就会发生不确定性。
为了避免这种情况的发生,在迭代时,不要使用集合对象对迭代中的元素进行操作。
但是,我们还想在迭代的过程中对被迭代的元素进行更多的操作。该怎么办呢?
可以使用迭代器的方法,但是Iterator的方法很郁闷,只有判断hasNext,获取next,删除 remove三个方法
** 要想解决这个问题,list接口中提供了一个特有的迭代器。
这个迭代器就是ListItrator列表迭代器。就可以解决这个问题
介绍一下ListIterator
父类接口Iterator。
Add remove set next 它就可以实现在迭代过程中进行元素的增删改查的动作
它还可以逆向遍历 hasPrevious
*这个列表迭代器只能对List集合使用
枚举
vector中早前的取元素操作,枚举elements 只能取出vector中的元素
枚举接口也是用来取出集合中的元素,枚举最后被迭代器取代
Enumeration e=vector.elements();
while(e.hsaMoreElements())
{
System.out.println(e.nextElements());
}
链表特有方法
LinkedList
头尾操作方法
addFirst();
addLast();
jdk1.6以后,变成
offerFirst()
offerLast()
getFirst():从头部获取元素,但不删除。如果没有元素,会抛出NoSuchElementException
getLast();
jdk1.6以后,变成
peekFirst();从头部获取元素,但不删除。如果没有元素,返回null
peekLast();
removeFirst():从头部获取元素,但删除。如果没有元素,会抛出NoSuchElementException
removeLast();
jdk1.6以后,变成
pollFirst():从头部获取元素,但删除。如果没有元素,会返回null
pollLast():
两种常见的数据结构
1, 队列:先进先出 FIFO first in first out
2, 堆栈:后进先出 LIFO last in first out
注意:
ArrayList判断元素是否相同的equals方法
比如contains中就是依赖于equals方法
或者remove方法都是依赖于equals方法
尤其存储自定义对象时,该对象一定要覆盖equals方法,建立根据对象自身特点判断相同的依据
equals就是用于比较对象的内容的
往哈希表中存储自定义对象
必须覆盖hashCode方法和equals方法
在eclipse中用alt+shift+s可以出现一个对话框 选择Generale hashCode()and equals()
它就可以自己创建equals方法和hashCode方法
如果不知道对象到底要存储到哪,就将hashCode equals toString全都覆盖
不覆盖也从Object类中继承了,那还不如覆盖,创建对象自身的判断相同的依据
想让Person对象具备比较大小的功能
就需要对Person对象进行功能的扩展
让person去实现Compareble接口,让Person具备自然顺序,覆盖compareTo方法
进行对象比较的时候,通常先比较主要条件,如果主要条件相同,在比较次要条件,如果按照人的年龄排序,再比较一次姓名
compareTo中
person p=(person)o;
if(this,age>p.age)
return 1;
if(this.age==p.age)
return this.name.compareTo(p.name);
return -1;
技巧性写法
Person p=(Person)O;
Int temp=this.age-p.age;
return temp==0?this.name.compareTo(p.name):temp;
在Set集合中,其实有一个有序集合,就是HashSet的子类LinkedHashSet。
集合的掌握技巧:
明确具体几何对象名称的后缀:
如果后缀是List,都属于List体系。通常都是非同步的。
如果后缀是Set,都属于Set体系,通常也是非同步的。
这些体系中的其他子类对象,后缀不是所属接口名的,一般都是同步的,比如Vector
这在常用子类对象中通用。
明确数据结构:
对于jdk1.2版本的子类对象。
后缀名是所属的体系。前缀名就是数据结构的名称
比如:
ArrayList:看到Array,就要明确是数组结构。查询快。
LinkedList:看到Link,就要明确链表结构,就要想到addget remove 和first last结合的方法,增删快。
HashSet:看到hash,就要明确是哈希表。查询巨快,而且唯一性。
就要想到元素必须覆盖hashCode方法和equals方法。
TreeSet:看到Tree,就要明确二叉树,可以对元素排序。
就要想到两种排序方式:
自然顺序:Comparable接口,覆盖compareTo(一个参数)java.lang
比较器:Comparator接口,覆盖compare(两个参数)java.util
判断元素唯一性的依据就是比较方法的返回结果return 0;
- set list
- list, set
- set list
- List、Set
- List Set
- LIST SET
- 集合List:List Map Set
- List,set,Map
- Set、List、Map区别
- Set List Map总结
- List 和Set转换
- List,Map,Set,容器
- map list set 区别
- List , Map . Set 类
- 关于set,list,map
- Set,Map,List
- List和Set
- list set 转 数组 []
- Android Button Example-onClickListener-Intent
- mybatis 与 ehcache 整合
- VSS的配置和使用
- TextBox控件的使用,MaskedTextBox控件的使用
- 基于weibopy sina接口数据的设想与实现
- List、Set
- IOS开发之把 JSON 数据转化成 Arrays 或者 Dictionaries
- 黑马程序员--01 c#基础知识
- android ListView
- MDI窗体应用程序
- 在 Codeigniter(CI)中引入外部的JS与CSS的配置及使用
- 系统调用
- IOS开发之把 Array 和 Dictionaries 序列化成 JSON 对象
- Map、Collections、Arrays