集合有两大类:Collection和Map,
集合的由来:我们用对象来封装数据,对象多了也要存储起来,如果对象的个数不确定,就使用集合容器进行存储。
集合的特点:所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量,集合存储的是对象的地址),不可以存储基本数据类型值,集合长度的是可变的,集合可以存储不同类型的对象
为什么会出现这么多容器?每个容器对数据存储的方式不同,这个方式就称为:数据结构。
集合与数组的区别:数组长度不可变,数组对象必须是同种类型。
集合Collection总结。
Collection是根接口,Collection下有两个比较重要的子接口,他们是Set和List
Collection:
|--List:元素是有序的,元素可以重复。因为该集合体系有所以
|-- ArrayList:底层是数组数据结构,数组长度是可变的,超出后延长50%,线程是不同步的,,查询,修改速度快效率高,替代了Vector ,增删较慢.
|--LinkedList;底层使用的链表数据结构 此实现不是同步的 特点:查找慢,增删快//重要
|--Vector: Vector:底层是数组数据结构,数组长度是可变的,超出后延长100%,是同步的(线程安全),效率低,增删查询都很慢
|--Set:元素是无序(指不安存储顺序来),元素不可以重复。但是提供了可以排序的TreeSet(但是存入的对象必须具备就)
|--TreeSet:可以对Set集合的元素进行排序。底层数据结构是二叉树,不同步。保证元素唯一性的依据:compareTo或compara方法 return的数据 .
二叉树:比较,小于放左边,大于放右边,这样存入时就可以一次性排除一边数据,取数据时:从最小的开始从下往上。
|--HashSet:数据结构是哈希表,线程是非同步的。保证元素唯一性的原理:判断元素的hashCode值是否相同。
存储数据:
List:自定义类复写equals可以按自定义去除重复元素
HashSet:按哈希表和equals,注意先找hashcode()方法。自定义条件保证唯一性:自定义类需要复写hashcode(返回值int,不要超了),equals。
:哈希表之所以出现希望不要每次都要调用equals,否则很慢。
TreeSet:方法1:自定义对象实现comparable,复写compareTo(),方法2:自定义比较器实现comparator(比较器,并作为参数传给TreeSet),复写compare方法。
原理:不调用equals,只看compare和compareTo返回的结果来判断是否重复。
排序:不论是什么排序,主要条件相同,一定要判断次要条件。
如何实现怎么存入,怎么取出。将compareTo方法的返回值写成:1即可
总结:
后缀名就是该集合所属的体系,前缀名就是该集合的数据结构。
看到array:就要想到数组,就要想到查询快,有角标.
看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator。
通常这些常用的集合容器都是不同步的,除了Vector
Collection的一些基本方法:
1.添加 集合中存放的是对象的地址或引用
boolean add(E e);
boolean addAll(Collection<? extends E> c);
2.删除
void clear();删除全部
boolean remove(Object o); 移除第一次出现的指定元素 ,不存在返回false
removeAll(Collection<?> c) ;
3.获取
int size() ;返回元素数,集合长度
4.判断
boolean isEmpty();
boolean contains(Object obj);
boolean containsAll(Collectioncoll);
5.交集
boolean retainAll(Collection<?> c)
a1.retainAll(a2);//取交集,a1中只会保留与a2相同的对象,如果没有交集,a1是null
6.常用
Object[] toArray() 返回包含此 collection 中所有元素的数组。
<T> T[] toArray(T[] a)
迭代器:迭代器取代了Enumeration。
迭代器与枚举有两点不同:迭起可以使用remove()方法,名字变短了.
List接口:常用的实现类 :ArrayList:Vector:LinkedList:
:特有方法.凡是可以操作角标的方法都是该体系特有的方法,因为List有序(存入和取出的顺序一致),元素都有索引,所以元素可以重复。
因为list集合有脚标,所以就有两种取出元素的方式:for循环和迭代器.
获取所有元素
for (int x=0;x<a1.size();x++ ) {
System.out.println("a1("+x+"):"+a1.get(x));
}
迭代器
Iterator it = a1.iterator();
while (it.hasNext()) {
//System.out.print("a1:"+it.next());
}
注:第一种while循环后迭代器对象还驻留在内存中,第二种for循环后迭代器对象立即释放,第二种更省内存。
|---List特有迭代器:ListIterator
在迭代时,只能用迭代器操作元素,可是Iterator方法是有限的:hasNext() next() void remove()
只能对元素进行判断,取出,删除。
如果要进行其他操作如添加,修改,就需要使用其子接口,ListIterator.该接口只能通过List集合的listIterator方法获取。特有方法:add,remove,set.
ListIterator li = a.listIterator();
while (li.hasNext()) {
Object obj = li.next();
if (obj.equals("hehe")) {
//li.remove();
li.add("java");
//li.set("2222");
}
}
注:hasPrevious() previous()是逆向遍历
List的一些常用方法:
添加:add(index,element);
addAll(index,Collection)
获取:
listIterator(int index) 返回列表中元素的列表迭代器,从列表的指定位置开始。
get(index);
int indexOf(Object o) 返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1
List<E> subList(int fromIndex, int toIndex) :不包含尾
修改元素:
set(int index, E element) 用指定元素【替换】列表中指定位置的元素
删除:
a1.remove(int index);// 移除列表中指定位置的元素
--LinkedList
特有方法
addFirst()指定元素插入此列表的开头
addLast()指定元素插入此列表的尾部
列表为空,removeFirst()等抛异常:
(1)获取元素,但不删除元素
getFirst()返回此列表的第一个元素。
getLast()返回此列表的最后一个元素。
获取元素,并删除元素。
(2) removeFirst() 移除并【返回】此列表的第一个元素 列表为空,removeFirst()等抛异常
removeLast()移除并【返回】此列表的组最后一个元素
取出全部元素;除了迭代器和get(for遍历),可以用removeFirst()
while(!link.isEmpty){
removeFirst()//pooFirst()
}
在jdk1.6出现了代替()方法,如果此列表为空,则返回 null
offerFirst()在此列表的开头【插入】指定的元素。代替add
offerLast()在此列表的尾部【插入】指定的元素。
pollFirst();【获取并移除】此列表的第一个元素则返回 null。代替remove
pollLast();【获取并移除】此列表的最后一个元素 则返回 null。
peekFirst():【获取但不移除】此列表的第一个元素;【如果此列表为空,则返回 null】。代替get
peek(Last) 【获取但不移除】此列表的第一个元素;【如果此列表为空,则返回 null】。
练习:
1.使用LinkedList模拟一个堆栈或者队列数据结构。
/*
2.删除ArrayList集合中的重复元素
思路:定义一个临时容器
遍历集合,存入临时容器,相同不存
打印临时容器
*/
/*
3.将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
比如;存人对象,同姓名,同年龄,视为同一个人,为重复元素。
思路;
1.对人描述,将数据进行封装。//人本身具备equals方法(继承自Object),比较的是地址值。但我们要复写。
2.定义容器,将人存入。
3.取出。
*/
Set :元素不能重复,无序(存入和取出的顺序不一致)的, 因为没有脚标,
所以,Set接口中的方法和Collection是一样的。
|--HashSet:底层结构式是哈希表
HashSet是如何保证元素的唯一性呢?
是通过元素的两个方法,hashcode和equals来完成。
如果元素的hashcode值相同,才会判断equals是否为true
如果元素的hashcode值不同,不会调用equals 复写hashCode方法, 哈希值相同才调用equals
注意:HashSet:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
ArrayList判断或存储,只依赖于equals。
|--TreeSet:可以对Set集合的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo和compare.表示元素相同。