Java语言基础-常用对象API(二)集合框架

基本数据类型对象包装类

为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为,丰富了
该对象的操作。用于描述该对象的类就称为基本数据类型的对象包装类。

基本类型(对应对象):byte-Byte、short-Short、int-Integer、long-Long、
float-Float、double-Double、char-Character、boolean-Boolean。

该包装对象主要用于基本类型字符串之间的转换
例:static int parseInt(String s) //将字符串参数作为有符号的十进制整数进行解析。

基本类型---->字符串
    1.基本数据类型+“”;
    2.用String类中的静态方法valueOf(基本数据类型);
    3.用Integer的静态方法valueOf();
字符串---->基本类型
    1.使用包装类中的方法 parseInt()、parseLong()、parseDouble()、
            Boolean.parseBoolean("booleanstring")等;
            只有Character没有parse方法;
    2.如果字符串被Integer进行了对象的封装,可以使用另一个非静态的方法
            intValue();

    整数具备不同的进制体现:
    十进制---->其他进制
        十进制---->二进制        Integer.toBinaryString();
        十进制---->八进制        Integer.toOctalString();
        十进制---->十六进制    Integer.toHexString();
        十进制---->任意进制    Integer.toString(int i,int radix);//返回用第二个参数指定基   
                                                                        数表示的第一个参数的字符串表示形式

    其他进制---->十进制
    parseInt(String s, int radix);//使用第二个参数指定的基数,将字符串参数解析为有
    符号的整数。

JDK1.5自动装箱拆箱
Integer i=4;//i=new Integer(4);自动装箱,简化书写
i=i+6;//i=new Integer(i.intValue()+6);自动拆箱,如果i=null,则出现异常

Integer a=new Integer(127);
Integer b=new Integer(127);
System.out.println(a==b);//false
System.out.println(a.equals(b));//true
       
Integer x=127;//jdk1.5以后,自动装箱,如果装箱的是一个字节,
Integer y=127;//那么该数据会被共享,不会重新开辟控件
System.out.println(x==y);//true,若x、y>127,则false
System.out.println(x.equals(y));//true

基本数据类型对象包装类练习:

package cn.itcast.p2.wrapper.demo;

import java.util.Arrays;

/*
 * 对一个字符串中的数值进行从小到大的排序
 * "20 78 9 -7 88 36 29"
 * 思路:
 * 1.排序
 * 2.如何获取到字符串中需要排序的数值?
 *     这个字符串中都是使用空格来对数值进行分割的,所以
 *     就想到用字符串对象的切割方法将大串变成多个小串;
 * 3.数值最终变成了小字符串,需要转换为int数值;
 *     字符串-->基本类型,使用包装类
 */
public class WrapperTest {
    private static final String SPACE_SEPARATOR=" ";
    /**
     * @param args
     */
    public static void main(String[] args) {
        String numStr = "20 78 9 -7 88 36 29";
        System.out.println(numStr);
        numStr = sortStringNumber(numStr);
        System.out.println(numStr);

    }

    public static String sortStringNumber(String numStr) {
        // 1.将字符串变成数组
        String[] str_arr = stringToArray(numStr);
        // 2.将字符串数组变成int数组
        int[] num_arr = toIntArray(str_arr);
        // 3.对int数组排序
        mySortArray(num_arr);
        // 4.将排序后的int数组变成字符串
        String temp = arrayToString(num_arr);
        return temp;
    }

    public static String arrayToString(int[] num_arr) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < num_arr.length; i++) {
            if (i != num_arr.length - 1)
                sb.append(num_arr[i] + SPACE_SEPARATOR);
            else
                sb.append(num_arr[i]);
        }
        return sb.toString();
    }

    public static void mySortArray(int[] num_arr) {
        Arrays.sort(num_arr);
    }

    public static int[] toIntArray(String[] str_arr) {
        int[] arr = new int[str_arr.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(str_arr[i]);
        }
        return arr;
    }

    public static String[] stringToArray(String numStr) {
        String[] str_arr = numStr.split(SPACE_SEPARATOR);
        return str_arr;
    }

}

集合框架
集合类
StringBuffer、StringBuilder最终必须转成字符串才可以使用。
集合类的由来
    对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定,就使用集合容器进行存储。
特点:
    1.用于存储对象的容器;
    2.集合的长度是可变的;
    3.集合中不可以存储基本数据类型值;

集合容器因为内部的数据结构不同,有多种具体容器。不断向上抽取,就形成了集合框架。框架的顶层是Collection接口。
Collection的常见功能:
1.添加
    boolean add(Object e) //确保此 collection 包含指定的元素(可选操作)。
    boolean addAll(Collection coll)//将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
