黑马程序员——Java基础——集合类Collection

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

集合类 Collection:是对 对象 进行存储。
要访问集合类中的元素,可以通过迭代器 Iterator
一般的格式是: Iterator it = 对象名 . iterator ( )
元素的取出方式定义在集合的内部,定义成内部类,因为这样可以直接访问集体合内部的元素。然后通过对外提供的 iterator 方法获得迭代器对象。
集合共性抽取:Iterator 接口
对外提供方法:iterator ( )
迭代主要用到两方法:hasNext( ) 用于判断有没下一个元素
next ( ) 返回下一个元素

集合分为两种: List 和 Set 。
List:元素是有序的,元素可以重复,集合体系有索引。
List集合判断元素是否相同,依据是 equals 方法。
Set:元素是无序的,元素不能重复。

先说第一种集合 List :
List的特有方法:操作角标的方法都是它的特有方法。
add ( index , element ) 、 addAll ( index , Collection )
remove ( index ) 、set ( index , element ) 、get ( index )
subList ( from , to ) 、listIterator( )

List 集合有特有的迭代器:ListIterator ,它是 Iterator 的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素,这样会发生异常。所以,在迭代时,只能用迭代器的方法来操作元素。Iterator 里的方法比较有限,ListIterator 就是一个很好的选择,它里面的方法比较我,增删改查都会操作,比较方便。
格式:ListIterator it = 对象名 . listIterator ( )

List集合比较常见的类有以下几个:

1、ArrayList : 它的数据结构为数组结构,查询速度快,但是增删稍慢。

2、LinkedList :底层使用链表数据结构,增删速度很快,但查询稍慢。
LinkedList 特有方法:
addFirst ( ) 、addLast ( ) 、 getFirst ( ) 、getLast ( ) 、
removeFirst ( ) 、 removeLast ( ) (注意,这两个是获取元素,并删除元素)
集合中如果没有元素,调用上面的方法,程序会抛出异常。

JDK1.6版本后出现了替代方法:
offerFirst( ) 、 offerLast ( ) 、peekFirst ( ) 、 peekLast ( )、
pollFirst ( ) 、 pollLast ( )
集合中如果没有元素,调用这几个方法,程序不会抛出异常,只会返回null

3、Vector :数据结构也是数组结构,它不同的地方是线程同步,比较安全。已经被ArrayList替代了。

第二种集合:Set
常见的Set集合的类有以下几种:
1、HashSet:底层数据结构是哈希表,线程非同步。
HashSet是如何保证元素唯一性呢?
是通过元素的两个方法:hashCode 和 equals 方法。
如果元素的 hashCode 值相同,才会判断 equals 是否为true ,
但如果元素的 hashCode 值不同,那么就不会调用 equals 方法了。

所以, 一般存储自定义对象,都会复写 hashCode 和 equals 方法。
例子代码如下:

import java.util.*;
public class SetList {
    public static void main(String[] args){
        HashSet a=new HashSet();
        a.add(new Person("java02",12));
        a.add(new Person("java01",11));
        a.add(new Person("java03",12));
        a.add(new Person("java01",11));

        Person p;
        Iterator it=a.iterator();
        while(it.hasNext()){
            p=(Person)(it.next());
            System.out.println(p.name);
        }
    }
}

class Person{
     String name;
    private int age;
    Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    public int hashCode(){
        System.out.println(this.name+".....判断hashCode....."+this.age);
        return name.hashCode();
    }

    public boolean equals(Object obj){
        System.out.println(this.name+"......判断equals....."+this.age);
        if(obj instanceof Person){
            Person p=(Person)obj;
            return this.age==p.age;
        }
        return super.equals(obj);
    }   
}

2、TreeSet :可以对Set集合中的元素进行排序。
它的底层数据结构是二叉树,二叉树减少比较次数。

TreeSet排序的第一种方式:
让自身具备比较性,元素需要实现 comparable 接口,覆盖 compareTo 方法,这种方法也成为元素的自然排序,或者叫默认排序。
例子如下:

import java.util.*;
public class TreeSetTest {
    public static void main(String[] args){
        TreeSet ts=new TreeSet();
        ts.add(new man("小明",36));
        ts.add(new man("小丽",24));
        ts.add(new man("东东",36));
        ts.add(new man("王五",28));

        Iterator it=ts.iterator();
        while(it.hasNext()){
            man m=(man)it.next();
            System.out.println(m.getName()+"....."+m.getAge());
        }
    }
}

class man implements Comparable{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    man(String name, int age){
        this.name=name;
        this.age=age;
    }

    public int compareTo(Object obj){
        if(!(obj instanceof man)){
            throw new RuntimeException("不是学生对象");
        }
        man m=(man)obj;
        if(this.age>m.age){
            return 1;
        }
        if(this.age==m.age){
            return this.name.compareTo(m.name);
        }
        return -1;
    }
}

第二种方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。
例子如下:

import java.util.*;
public class TreeSetTest2 {
    public static void main(String[] args){
        TreeSet ts=new TreeSet(new Comp());
        ts.add(new Woman("花朵",20));
        ts.add(new Woman("丽丽",22));
        ts.add(new Woman("兰儿",18));
        ts.add(new Woman("少玲",22));

        Iterator it=ts.iterator();
        while(it.hasNext()){
            Woman w=(Woman)it.next();
            System.out.println(w.getName()+"------"+w.getAge());
        }
    }
}

class Woman{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    Woman(String name,int age){
        this.name=name;
        this.age=age;
    }
}

class Comp implements Comparator{
    public int compare(Object obj,Object obj2){
        if(!(obj instanceof Woman)&&!(obj instanceof Woman)){
            throw new RuntimeException();
        }
        Woman w=(Woman)obj;
        Woman w2=(Woman)obj2;       
        int num=new Integer(w.getAge()).compareTo(new Integer(w2.getAge()));
        if(num==0){
            return w.getName().compareTo(w2.getName());
        }
        return num;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值