集合框架中Collection接口
一、Java中集合框架的体系结构
集合框架—java做好的用来管理乱七八糟的一堆数据的java类库
集合----[乱七八糟的一堆]
框架—做好的java类库
二、Collection接口与Map接口的区别
Collection接口 | Map接口 |
---|---|
处理单例数据的顶级接口 | 处理键值对数据的顶级接口 |
可以使用Iterator迭代器接口遍历集合 | 没有Iterator迭代器接口 |
三、List接口与Set接口的区别
List接口 | Set接口 |
---|---|
有序 | 无序 |
可以有重复数据 | 不能有重复数据,指重复的数据算一个 |
四、ArrayList类和LinkedList类的用法
ArrayList类:
ArrayList类定义----public class ArrayList
构造方法:
1.ArrayList() 构造一个初始容量为10的空列表。
2.ArrayList(Collection c) 通过一个实现Collection 接口的子类/子接口对象创建一个列表
3.ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。
例如:
package com.ArryList.java;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
//1.ArrayList() 构造一个初始容量为10的空列表。
ArrayList st = new ArrayList();
//2.ArrayList(Collection c) 通过一个实现Collection 接口的子类/子接口对象创建一个列表
ArrayList st2 = new ArrayList(st);
//3.ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。
ArrayList st3 = new ArrayList(50);
}
}
实例方法:
1.boolean add(Object o) 将指定的元素追加到此列表的末尾。
2.boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
3.Object get(int index) 返回此列表中指定位置的元素。
4.int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
5.int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
6.Object remove(int index) 删除该列表中指定位置的元素。
7.boolean remove(Object o) 从列表中删除指定元素的第一个出现。
8.Object set(int index, Object element) 用指定的元素替换此列表中指定位置的元素。
9.int size() 返回此列表中的元素数。
10.boolean isEmpty() 如果此列表不包含元素,则返回 true 。
11.void clear() 从列表中删除所有元素。
12.Iterator iterator() 以正确的顺序返回该列表中的元素的迭代器。
例如:
package com.ArryListfangfa.java;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
//创建ArrayList集合
ArrayList st = new ArrayList();
//1.boolean add(Object o) 将指定的元素追加到此列表的末尾。
st.add("Hello");
st.add(2000);
st.add(false);
st.add(6.66);
st.add("Hello");
//2.boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
System.out.println("是否存在=="+st.contains(7.77));
//3.Object get(int index) 返回此列表中指定位置的元素。
System.out.println("元素=="+st.get(1));
//4.int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
System.out.println("‘Hello’第一次出现的位置=="+st.indexOf("Hello"));
//5.int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
System.out.println("‘p’最后一次出现的位置=="+st.lastIndexOf("p"));
//6.Object remove(int index) 删除该列表中指定位置的元素。
st.remove(3);
System.out.println(st.indexOf(6.66));
//7.boolean remove(Object o) 从列表中删除指定元素的第一个出现
st.remove("Hello");
System.out.println(st.indexOf(1));
//8.Object set(int index, Object element) 用指定的元素替换此列表中指定位置的元素。
st.set(st.indexOf(false), true);
System.out.println(st.get(st.indexOf(true)));
//9.int size() 返回此列表中的元素数。
System.out.println("元素数=="+st.size());
//10.boolean isEmpty() 如果此列表不包含元素,则返回 true 。
System.out.println("是否包含元素=="+st.isEmpty());
//11.void clear() 从列表中删除所有元素。
st.clear();
System.out.println("是否包含元素=="+st.isEmpty());
//12.Iterator<E> iterator() 以正确的顺序返回该列表中的元素的迭代器。
Iterator a=st.iterator();
}
}
执行结果:
遍历ArrayList:
例如:
package com.bianli;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList st = new ArrayList();
st.add("Hello");
st.add(3000);
st.add(false);
st.add(8.88);
//普通for循环
for(int i = 0;i <st.size();i++ ) {
System.out.println(st.get(i));
}
System.out.println("_______________");
//增强fo循环
for(Object o:st) {
System.out.println(o);
}
System.out.println("_______________");
//迭代器
Iterator or = st.iterator();
while(or.hasNext()) {
System.out.println(or.next());
}
}
}
执行结果:
LinkedList类
LinkedList类定义----public class LinkedList
构造方法:
1.LinkedList() 构造一个空列表。
2.LinkedList(Collection c) 通过一个实现Collection 接口的子类/子接口对象创建一个列表
例如:
package com.LinkedList.java;
import java.util.ArrayList;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
//1.LinkedList() 构造一个空列表。
LinkedList ked = new LinkedList();
//2.LinkedList(Collection c) 通过一个实现Collection 接口的子类/子接口对象创建一个列表
LinkedList ked2 = new LinkedList(ked);
//Collection参数的构造方法可以用来进行集合类之间的转换
ArrayList st = new ArrayList();
LinkedList ked3 = new LinkedList(st);
}
}
实例方法:
1.boolean add(Object o) 将指定的元素追加到此列表的末尾。
2.boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
3.Object get(int index) 返回此列表中指定位置的元素。
4.int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
5.int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
6.Object remove(int index) 删除该列表中指定位置的元素。
7.boolean remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
8.Object set(int index, Object element) 用指定的元素替换此列表中指定位置的元素。
9.int size() 返回此列表中的元素数。
10boolean isEmpty() 如果此列表不包含元素,则返回 true 。
11.void clear() 从列表中删除所有元素。
12.Iterator iterator() 以正确的顺序返回该列表中的元素的迭代器。
对第一个元素和最后一个元素的操作方法:
13.void addFirst(Object e) 在该列表开头插入指定的元素。
14.void addLast(Object e) 将指定的元素追加到此列表的末尾。
15.Object getFirst() 返回此列表中的第一个元素。
16.Object getLast() 返回此列表中的最后一个元素。
17.Object removeFirst() 从此列表中删除并返回第一个元素。
18.Object removeLast() 从此列表中删除并返回最后一个元素。
例如:
package com.LinkedListfangfa.java;
import java.util.Iterator;
import java.util.LinkedList;
public class Test1 {
public static void main(String[] args) {
//创建LinkedListList集合
LinkedList ked = new LinkedList();
//1.boolean add(Object o) 将指定的元素追加到此列表的末尾。
ked.add("Hello");
ked.add(5000);
ked.add(true);
ked.add(8.88);
ked.add("Hello");
//2.boolean contains(Object o) 如果此列表包含指定的元素,则返回 true 。
System.out.println(ked.contains(true));
//3.Object get(int index) 返回此列表中指定位置的元素。
System.out.println(ked.get(2));
//4.int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
System.out.println(ked.indexOf(8.88));
//5.int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
System.out.println(ked.lastIndexOf("Hello"));
//6.Object remove(int index) 删除该列表中指定位置的元素。
ked.remove(3);
System.out.println(ked.indexOf(8.88));
//7.boolean remove(Object o) 从列表中删除指定元素的第一个出现
ked.remove("Hello");
System.out.println(ked.indexOf(0));
//8.Object set(int index, Object element) 用指定的元素替换此列表中指定位置的元素。
ked.set(ked.indexOf(true),false);
System.out.println(ked.get(ked.indexOf(false)));
//9.int size() 返回此列表中的元素数。
System.out.println(ked.size());
//10.boolean isEmpty() 如果此列表不包含元素,则返回 true 。
System.out.println(ked.isEmpty());
//11.void clear() 从列表中删除所有元素。
ked.clear();
System.out.println(ked.size());
//12.Iterator<E> iterator() 以正确的顺序返回该列表中的元素的迭代器。
Iterator a=ked.iterator();
//13.void addFirst(Object e) 在该列表开头插入指定的元素。
ked.addFirst("World");
//14.void addLast(Object e) 将指定的元素追加到此列表的末尾。
ked.addLast("Hello");
//15.Object getFirst() 返回此列表中的第一个元素。
System.out.println(ked.getFirst());
//16.Object getLast() 返回此列表中的最后一个元素。
System.out.println(ked.getLast());
//17.Object removeFirst() 从此列表中删除并返回第一个元素。
System.out.println(ked.removeFirst());
System.out.println(ked.size());
//18.Object removeLast() 从此列表中删除并返回最后一个元素。
System.out.println(ked.removeLast());
System.out.println(ked.size());
}
}
执行结果:
总结:
因为ArrayList是动态数组结构,他在查找第一个元素和最后一个元素的时很麻烦,而LinkedList采用的是双向链表结构,这种结构在查找第一个元素和最后一个元素的时候是最快的。就像一列火车我们眼前驶过,我们可能不知道这列火车由几节车厢组成,但是我们一定会在第一时间看清第一节与最后一节车厢位置。所以LinkedList会比ArrayList多出一组对第一个元素和最后一个元素的操作方法
遍历LinkedList:
package com.LinkedLastbianli.java;
import java.util.Iterator;
import java.util.LinkedList;
public class Test {
public static void main(String[] args) {
LinkedList ked = new LinkedList();
ked.add("Hello");
ked.add(6000);
ked.add(true);
ked.add(6.66);
//for循环
for(int i = 0;i<ked.size();i++) {
System.out.println(ked.get(i));
}
System.out.println("_______________");
//增强for循环
for(Object o:ked) {
System.out.println(o);
}
System.out.println("_______________");
//迭代器
Iterator tor = ked.iterator();
while(tor.hasNext()){
System.out.println(tor.next());
}
}
}
执行结果:
四、ArrayList类与LinkedList类的区别
ArrayList | LinkedList |
---|---|
动态数组结构 | 双向链表结构 |
查询快 添加删除慢 | 查询慢 添加删除快 |
没有提供对第一个元素和最后一个元素的操作 | 提供了对一个元素和最后一个元素的操作 |
适用于大量查询操作 | 适用于大量添加删除操作 |
初始容量值为10 | 没有初始容量 |
每次扩展后的容量是之前的1.5倍 | 没有扩容机制 |
五、HashSet类和LinkedHashSet类的用法
HashSet类
HashSet类定义–public class HashSet 此类实现Set接口 由哈希表支持
HashSet中保存的元素是没有顺序,重复的元素算一个。
构造方法:
1.HashSet() 构造一个新的空集合; 默认初始容量(16)和负载因子(0.75)。
2.HashSet(Collection c) 构造一个包含指定集合中的元素的新集合。
3.HashSet(int initialCapacity) 构造一个新的空集合; 具有指定的初始容量和默认负载因子(0.75)。
4.HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 具有指定的初始容量和指定的负载因子。
例如:
package com.HashSet.java;
import java.util.ArrayList;
import java.util.HashSet;
public class Test {
public static void main(String[] args) {
//1.HashSet() 构造一个新的空集合; 默认初始容量(16)和负载因子(0.75)。
HashSet set1 = new HashSet();
//2.HashSet(Collection c) 构造一个包含指定集合中的元素的新集合。
HashSet set2 = new HashSet(set1);
ArrayList st = new ArrayList();
HashSet set3 = new HashSet(st);
//3.HashSet(int initialCapacity) 构造一个新的空集合; 具有指定的初始容量和默认负载因子(0.75)。
HashSet set4 = new HashSet(60);
//4.HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 具有指定的初始容量和指定的负载因子。
HashSet set5 = new HashSet(50,0.7f);
}
}
实例方法:
1.boolean add(Object e) 将指定的元素添加到此集合(如果尚未存在)。
2.boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
3.boolean isEmpty() 如果此集合不包含元素,则返回 true 。
4.Iterator iterator() 返回此集合中元素的迭代器。
5.boolean remove(Object o) 如果存在,则从该集合中删除指定的元素。
6.int size() 返回此集合中的元素数(其基数)。
7.void clear() 从此集合中删除所有元素。
例如:
package com.HashSetfangfa.java;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet set1 = new HashSet();
//1.boolean add(Object e) 将指定的元素添加到此集合(如果尚未存在)。
set1.add("Hello");
set1.add(3000);
set1.add(true);
set1.add(6.66);
//2.boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
System.out.println(set1.contains("Hello"));
//3.boolean isEmpty() 如果此集合不包含元素,则返回 true 。
System.out.println(set1.isEmpty());
//4.Iterator iterator() 返回此集合中元素的迭代器。
Iterator tor=set1.iterator();
//5.boolean remove(Object o) 如果存在,则从该集合中删除指定的元素。
set1.remove(3000);
System.out.println(set1.size());
//6.int size() 返回此集合中的元素数(其基数)。
System.out.println(set1.size());
//7.void clear() 从此集合中删除所有元素。
set1.clear();
System.out.println(set1.size());
}
}
执行结果:
遍历HashSet:
例如:
package com.bianli.java;
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("Hello");
set.add(3000);
set.add(true);
set.add(6.66);
//增强for循环
for(Object o:set) {
System.out.println(o);
}
System.out.println("_________");
//迭代器
Iterator tor=set.iterator();
while(tor.hasNext()) {
System.out.println(tor.next());
}
}
}
执行结果:
LinkedHashSet类
哈希表和链表实现了Set接口,具有可预测的迭代次序。 这种实现不同于HashSet,它维持于所有条目的运行双向链表。
因为LinkedHashSet类是HashSet类的子类,因此会从父类继承集合数据的操作方法,所以只要我们会HashSet类使用,那么LinkedHashSet类不用学也会用。
构造方法:
1.LinkedHashSet() 构造一个新的空集合; 默认初始容量(16)和负载因子(0.75)。
2.LinkedHashSet(Collection c) 构造一个包含指定集合中的元素的新集合。
3.LinkedHashSet(int initialCapacity) 构造一个新的空集合; 具有指定的初始容量和默认负载因子(0.75)。
4.LinkedHashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 具有指定的初始容量和指定的负载因子。
例如:
package com.LinkedHashSet.java;
import java.util.LinkedHashSet;
public class Test {
public static void main(String[] args) {
//构造方法
LinkedHashSet ls = new LinkedHashSet();
LinkedHashSet ls1 = new LinkedHashSet(30);
LinkedHashSet ls2 = new LinkedHashSet(60,0.8f);
}
}
实例方法:
1.boolean add(Object e) 将指定的元素添加到此集合(如果尚未存在)。
2.boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
3.boolean isEmpty() 如果此集合不包含元素,则返回 true 。
4.Iterator iterator() 返回此集合中元素的迭代器。
5.boolean remove(Object o) 如果存在,则从该集合中删除指定的元素。
6.void clear() 从此集合中删除所有元素。
7.int size() 返回此集合中的元素数(其基数)。
例如:
package com.LinkedHashSetfangfa.java;
import java.util.LinkedHashSet;
public class Test {
public static void main(String[] args) {
//创建对象
LinkedHashSet ls = new LinkedHashSet();
//1.boolean add(Object e) 将指定的元素添加到此集合(如果尚未存在)。
ls.add("Hello");
ls.add(true);
ls.add(3.33);
ls.add(2000);
//2.boolean contains(Object o) 如果此集合包含指定的元素,则返回 true 。
System.out.println(ls.contains(3.33));
//3.boolean isEmpty() 如果此集合不包含元素,则返回 true 。
System.out.println(ls.isEmpty());
//4.Iterator iterator() 返回此集合中元素的迭代器。
ls.iterator();
//5.boolean remove(Object o) 如果存在,则从该集合中删除指定的元素。
ls.remove(2000);
System.out.println(ls.size());
//6.void clear() 从此集合中删除所有元素。
ls.clear();
System.out.println(ls.size());
//7.int size() 返回此集合中的元素数(其基数)。
System.out.println(ls.size());
}
}
执行结果:
遍历LinkedHashSet
例如:
package com.LinkedHashSetbianli.java;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class Test {
public static void main(String[] args) {
//创建集合
LinkedHashSet ls = new LinkedHashSet();
ls.add("Hello");
ls.add(true);
ls.add(3.33);
ls.add(2000);
//增强for循环
for(Object o:ls) {
System.out.println(o);
}
System.out.println("__________");
//迭代器
Iterator tor =ls.iterator();
while(tor.hasNext()) {
System.out.println(tor.next());
}
}
}
执行结果:
六、LinkedHashSet与HashSet区别
HashSet | LinkedHashSet |
---|---|
遍历输出时无序 | 遍历输出时按照插入顺序输出 |