2.删除
    boolean remove(Object o)//从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
    boolean removeAll(Collection coll)//移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
    void clear()//移除此 collection 中的所有元素(可选操作)。
3.判断
    boolean contains(Object o)//如果此 collection 包含指定的元素,则返回 true。
    boolean containsAll(Collection coll)//如果此 collection 包含指定 collection 中的所有元素,则返回 true。
    boolean isEmpty()//如果此 collection 不包含元素,则返回 true。
4.获取
    int size();//返回此 collection 中的元素数。
    Iterator<E> iterator();//返回在此 collection 的元素上进行迭代的迭代器。
    该对象必须依赖于具体的容器,因为每一个容器的数据结构都不同。所以该迭代器对象是在容器内部进行实现的。
    对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可。也就是iterator方法。
    Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
5.其他
    boolean retainAll(Collection coll)//仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 取交集
    Object[] toArray();//返回包含此 collection 中所有元素的数组。

迭代器使用示例:

package cn.itcast.p3.collection.demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class IteratorDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Collection coll = new ArrayList();

        coll.add("abc1");
        coll.add("abc2");
        coll.add("abc3");
        coll.add("abc4");
        System.out.println(coll);
        // 使用Collection中的Iterator()方法,调用集合中的迭代器方法,是为了获取集合中的迭代器对象
        
        // Iterator it=coll.iterator();
        // while(it.hasNext()){
        // System.out.println(it.next());
        // }
        
        for (Iterator it = coll.iterator(); it.hasNext();) {
            System.out.println(it.next());
        }

    }
}


常用的子接口
List和Set

List特点
public interface List<E>extends Collection<E>
1.有序的 collection(也称为序列),存取顺序一致;
2.元素都有索引;
3.存储的元素允许重复;
Set特点
1.元素不能重复;
2.无序(可能有序);

List特有的常见方法:
有一个共性特点:都可以操作角标。
1.添加
    void add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。
    boolean addAll(int index, Collection c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
2.删除
    Object remove(int index) 移除列表中指定位置的元素(可选操作)。
3.修改
    Object set(int index, Object element) 用指定元素替换列表中指定位置的元素(可选操作)。
4.获取
    Object get(int index) 返回列表中指定位置的元素。
    ※List特有的取出方式。

    int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
    int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
    List  subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图
List集合可以完成对元素的增删查改。
List使用示例:

package cn.itcast.p4.collection.demo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListDemo2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        List list = new ArrayList();
        // show(list);
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");

        ListIterator it = list.listIterator();// 获取列表迭代器对象
        // 它可以实现在迭代过程中完成对元素的增产查改
        // 注意:只有List集合具备该迭代功能
        while (it.hasNext()) {
            Object obj = it.next();
            if (obj.equals("abc2")) {
                it.set("abc9");
            }
        }
        // System.out.println("hasNext:"+it.hasNext());
        // System.out.println("hasPrevious:"+it.hasPrevious());

        while (it.hasPrevious()) {
            System.out.println("previous:" + it.previous());
        }
        System.out.println(list);

        /*
        // Iterator it = list.iterator();
        while (it.hasNext()) {
         Object obj = it.next();// java.util.ConcurrentModificationException
         // 迭代器迭代过程中,集合产生了操作。解决:使用迭代方法 //在迭代过程中,不要使用集合操作元素,容易出现异常
         // 可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作
         if (obj.equals("abc2")) {
         list.add("abc9");
         } else
         System.out.println("next:" + obj);
         }
         System.out.println(list);
            */
    }


List:
    |--Vector    内部是数组数据结构,是同步的(效率低)。增删、查询都很慢。
    |--ArrayList    内阻是数组数据结构,是不同步的(效率高)。替代了Vector。查询速度快。
    |--LinkedList    内部是链表数据结构,是不同步的。增删速度快。

Vector:
public interface Enumeration<E>
此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。

LinkedList:
void addFirst(E e) 将指定元素插入此列表的开头。
void addLast(E e)  将指定元素添加到此列表的结尾。
boolean offerFirst(E e) 在此列表的开头插入指定的元素。
boolean offerLast(E e) 在此列表末尾插入指定的元素。


E removeFirst() 移除并返回此列表的第一个元素。 如果没有元素则抛出异常(NoSuchElementException)。
E removeLast() 移除并返回此列表的最后一个元素。 如果没有元素则抛出异常(NoSuchElementException)。
E pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
E pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。

E getFirst() 获取但不移除此列表的第一个元素。 如果没有元素则抛出异常(NoSuchElementException)。
E getLast() 获取但不移除此列表的最后一个元素。如果没有元素则抛出异常(NoSuchElementException)。
E peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
E peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。

