java集合框架

关于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);

  }

 }

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值