黑马程序员—java技术blog—第四篇:List和Set的总结

来源:互联网 发布:淘宝刀创 编辑:程序博客网 时间:2024/06/02 05:03

---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

一、List

 1.List的特点:

   List:有序(存入和取出的顺序一致,元素都有索引,元素可以重复)。

   List:特有的常见方法:有一个共性特点就是可以操作角标。

2.List类的常用方法:

List list=new ArrayList();

1.添加

void add(index,element);

list.add(1,"dad");

2.删除

 Object remove(index);

 list.remove(1;

(3).修改元素q

 Object set(index,element);

(4).获取:

 Object get(index);

 list.get(1;

 int indexOf(object);

 list.indexOf("dad");

 List subList(from,to);

 list.subList(0,2);

(5).List的取出元素的方法:

用都有的iterator方法:

Iterator it=coll.iterator();

while(it.hasNext()){

 System.out.println(it.next());

}

list特有的取出方法元素的方式之一:

for(int i=0;i<list.size();i++){

    System.out.println("get:"+list.get(i));

}

注意:

在迭代器过程中,不要使用集合操作元素,容易出现异常。可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。

ListIterator it=list.listIterator();//获取列表迭代器对象

//它可以实现在迭代过程中完成对元素的增删改查。

//只有list集合具备该迭代功能。

while(it.hasNext()){

 Object obj=it.next();

 if(obj.equals("add")){

   list.set("ddaf");

}

hasPrevious();//逆序

3.List:常用的子类对象

--Vector:内部是数组结构,是同步的。增删,查询都很慢。

Vector v=new Vector;

Enumeration en=v.elements();

//Enumeration接口与Iterator功能重复优先使用Iterator

While(en.hasMoreElements()){

System.out.prrintln("nextelment:"+en.nextElement());

}/

--ArrayList:内部是数组结构,不是同步的。替代Vector。查询的速度快。。

--LinkedList:内部是链表数据结构。增删元素非常快。

二、Set

1.Set的特点:

Set:元素不能重复,无序。

Set接口的方法和Collection一样。

2.常用子类:

(1)--HashSet:内部数据结构是哈希表,不是同步的。

哈希算法,用哈希算法对元素进行存储,并获取其位置。

查找时用哈希算法先算其位置。

//自定义哈希算法

哈希查找:先用哈希算法判断哈希值,哈希值相同在判断内容。

判断哈希值相同,其实判断的是对象的hashCode的方法,

判断内容相同,用的是equals方法。

HashSet存储

//HashSet集合中存储Person对象。

如果姓名和年龄相同视为同元素。

//需要重写Person类中的hashCode()方法

  public class HashSetTest{

  public static void main(String[] args){

  HashSet hs=new HashSet();

  hs.add(new Person("lisi4",24));

  hs.add(new Person("lisi7",27));

  hs.add(new Person("lisi1",21));

  Iterator it=hs.iterator();

   while(it.hasNext()){

//System.out.println(((Person)it.next()).getName());

//System.out.println(((Person)it.next()).getAge());

//不要在一个循环里用两个.next()方法 容易出现异常

  Person p=(Person)it.next();

  System.out.println(p.getName()+p.getAge());

}

}

}

 记住:如果元素存储到HashSet集合中,必须覆盖hashCode方法和equals方法。

一般情况下,如果定义的类会产生很大对象。比如人 ,

学生,书,都需要equalshashCode方法。

建立判断是否是相同的依据。

 

(2)TreeSet:可以对Set集合的元素进行排序。是不同步的。

判断元素的唯一性的方式:就是根据比较方法的返回结果

是否是0,是0,就是相同元素,不存。

//存入学员信息,根据年龄排序

 public class TreeSetTest{

 pubic static void main(String[] args){

  TreeSet hs=new TreeSet();

  hs.add(new Person("lisi4",24));

  hs.add(new Person("lisi7",27));

  hs.add(new Person("lisi1",21));

  Iterator it=hs.iterator();

   while(it.hasNext()){

//System.out.println(((Person)it.next()).getName());

//System.out.println(((Person)it.next()).getAge());//不要在一个循环里用两个.next()方法 容易出现异常

  Person p=(Person)it.next();

  System.out.println(p.getName()+p.getAge());

}

}

}

需要Person 实现Comparable接口中的compareTo()方法

public int compareTo(Object obj){

 Person p=(Person) obj;

 int temp=this.age-p.age;

return (temp==0)?this.name.compareTo(p.name):temp;

 

}

这段代码中

按照Person类的排序叫做自然排序。(就是按照实例化的那个对象排序调用实体化类的排序方法)

排序:

让元素自身具备比较功能,元素需要实现Comparable接口,覆盖compareTo方法

 

如果不要按照对象中具备的自然顺序排序或者对象不具备自然排序?

可以使用TreeSet集合的第二种排序方式:

让集合具备比较功能。定义一个类实现Comparator接口,覆盖compare方法。

将该类对象作为参数传递给TreeSet集合的构造函数。

可以先创建一个比较器,在创建集合对象时调用比较器,这样在添加时就会调用比较器的方法。

 

题:对字符串长度排序。

代码:

import java.util.Iterator;

import java.util.TreeSet;

import java.util.Comparator;

public class ComparatorByLength implements Comparator {

@Override

public int compare(Object o1, Object o2) {

// TODO 自动生成的方法存根

String str1=(String)o1;

String str2=(String)o2;

if(str1.length()<str2.length()){

return -1;

}

else if(str1.length()==str2.length())

{

  if(str1.equals(str2)){

     return 0;

  }

  else return 1;

}

  else return 1;

}

 

}

public class Test {

public static void main(String[] args) {

// TODO 自动生成的方法存根

        TreeSet hs=new TreeSet(new ComparatorByLength());

        hs.add("ddjjd");

        hs.add("dd");

        hs.add("djd");

        hs.add("d");

        Iterator it=hs.iterator();

        while(it.hasNext()){

         System.out.println(it.next()); 

        }  //d

}   //dd

}        //djd

        // ddjjd

----- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>

 

0 0
原创粉丝点击