LinkedList练习示例:

package cn.itcast.p2.linkedlist.test;


/*
 * 请使用LinkedList来模拟一个堆栈或者队列数据结构
 * 堆栈:先进后出(FILO)
 * 
 * 队列:先进先出(FIFO)
 * 
 * 描述这样一个容器,给使用者提供一个容器对象,完成这两种结构。
 */


public class LinkdeTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        DuiLie dl=new DuiLie();
        dl.myAdd("abc1");
        dl.myAdd("abc2");
        dl.myAdd("abc3");
        dl.myAdd("abc4");
        
        while(!dl.isNull()){
            System.out.println(dl.myGet());
        }
    }

}
package cn.itcast.p2.linkedlist.test;

import java.util.LinkedList;

public class DuiLie{
    private LinkedList link;
    DuiLie(){
        link=new LinkedList();
    }
    /**
     * 队列的添加元素的方法
     * @param obj
     */
    public void myAdd(Object obj){
        link.addLast(obj);
    }
    public Object myGet(){
        return link.removeFirst();
    }
    public boolean isNull(){
        return link.isEmpty();
    }
}


ArrayList练习示例:

package cn.itcast.p.bean;

public class Person {

    private String name;
    private int age;
    
    public Person() {
        super();
        
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
}
package cn.itcast.p3.arraylist.test;

import java.util.ArrayList;
import java.util.Iterator;

import cn.itcast.p.bean.Person;

public class ArrayListTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ArrayList al = new ArrayList();
        al.add(new Person("lisi1", 21));
        al.add(new Person("lisi2", 22));
        al.add(new Person("lisi3", 23));
        al.add(new Person("lisi4", 24));

        Iterator it = al.iterator();
        while (it.hasNext()) {
            // System.out.println(((Person) it.next()).getName()+"::"+((Person)
            // it.next()).getAge());//会出现错误
            Person p = (Person) it.next();
            System.out.println(p.getName() + "::" + p.getAge());
        }
    }
}



ArrayList练习:

package cn.itcast.p3.arraylist.test;

import java.util.ArrayList;
import java.util.Iterator;

import cn.itcast.p.bean.Person;

/*
 * 定义功能去除ArrayList中的重复元素
 */
public class ArrayListTest2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // singleDemo();

        ArrayList al = new ArrayList();
        al.add(new Person("lisi1", 21));
        al.add(new Person("lisi2", 22));
        al.add(new Person("lisi3", 23));
        al.add(new Person("lisi4", 24));
        al.add(new Person("lisi2", 22));
        al.add(new Person("lisi3", 23));
        System.out.println(al);

        al = getSingleElement(al);
        System.out.println(al);
    }

    public static ArrayList getSingleElement_2(ArrayList al) {
        // 1.定义一个临时容器
        ArrayList temp = new ArrayList();

        // 2.迭代al集合
        Iterator it = al.iterator();
        while (it.hasNext()) {
            Object obj = it.next();
            // 3.判断被迭代到的元素是否存在于临时容器中
            if (!(temp.contains(obj))) {
                temp.add(obj);
            }
        }
        return temp;
    }

    /**
     * 
     */
    private static void singleDemo() {
        ArrayList al = new ArrayList();
        al.add("abc1");
        al.add("abc2");
        al.add("abc2");
        al.add("abc1");
        al.add("abc");
        System.out.println(al);

        al = getSingleElement(al);
        System.out.println(al);
    }

    public static ArrayList getSingleElement(ArrayList al) {
        // 1.定义一个临时容器
        ArrayList temp = new ArrayList();

        // 2.迭代al集合
        Iterator it = al.iterator();
        while (it.hasNext()) {
            Object obj = it.next();
            // 3.判断被迭代到的元素是否存在于临时容器中
            if (!(temp.contains(obj))) {
                temp.add(obj);
            }
        }
        return temp;
    }

}
package cn.itcast.p.bean;

public class Person {

    private String name;
    private int age;

    public Person() {
        super();

    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object obj) {
        if(this==obj)
            return true;
        if(!(obj instanceof Person))
            throw new ClassCastException("类型错误");
//        System.out.println(this+"...equals..."+obj);
        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public String toString(){
        return name+":"+age;
    }

}


判断元素是否重复:
ArrayList使用equals,HashSet使用hashCode和equals

Set:元素不能重复,是无序的。
    Set接口中的方法与Collection一致。
    |--HashSet        内部数据结构是哈希表,是不同步的。
    |--TreeSet       

哈希表确定元素是否相同
1.判断的是两个元素的哈希值是否相同;
        如果相同,再判断两个对象的内容是否相同。
2.判断哈希值相同,其实判断的是对象的hashCode方法;
        判断内容相同,用的是equals方法。
注意:如果哈希值不同,不需要判断equals方法。

HashSet示例:

package cn.itcast.p4.hashset.test;

import java.util.HashSet;
import java.util.Iterator;

import cn.itcast.p.bean.Person;

/*
 * 在hashSet集合中存储Person对象,如果姓名和年龄相同,视为同一个人,视为相同元素
 */
public class HashSetTest {

