首页 > 代码库 > 黑马程序员——Java集合基础知识之Collection

黑马程序员——Java集合基础知识之Collection

集合基础知识——Collection
Java中集合框架由常用的Collection接口和Map接口组成,而Collection接口又有两个子接口,是List接口和Set接口,常用的集合框架由这三个类组成。
 
List接口的功能方法
List的使用最为简单,创建集合,通过add方法添加元素,get方法获取元素,通过迭代器获取元素。List接口存放的数据无序的,添加速度快,但是查询速度慢,因为查询的时候必须遍历,每次都重头开始,效率较低。常用实现类有ArrayList,LinkedList。
List list =new ArrayList();
//添加元素
list.add ("李白");
list.add ("李白");
list.add ("苏轼");
list.add ("李清照");
System.out .println (list.size()) ;//查询元素个数。4个
System.out .println (list.contains( "白居易"));//查询是否含有元素“白居易”,返回false
list.remove (0) ;//删除0号元素
list.indexOf ("陆游") ;//查询元素的位置,若找不到返回-1;
for(int i0ilistsize();i++){
          String str=(String )list.get( i);//必须强制类型转换
          System .out.println( listget(i ));
}
//用迭代去取元素
Iterator it =list .iterator ();
while(it .hasNext ()){
          String name =( String)it .next ()//必须强制类型转换
          System .out.println( "诗人"+name );
}
list.clear ()//清空集合
System.out .println (list.size()) ;
 
Set和存储顺序
     存入Set的元素必须是唯一的,Set并不会保证元素不会重复,Set必须改写equals方法以确保元素的唯一性。Set需要一种方式来维护顺序,不同的Set类型会有不同的实现。
     HashSet是为了快速查找而设计的Set,存入HashSet的元素必须实现hashCode。如果我们没有实现hashCode也能通过,并且没有运行错误,但是那样的话会违背Set的原则,因为它会使用默认的hashCode方法,这是合法的,尽管他是不正确的。
     TreeSet可以实现元素的自然排序,但是前提是你会正确地实现Comparator或者对象本身具有你想要的比较方式。
     @Override
           public int hashCode () {
                    final int prime 31;
                    int result = 1;
                   result = prime * result + Score;
                   result = prime * result + (( name == null ) ? 0 : namehashCode ());
                    return result;
           }
           @Override
           public boolean equals (Object obj ) {
                    if ( this == obj)
                              return true ;
                    if ( obj == null)
                              return false ;
                    if ( getClass () != obj .getClass ())
                              return false ;
                   Poet other = ( Poet) obj;
                    if ( Score != other. Score)
                              return false ;
                    if ( name == null ) {
                              if ( othername != null )
                                       return false ;
                    } else if (nameequals (other .name ))
                              return false ;
                    return true ;
           }
 
          String name;
           int Score ;
           public int compareTo (Object o ) {
                    // TODO Auto-generated method stub
                    if (! (instanceof Poet)) Systemoutprintln ("不合法输入" );
                   Poet po =( Poet )o ;
                    return this .Score > poScore1:
                              ( this. Score== po. Score? this. name. compareTo( poname ):- 1) ;
           }
}
//往HashSet和TreeSet中添加已经实现了hashCode,equals和comparaTo的对象。
                    //添加相同的对象
Set hs = new HashSet() ;
Set ts = new TreeSet() ;
Poet p1 =new Poet ("李清照" ,25 );
Poet p2 =new Poet ("李清照" ,25 );
Poet p3 =new Poet ("苏轼" ,25 );
Poet p4 =new Poet ("苏轼" ,24 );
Poet p5 =new Poet ("苏轼" ,23 );
//打印结果
/*[苏轼, Score=25, 苏轼, Score=24, 苏轼, Score=23, 李清照, Score=25]
[苏轼, Score=23, 苏轼, Score=24, 李清照, Score=25, 苏轼, Score=25]*//
  HashSet和TreeSet都剔除了相同的元素,HashSet是调用hashCode和equals方法完成的,而TreeSet是调用对象的comparaTo的方法完成的。TreeSet按照得分的大小从小到大排序,而HashSet没有这样的自然比较顺序。
Set的取出元素
Set没有取出get();的方法,所以只能用该机for循环或者迭代器Iterato来获取元素。Iterator有三个方法,iterator()得到迭代器,hashnext()判断下一个元素是否存在,next()取出一个元素并将脚标往下移一位。
Iterator it =ts .iterator ()//获取迭代器
while (it .hasNext ()){ //判断下一个元素是否存在
Poet po =( Poet )it .next ()      //取出下一个元素
          System . out. println( po );
}