关于java中的集合框架,今天就根据平时用的最多的,总结一下
一、概念
集合的两大根接口Collection和Map,其中Collection接口中比较常用的是Vector、List和Set,Map中最常用的就是HashMap和TreeMap;
List中又有ArrayList和LinkedList;Set中有HashSet、TreeSet
二、接口说明
1)List:list集合区分元素的顺序,且允许包含重复元素,有先后顺序的集合,同时所有的list集合中可以有null元素
Vector:是基于Array的list,即使使用变长数组算法实现的list,是同步的,线程安全可以直接用于多线程中
ArrayList:arrayList是跟Vector基本相同,唯一的区别就是ArrayList是不同步的,线程不安全的,只能用于单线程,用于多线程中需要自己写同步方法。相比Vector,ArrayList因为非同步而更高效
LinkedList:采用的是双向循环列表来实现的list,它每一个节点都包含三方面的内容,一方面是本身的数据data,一方面是下一个节点的信息nextNode,另一方就是上一个节点lastNode;所以当对LinkedList做添加、删除等动作的时候,只需要更好nextNode的相关信息就可以,而不用向ArrayList一样需要移动大量的数据。
List总结:
1、所有的List中只能容纳单个不同类型的对象组成的表
2、list可以有相同元素
3、list中可以允许有null值
4、对于ArrayList和LinkedList,ArrayList适合查询,LinkedList适合添加和删除操作
5、List有循序,以元素安插的次序来放置元素,不会重新排列
2)Set:描述了无序不重复的数学集合;Set中不允许重复,使用自己内部的一个排列机制(很多人不明白为什么Set中不允许有重复项,因为List基本上是以Array为基础,但是Set则是在Map的基础上实现的,其存储的方式是把Map中的Key作为Set的对应项来存储的,因为Key是不允许重复的,所以Set中不允许重复)
Set的add(Object obj)方法:
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
HashSet:使用散列表实现的Set集合,依靠HashMap来实现,应该要为存放到散列表的各个对象定义hashCode()和equals()方法;
TreeSet:使用排序二叉树来实现的set集合,依靠TreeMap来实现,TreeSet是一个有序集合,其中的元素按照升序排列
Set总结:
1、Set实现的基础是Map
2、Set中不能有重复的元素
3、HashSet是基于Hash算法实现的,其性能通常由于TreeSet,通常使用HashSet,在需要排序功能时,才使用TreeSet
3)Map:存储的是Key-Value键值对,不能包含重复的Key,但是允许有重复的Value,其中HashTable所有的键必须非空,而HaspMap可以允许键值为空
三、常用方法
集合实现类:
ArrayList:常用的方法:
public void method(){
ArrayList list = new ArrayList();
list.add("a");//添加数据
list.add("b");
list.add("c");
System.out.println(list);//输出结果为[a,b,c]
String s = list.remove(0);//移除下标为0的数据,返回的是移除的数据本身remove(index)
System.out.println(list);//输出结果为[b,c]
list.remove("b");//移除第一个找到的元素
list.add("a");
list.add("b");
list.set(0,"e");
System.out.println(list);//输出结果为[e,a,b]
int i = list.indexOf("a");//输出结果为1,获得指定元素的下标
String str = list.get(1);//输出结果为a,获得的是指定下标的元素
Object[] obj= list.toArray();//将集合转换成数组
ArrayList l = Arrays.asList(obj);//将数组转换成集合
}
LinkedList:常用方法
void addFirst(Object o)
void addLast(Object o)
Object getFirst()
Object getLast()
Object remove( int index)
boolean remove(Object o)
Object removeFirst()
Object removeLast()
LinkedList同时继承了一个isEmpty方法,如果没有包含任何元素就返回true,否则就返回false
public void method(){
LinkedList list = new LinkedList();
if(list.isEmpty()){
System.out.println("true");
}
}
对于HashSet和treeSet,最常用的就是排序方法:实现排序方法有两种,一种是外部定义,实现Comparator接口,实现compare(Object o,Object b)方法;一种是内部定义,实现Comparable接口,实现compareTo(Object o )方法
示例:
1)实现comparator接口
public class Foo{
private int num;
public int getNum(){
return num;
}
public int setNum(int num){
this.num = num ;
}
public String toString(){
return "foo:"+this.getNum()+"," ;
}
}
自己实现比较器:
public class MyComparator implements Comparator{
public int compara(Foo foo1,Foo foo2){
if(foo1.getNum()>foo2.getNum()){
return 1 ;
}else if(foo1.getNum() == foo2.getNum()){
return 0 ;
}else{
return -1 ;
}
}
}
使用该种方法的时候 new TreeSet()的时候需要指定比较器
TreeSet<Foo> set = new TreeSet(new MyComparator());这样在set.add()的时候元素就会根据自己定义的比较器进行排序了
2)实现comparable接口
public class Foo implements Comparable{
private int num;
public int getNum(){
return num;
}
public int setNum(int num){
this.num = num ;
}
public String toString(){
return "foo:"+this.getNum()+"," ;
}
public int compareTo(Object o){
if(o instanceof Foo){
Foo foo = (Foo)o;
if(this.num > foo.getNum){
return 1 ;
}else if(this.num == foo.getNum()){
return 0 ;
}else{
return -1 ;
}
}
return 0 ;
}
}
TreeSet<Foo> set = new TreeSet();
使用这种方法的时候就不需要指定比较器,在执行的时候集合就会自动根据been中的compareTo()方法中的方式进行排序
四、对list和Map的常用遍历方法
对list的4中遍历方法
publicstatic void main(String args[]){
List<String> list = new ArrayList<String>();
list.add("luojiahui");
list.add("luojiafeng");
//方法1
Iterator it1 = list.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
//方法2
for(Iterator it2 = list.iterator();it2.hasNext();){
System.out.println(it2.next());
}
//方法3
for(String tmp:list){
System.out.println(tmp);
}
//方法4
for(int i = 0;i < list.size(); i ++){
System.out.println(list.get(i));
}
}
}
对map的4中遍历方法
public static void main(String[] args) {
Map<String,String> map = new HashMap<String, String>();
map.put("1","value1");
map.put("2","value2");
map.put("3","value3");
//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key :map.keySet()) {
System.out.println("key= "+ key + " and value= " +map.get(key));
}
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it =map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String,String> entry = it.next();
System.out.println("key= " + entry.getKey() + " andvalue= " + entry.getValue());
}
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for(Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " andvalue= " + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v :map.values()) {
System.out.println("value= " + v);
}
}