    /**
     * @param args
     */
    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));
        hs.add(new Person("lisi9",29));
        hs.add(new Person("lisi7",27));//对象地址不同,系统认为是不同的对象(Object的equals比较地址)
                                        //需重写hashCode和equals
        
        /*
         * HashSet集合数据结构是哈希表,所以存储元素的时候,
         * 使用的元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来确定是否相同
         * 
         */
        Iterator it=hs.iterator();
        while(it.hasNext()){
            Person p=(Person)it.next();
            System.out.println(p.getName()+"..."+p.getAge());
        }
    }

}
package cn.itcast.p.bean;

public class Person {

    private String name;
    private int age;

    public Person() {
        super();

    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @Override
    public int hashCode() {
//        System.out.println(this+"...hashCode");
        return name.hashCode() + age*39;//age*39 保证哈希值的唯一,避免使用equals进行比较
    }

    @Override
    public boolean equals(Object obj) {
        if(this==obj)
            return true;
        if(!(obj instanceof Person))
            throw new ClassCastException("类型错误");
//        System.out.println(this+"...equals..."+obj);
        Person p = (Person) obj;
        return this.name.equals(p.name) && this.age == p.age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public String toString(){
        return name+":"+age;
    }

}


LinkedHashSet:具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。
        HashSet hs=new LinkedHashSet();

TreeSet:
基于 TreeMap 的 NavigableSet 实现。
可以对Set集合中的元素,使用自然顺序对元素进行排序。
判断元素唯一性的方式,就是根据比较方法CompareTo的返回结果是否是0。是0,则认为是相同元素,不存储。
TreeSet集合对元素进行排序的方式一:
让元素自身具备比较功能,元素需要实现Comparable接口,覆盖CompareTo方法;

如果不按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序,可以使用TreeSet集合的第二种排序方式:
让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。将该类对象作为参数,传递给TreeSet集合的构造函数。
示例:

package cn.itcast.p5.treeset.demo;

import java.util.Iterator;
import java.util.TreeSet;

import cn.itcast.p.bean.Person;

public class TreeSetDemo {
    public static void main(String[] args) {
//        demo1();
        
        /*
         * 以Preson对象的年龄,进行从小到大的排序
         */
        TreeSet ts=new TreeSet(new ComparatorByName());//不使用默认比较方式,则定义比较器
        ts.add(new Person("zhangsan",29));
        ts.add(new Person("wangwu",23));
        ts.add(new Person("lisi",21));
        ts.add(new Person("zhouqi",29));
        ts.add(new Person("zhaoliu",25));
        
        Iterator it=ts.iterator();
        while(it.hasNext()){
            Person p=(Person)it.next();
            System.out.println(p.getName()+":"+p.getAge());
        }
    }
}
package cn.itcast.p5.treeset.demo;

import java.util.Comparator;

import cn.itcast.p.bean.Person;

/**
 * 创建以Person对象年龄进行从小到大的排序
 * @author chenchong
 *
 */
public class ComparatorByName implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        Person p1=(Person)o1;
        Person p2=(Person)o2;
        
        int temp=p1.getName().compareTo(p2.getName());
        
        return temp==0?p1.getAge()-p2.getAge():temp;
    }

}


TreeSet练习:

package cn.itcast.p5.treeset.test;

import java.util.Iterator;
import java.util.TreeSet;

import cn.itcast.p5.comparator.ComparatorByLength;
/*
 * 对字符串进行按长度排序
 */
public class TreeSetTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TreeSet ts = new TreeSet(new ComparatorByLength());
        ts.add("aaaaa");
        ts.add("zz");
        ts.add("nbaq");
        ts.add("cba");
        ts.add("abc");

        Iterator it = ts.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

}
package cn.itcast.p5.comparator;

import java.util.Comparator;

public class ComparatorByLength implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        String s1=(String)o1;
        String s2=(String)o2;
        
        int temp=s1.length()-s2.length();
        return temp==0?s1.compareTo(s2):temp;//在长度相同时,按元素排序
    }

    
}

posted on 2012-08-02 11:29  foolchen  阅读(426)  评论(0编辑  收藏  举报

导航