1.什么是集合框架?
答:集合就是你提个篮子上街买菜。篮子就是一个集合,各种菜就是元素。注意这个元素是Object类型的。
2.集合框架简单介绍
- 可以使程序能方便的存储,检索和操作数目不一定的数据。
- java集合存放于java.util中。
- java集合中只能添加object对象,不能添加基本数据类型
- 在创建java数组的时候,必须明确指定数组的长度,数组一旦创建,其长度不能改变。而集合弥补了这个缺点。
3.集合分类
Collection:不唯一,无序
List:不唯一,有序
set:唯一,无序
Map:键值对
4.List常用方法
add(E e)//添加元素
get(E e)//获取元素
remove(E e)//移除元素
clear()//清空
contains(E e)//是否包含某一个元素
isEmpty()//是否为空
removeAll(List list)//在当前集合中删除与当前集合相同的元素
retainAll(List list)//在当前集合中删除与当前集合不相同的元素
toArray()//转换为数组
提示:以下关于list方法的测试输出都是使用bianli(list)方法,后面不再重复给出。
package 集合;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
public class TestList {
//遍历集合
public static void bianLi(List list) {
for (Object i : list) {
System.out.print(i+" ");
}
System.out.println("\n");
}
public static void main(String[] args) {
//创建List集合框架,ArrayList实现了List接口
List list = new ArrayList();
//将指定对象添加到集合中add(E obj),返回boolean类型。返回true添加成功,否则添加失败
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add(2, "tt");
bianLi(list);//输出:aa bb tt cc dd
list.remove(0);
bianLi(list);//输出:bb tt cc dd
list.remove("bb");
bianLi(list);//输出:tt cc dd
list.clear();
bianLi(list);//清空集合
System.out.println(list.contains("ff"));//false
System.out.println(list.isEmpty());//true
}
}
测试结果:
aa bb tt cc dd
bb tt cc dd
tt cc dd
false
true
提示:以下的代码都是写在main()方法体下
测试代码removeAll()方法:
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
//创建一个新的集合list2
List list2 = new ArrayList();
list2.add("cc");
list2.add("tt");
//在list中删除与list2中相同的元素
list.removeAll(list2);
bianLi(list);
测试结果:
aa bb dd
测试代码retainAll()方法:
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
//创建一个新的集合list2
List list2 = new ArrayList();
list2.add("cc");
list2.add("tt");
//在list中删除与list2中不同的元素
list.retainAll(list2);
bianLi(list);
测试结果:
cc
测试代码toArray()方法:
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
//将集合转换为数组
Object objs[] = list.toArray();
System.out.println(Arrays.toString(objs));
测试结果:
[aa, bb, cc, dd]
注意:list中添加的元素类型是object
5.Vector方法与List的区别:
- List的扩展是每次增加自身的50%,而且线程不安全,线程不同步
- Vector每次自增一倍,线程安全,线程同步
测试代码:
Vector v = new Vector();
v.add("csw");
v.add("csw2");
v.addElement("csw3");
for (Object i : v) {
System.out.print(i+" ");
}
测试结果:
csw csw2 csw3
6.LinkedList比ArrayList多出的方法
提示:Linked其他方法与ArrayList相同,只是比它多了以下6个方法
addFirst()//将元素添加在第一个位置
addLast()//将元素添加在第一个位置
removeFirst();、、
removeLast()
getFirst()
getLast()
测试代码:
package test;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String[] args) {
LinkedList link = new LinkedList();
link.add("aa");
link.addFirst("bb");
link.addLast("dd");
link.add("cc");
System.out.println("获取第一个元素");
System.out.println(link.getFirst()+" ");
System.out.println("获取最后一个元素");
System.out.println(link.getLast());
System.out.println("删除操作前的遍历结果");
for(Object l : link){
System.out.print(l+" ");
}
System.out.println();
//删除第一个元素
link.removeFirst();
//删除最后一个元素
link.removeLast();
System.out.println("删除之后的结果");
for(Object l : link){
System.out.print(l+" ");
}
}
}
测试结果:
获取第一个元素
bb
获取最后一个元素
cc
删除操作前的遍历结果
bb aa dd cc
删除之后的结果
aa dd
ArrayList与LinkList的区别
- ArrayList实现了长度可变的数组,分配连续的空间。遍历元素和随机访问元素的效率比较高
- LinkedList插入删除效率比较高。链表形式
7.迭代器Iterator:
- Iterator 接口,主要循环无序集合
- hasNext() 如果被迭代的集合元素还没有被遍历,则返回true
- next() 返回集合中下一个元素
- remove 删除集合里上次next返回的元素
8.集合遍历
测试代码:
package 集合;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
public class TestList {
public static void main(String[] args) {
List list = new ArrayList();
list.add("aa");
list.add("bb");
System.out.println("第一种遍历方式:数组遍历");
for(int i=0; i
测试结果:
第一种遍历方式:数组遍历
aa
bb
第二种遍历方式:forEach
aa
bb
第三种遍历方式:迭代遍历
aa
bb
9.Set集合常用方法
由于set方法大部分与list相似,就不再给出,可以上网查询
package 集合;
import java.util.List;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
public class TestSet {
public static void main(String[] args) {
Set set = new HashSet();
set.add("aa");
set.add("bb");
set.add("cc");
System.out.println(set.size());
for(Object s : set){
System.out.println(s);
}
System.out.println("------------------");
List list = new ArrayList();
list.add("AAA");
list.add("BBB");
list.add("AAA");
list.add("DDD");
//移除所有重复的元素,只显示唯一的元素
Set set2 = new HashSet(list);
for(Object o : set2){
System.out.println(o);
}
}
}
10.HashSet与TreeSet的区别
- hashSet 无序的
- treeSet 也是无序的,只是在展示的时候自动排序
11.Map常用方法
Map
put(key,value)//添加元素
get(key)//根据键获取值
keySet(); //获取所有的键,返回的是一个Set集合。
values(); //获取所有的值,返回的是Collection
clear();//清空操作
containKey()//是否包含指定的键
containValues(value)//是否包含指定的值
size();//获取添加元素的个数
remove(key)//移除某个元素
代码测试:
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Test {
public static void main(String[] args) {
//创建Map集合
Map map = new HashMap();
//添加元素
map.put(1,"java");
map.put(2, "c");
map.put("name", "c");
map.put(1,"java");
map.put(1,"java2");
//获取键值
System.out.println(map);
System.out.println(map.get(1));
System.out.println(map.get("name"));
}
}
测试结果:
{1=java2, 2=c, name=c}
java2
c
keySet()和values()方法的测试
代码测试:
public class Test {
public static void main(String[] args) {
Map map = new HashMap();
map.put(1,"java");
map.put(2, "c");
map.put("name", "c");
map.put(1,"java");
map.put(1,"java2");
Set key = map.keySet();
Iterator iter = key.iterator();
while(iter.hasNext()){
Object obj = iter.next();
System.out.println(map.get(obj));//获取values
}
System.out.println("---------------");
System.out.println(map.values());//获取values
}
}
测试结果:
java2
c
c
---------------
[java2, c, c]
注意:Map接口不继承Collection,但List和Set继承了Collection
Map与HashTable的区别
- Hashtable继承Dictionary类,HashMap实现接口
- HashTable线程安全,HashMap不安全
- Hashtable不允许添加null,HashMap允许为null
思考
List,Set和Map中是否可以添加null值?
答:set不允许添加null,否则会报错;但list可以添加,Vector也可以添加,map也可以添加null,HashTable不允许为null
ArrayList的基本原理:http://www.jianshu.com/p/6f7bb468c0e7