集合框架——为什么需要?(动态增删改查)
我们想,如果有这样一种数组,它可以动态的改变就好了,java的设计者为我们提供了一系列的集合类,我们来看看:
---|Collection: 单列集合
---|List: 有存储顺序, 可重复
---|ArrayList: 数组实现, 查找快, 增删慢
由于是数组实现, 在增和删的时候会牵扯到数组
增容, 以及拷贝元素. 所以慢。数组是可以直接
按索引查找, 所以查找时较快
---|LinkedList: 链表实现, 增删快, 查找慢
由于链表实现, 增加时只要让前一个元素记住自
己就可以, 删除时让前一个元素记住后一个元
素, 后一个元素记住前一个元素. 这样的增删效
率较高但查询时需要一个一个的遍历, 所以效率
较低
---|Vector: 和ArrayList原理相同, 但线程安全, 效率略低
和ArrayList实现方式相同, 但考虑了线程安全问
题, 所以效率略低
性能:ArrayList = LinkedList > Vector
---|Set: 无存储顺序, 不可重复
---|HashSet 内容无序 不可重复 支持null
---|TreeSet 内按字典序 不可重复 不支持null
---|LinkedHashSet 带存储顺序 不可重复
性能:HashSet > TreeSet > LinkedHashSet
---| Map: 键值对 (key,value) key的特点是无序的,不可以重复的,通过唯一的key拿到唯一的value。
---|HashMap 非线程安全,高效,key无序 key支持null
---|TreeMap key按按字典序 key不支持null
---|HashTable 线程安全,低效,key不支持null
---|LinkedHashMap
集合框架——使用
上面的图可以看出java集合类主要有一下几种:
List结构的集合类:
ArrayList类,LinkedList类,Vector类,Stack类
Map结构的集合类
HashMap类,Hashtable类
Set结构的集合类
HashSet类,TreeSet类
Queue结构的集合
Queue接口
演示Java集合的用法
public class Clerk {
private String name;
private int age;
private float sal;
public Clerk(String name,int age,float sal) {
this.name=name;
this.age=age;
this.sal=sal;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSal() {
return sal;
}
public void setSal(float sal) {
this.sal = sal;
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList al=new ArrayList();
// System.out.println("al大小"+al.size());
//创建一个职员
Clerk clerk1=new Clerk("宋江", 50, 1000);
Clerk clerk2=new Clerk("吴用", 45, 1200);
Clerk clerk3=new Clerk("林冲", 35, 1300);
//将clerk加入到al中
al.add(clerk1);
al.add(clerk2);
al.add(clerk3);
//遍历所有集合里的对象
for(int i=0;i<al.size();i++) {
Clerk temp=(Clerk)al.get(i);
System.out.println("名字="+temp.getName());
}
//如何从al中删除一个对象
al.remove(1);
System.out.println("=====删除吴用=====");
for(int i=0;i<al.size();i++) {
Clerk temp=(Clerk)al.get(i);
System.out.println("名字="+temp.getName());
}
}
}