Java基础——集合

1、总述
集合类的由来:
对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定就使用集合容器进行存储。

集合特点:
1、用于存储对象的容器
2、集合的长度是可变的
3、集合中不可以存储基本数据类型值

集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架。

这里写图片描述

2、框架的顶层Collection接口(其他继承Collection集合类都具有以下方法)

1、添加
boolean add(Object obj);
boolean addAll(Collection coll);

2、删除
boolean remove(Object obj);
boolean removeAll(Collection coll);
void clear();

3、判断:
boolean contains(Object obj);
boolean containsAll(Collection coll);
boolean isEmpty();判断集合中是否有元素

4、获取
int size();
Iterator iterator():取出元素的方式:迭代器
该对象必须依赖于具体容器,因为每一个容器的数据结构不同,所以该迭代器对象是在容器内部实现的。
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。
iterator接口就是对所有的Collection容器进行元素取出的公共接口。

5、其他:
boolean retainAll(Collection coll);取交集
Object[] toArray():将集合转成数组

3、继承Collection的子类有List和Set

collection
|—list:有序(存入与取出的顺序一致),元素都有索引,元素可以重复。
|—set:元素不能重复,无序。

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

1、添加
void add(index,element)
void add(index,collection)
2、删除
object remove(index)
3、修改
object set(index,element)
4、获取
object get(index)
int indexOf(object )
int lastIndexOf(object)
List subList(from,to)
list集合是可以对元素的增删改查

List又分为:
|–Vector:内部是数组数据结构,是同步的。增删查询都很慢
|–ArrayList:内部是数组数据结构,是不同步的。替代了Vector(效率高)。查询速度非常快
|–LinkedList:内部是链表数据结构,是不同步的。增删元素的速度非常快。

LinkedList:
addFirst()
addLast()
jdk1.6
offerFirst()
offerLast()

getFirst()//获取但不移除,如果链表为空,抛出NoSuchElementException异常
getLast()
jdk1.6
peekFirst()//获取但不移除,如果链表为空,返回null
peekLast()

removeFirst()//获取并移除,如果链表为空,抛出NoSuchElementException异常
removeLast()
jdk1.6
pollFirst()//获取并移除,如果链表为空,返回null
pollLast()

3.2 Set
Set:元素不可以重复,是无序的。
Set接口中的方法和Collection方法是一致的
Set
|—HashSet:内部数据结构是哈希表,是不同步的
哈希表确定元素是否相同:
1、判断的是两个元素的哈希值是否相同
如果相同,再判断两个对象的内容是否相同
2、判断哈希值相同,其实判断的是对象的hashCode的方法。
判断内容相同用的是equals方法
注意:如果哈希值不同,是不需要判断equals。
|—TreeSet:可以对Set集合中的元素进行排序,不同步的。
判断元素唯一性的方式:就是根据比较方法的返回结果
TreeSet对元素进行排序的方式一:
让元素自身具备比较功能,元素需要实现Comparable接口。覆盖compareTo方法。

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

4、泛型
泛型:
jdk1.5出现的安全机制
好处:
1、将运行时期的问题ClassCastException转到了编译时期
2、避免了强制转换的麻烦
<>:什么时候用?
当操作的引用数据类型不确定的时候,就使用<>.将要操作的引用数据类型传入即可。
其实<>就是一个用于接收具体引用数据类型的参数范围。

在程序中,只要用到了带有<>的类或接口,就要明确传入的具体引用数据类型(不能是基本数据类型),如果没有<>默认就是Object类型,也就是在后面需要强转。

泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全。
运行时会将泛型去掉,生成的class文件中是不带泛型的这个称为泛型的擦除。
为什么擦除呢?因为为了兼容运行的类加载器。

泛型的补偿:在运行时,通过获取元素的类型进行转换动作,不用使用者再强制转换了。

泛型的通配符格式:?未知类型

5、集合总结
集合的一些技巧:
需要唯一吗?
需要:Set
需要制定顺序:
需要:TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList

前缀名就是该集合的数据结构,后缀名就是该集合所属的体系。
看到array:就要想到数组,就要想到查询快,有角标。
看到link:就要想到链表,就要想到增删快,就要想到add get remove+first last的方法。
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashCode方法和equals方法。
看到tree:就要想到二叉树,就想要排序,就要想到两个接口Comparable,Comparator。
而且通常这些常用的集合容器都是不同步的。

6、Map
Map:一次添加一对元素。Collection一次添加一个元素。
Map也称为双列集合,Collection称为单列集合。
其实Map集合中存储的就是键值对。
map集合必须保证键的唯一性

6.1Map常用的方法
常用方法:
1、添加
value put(key,value):返回前一个和key关联的值,如果没有返回null

2、删除
value remove():根据指定的key翻出这个键值对
value clear():清空map集合
3、判断
boolean containsKey(key)
boolean containsValue(value)
boolean isEmpty()
4、获取
value get(key):通过键获取值,如果没有该键返回null
当然可以通过返回null,来判断是否包含指定键
int size():获取键值对的个数

6.2 Map子类
Map常用的子类:
|—Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值
|—Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合
|—HashMap:内部结构是哈希表,不是同步的。允许null作为键,null作为值
|—TreeMap:内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序

7.代码示例

7.1基本数据类型对象

package cn.itcast.p2.wrapper.demo;

public class WrapperDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * 
         * 基本数据类型对象包装类
         * 为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了
         * 属性和行为丰富了该数据的操作。
         * 用于描述该对象的类就称为基本数据类型对象包装类
         * 
         * 
         * byte     Byte
         * short    Short
         * int      Integer
         * long     Long
         * float    Float
         * double   Double
         * char     Character
         * boolean  Boolean
         * 
         * 
         * 该包装对象主要用基本类型和字符串之间的转换
         * 
         * 基本类型---》字符串
         *      1、基本类型数值+""
         *      2、用String类中的静态方法valueOf(基本类型数值)
         *      3、用Integer中的静态方法valueOf(基本类型数值)
         * 
         * 字符串---》基本类型
         *      1、使用包装类中的静态方法 xxx parseXxx("xxx类型的字符串");其中xxx代表8中具体类型
         *          例如:Long.parseLong("longstring"),只有Character没有parse方法
         *      2、如果字符串被Integer进行对象的封装
         *          可使用另一个非静态的方法,intValue();将一个Integer对象转成基本数据类型值
         * 
        * */
        int num=4;
        System.out.println(Integer.MAX_VALUE);//获取int类型的最大值
        System.out.println(Integer.toBinaryString(6));//进制转换

        Integer i=new Integer(num);//将基本数据类型转换成对象
        System.out.println(Integer.parseInt("123")+1);//将字符串转成数字

        Integer dig =new Integer("123");
        System.out.println(dig.intValue());//非静态方法将字符串转成

        /*
         * 整数具备不同的进制体现:
         * 
         * 十进制-->其他进制
         * 
         * 其他进制-->十进制
         * 
         * 
         * */
//      十进制-->其他进制
        System.out.println(Integer.toBinaryString(60));//将10进制转成2进制
        System.out.println(Integer.toOctalString(60));//将10进制转成8进制
        System.out.println(Integer.toHexString(60));//将10进制转成16进制

        System.out.println(Integer.toString(60,2));//将2进制转成10进制
        System.out.println(Integer.toString(60,8));//将8进制转成10进制
        System.out.println(Integer.toString(60,16));//将16进制转成10进制
//      十进制-->其他进制
        System.out.println(Integer.parseInt("110",2));//将字符串从2进制转成10进制
//      自动拆箱
        Integer a=new Integer("3");
        Integer b=new Integer(3);

        System.out.println(a==b);//结果为:false
        System.out.println(a.equals(b));//结果为:true 自动拆箱
        System.out.println(a.compareTo(b));//相等返回结果0

    }

}
package cn.itcast.p2.wrapper.demo;

public class WrapperDemo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int num=4;
        Integer i=4;//i=new Integer(4);自动装箱,简化书写
        i=i+6;//i=new Integer(i.intValue()+6);//i.intValue()自动拆箱

        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=129;//jdk1.5以后,自动装箱,如果装箱的是一个字节(即127及小于127的数x==y),那么该数据会被共享,不会重新开辟新的空间
        Integer y=129;
        System.out.println(x==y);//false
        System.out.println(x.equals(y));//true
    }

}

综合案例

package cn.itcase.p2.wrapper.test;

import java.util.Arrays;

public class WrapperTest {

    private static final String SPACE_SEPARATOR=" ";
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * 对一个字符串中的数值进行从小到大的顺序排序
         * 
         * "20 78 9 -7 88 36 29"
         * 
         * 思路:
         * 1、排序很熟
         * 2、如何获取到这个字符串中的这些需要排序的数值?
         * 发现这些字符串中其实都是空格来对数值进行分隔的
         * 所以就想到用字符串对象的切割方法将大串变成多个小串
         * 3、最终变成小字符串,怎么变成一个int数呢?
         * 字符串变成基本类型使用包装类
         * 
         * */
        String numStr="20 78 9 -7 88 36 29";
        System.out.println(numStr);
        numStr=sortStringNumber(numStr);
        System.out.println(numStr);
    }

    private static String sortStringNumber(String numStr) {
        // TODO Auto-generated method stub
        //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;
    }

    private static String arrayToString(int[] num_arr) {
        // TODO Auto-generated method stub
        StringBuilder sb=new StringBuilder();
        for(int x=0;x<num_arr.length;x++)
        {
            if(x!=num_arr.length-1)
                sb.append(num_arr[x]+SPACE_SEPARATOR);
            else
                sb.append(num_arr[x]);
        }
        return sb.toString();
    }

    private static void mySortArray(int[] num_arr) {
        // TODO Auto-generated method stub
        Arrays.sort(num_arr);
    }

    /**
     * @param str_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;
    }

    /**
     * @param numStr
     */
    public static String[] stringToArray(String numStr) {
        String[] str_arr=numStr.split(SPACE_SEPARATOR);

        return str_arr;
    }

}

7.2 Collection方法代码示例

package cn.itcast.p3.collection.demo;

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

public class CollectionDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection coll=new ArrayList();
//      show(coll);

        Collection c1=new ArrayList();
        Collection c2=new ArrayList();
        show(c1,c2);

    }
    public static void show(Collection c1,Collection c2)
    {
        //给c1添加元素
        c1.add("abc1");
        c1.add("abc2");
        c1.add("abc3");
        c1.add("abc4");

        //给c2添加元素
        c2.add("abc2");
        c2.add("abc6");
        c2.add("abc7");


        System.out.println("c1:"+c1);
        System.out.println("c2:"+c2);
        //演示addAll
        c1.addAll(c2);//将c2中的元素添加到c1中
        System.out.println("c1:"+c1); 
        /*
        //演示removeAll
        boolean b=c1.removeAll(c2);//将两个集合中的相同元素从调用removeAll的集合中删除
        System.out.println("removeAll:"+b);
        System.out.println("c1:"+c1);
        */
        /*
        //演示containsAll
        boolean b=c1.containsAll(c2);
        System.out.println("containsAll:"+b);
        */
        //演示retainsAll
        boolean b=c1.retainAll(c2);//取两个集合中的交集
        System.out.println("c1:"+c1);



    }
    public static void show(Collection coll)
    {
        //1、添加元素,add
        coll.add("abc1");
        coll.add("abc2");
        coll.add("abc3");
        System.out.println(coll);
        //2、删除元素,remove
        coll.remove("abc2");//会改变集合的长度
        System.out.println(coll);
        //清空集合
        coll.clear();
        System.out.println(coll);
    }
}
package cn.itcast.p3.collection.demo;

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

public class IteratorDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Collection coll=new ArrayList();

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

        while(it.hasNext())
        {
            System.out.println(it.next());
        }
        */
        //第二种方式,推荐使用这种方式
        for(Iterator it=coll.iterator();it.hasNext();)
        {
            System.out.println(it.next());
        }
    }

}

7.3 List代码示例

7.3.1 List共同方法代码示例

package cn.itcast.p4.list.demo;

import java.util.ArrayList;
import java.util.List;

public class ListDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        show(list);
    }

    private static void show(List list) {
        // TODO Auto-generated method stub
        //添加元素
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        list.add("abc4");
        list.add("abc5");
        System.out.println(list);
        //插入元素
        list.add(1, "abc9");
        System.out.println(list);
        //删除元素
        System.out.println("remove:"+list.remove(2));
        System.out.println(list);
        //修改元素
        System.out.println("set:"+list.set(1, "abc8"));
        System.out.println(list);
        //获取元素
        System.out.println("get:"+list.get(0));
        System.out.println(list);
        //获取子列表
        System.out.println("sublist:"+list.subList(1, 2));
        System.out.println(list);
    }

}
package cn.itcast.p4.list.demo;

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

public class ListDemo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        show(list);
    }

    public static void show(List list) {
        // TODO Auto-generated method stub
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        list.add("abc4");
        list.add("abc5");

        Iterator it=list.iterator();
        while(it.hasNext())
        {
            System.out.println("迭代器取出方式:"+it.next());
        }
        //list特有的取出元素的方式之一
        for(int x=0;x<list.size();x++)
        {
            System.out.println("list的取出方式:"+list.get(x));
        }

    }

}
package cn.itcast.p4.list.demo;

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

public class ListDemo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List list=new ArrayList();
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        list.add("abc4");
        list.add("abc5");
        System.out.println(list);
        ListIterator it=list.listIterator();//获取列表迭代对象
        //它可以实现迭代过程中完成对元素的增删改查
        //只有list集合中具备该迭代功能

        while(it.hasNext())
        {
            Object obj=it.next();
            if(obj.equals("abc2"))
            {
                it.add("abc9");
            }   
        }
        while(it.hasPrevious()) {
            System.out.println("previous:"+it.previous());//从后往前遍历
        }
        System.out.println("list:"+list);
        /*
        Iterator it=list.iterator();
        while(it.hasNext())
        {
            Object obj=it.next();//java.util.ConcurrentModificationException
                            //在迭代器过程中,不要使用集合操作元素,容易出现异常  因为添加了“abc9”之后迭代器对象中并没有这个“abc9”,所以在判断的时候会报错
                            //可以使用Iterator接口的子接口ListIterator来完成在迭代过程中对元素进行更多的操作
            if(obj.equals("abc2")) {
                list.add("abc9");
            }
            else
                System.out.println("next:"+obj);
        }
        System.out.println(list);
        */

    }

}

7.3.2 Vector

package cn.itcast.p4.Vector.demo;

import java.util.Enumeration;
import java.util.Iterator;
import java.util.Vector;

public class VectorDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Vector v=new Vector();
        v.addElement("abc1");
        v.addElement("abc2");
        v.addElement("abc3");
        v.addElement("abc4");
        v.addElement("abc5");
        Enumeration en=v.elements();
        while(en.hasMoreElements()) {
            System.out.println("nextelement:"+en.nextElement());
        }
        Iterator it=v.iterator();
        while(it.hasNext()) {
            System.out.println("next:"+it.next());
        }
    }

}

7.3.3 ArrayList代码示例

Person类

package cn.itcast.p.bean;

public class Person implements Comparable {
    private String name;
    private int age;

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }


    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        if(this==obj)//用于判定加入集合的是不是同一个对象,如果是则不让其加入集合
            return true;
        if(!(obj instanceof Person))
            throw new ClassCastException("类型错误");
        Person p=(Person)obj;
        return this.name.equals(p.name)&&this.age==p.age;//当姓名和年龄相同的时候才是同一个元素
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode()+age;//用于返回对象的hash值
    }
    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;
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        Person p=(Person)o;
        /*
         * 第二种方法
         * */
        int temp=this.age-p.age;
        return temp==0?this.name.compareTo(p.name):temp;

        /*第一种方法,以年龄排序,如果年龄相等就按姓名排序
        if(this.age>p.age)
            return 1;
        if(this.age<p.age)
            return -1;
        else {
            return this.name.compareTo(p.name);
        }
        */
    }
}
package cn.itcast.p3.ArrayList.test;

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

import cn.itcast.p.bean.Person;

public class ArrayListTestDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList al=new ArrayList();
        al.add(new Person("lisil",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())
        {
            /*
             * 这样写结果为:
                     * lisil:22
                       lisi3:24
             * 
             * 因为it.next()它是迭代器,会自动往下走,当取到第一个的名字后,又it.next()则跑到下一个即lisil2了,所以取出的是lisil2的年龄
             * 
            System.out.println(((Person) it.next()).getName()+":"+((Person) it.next()).getAge());//((Person) it.next())之所以这样写是因为,ArrayList中存储的是一个对象而且是Object类型的
                                                        //因为ArrayList中能存储任意对象,所以只能默认是Object对象,自然而然返回的也是Object对象,而Object对象没有getName()方法,所以必须强转
             */
            Person p=(Person) it.next();
            System.out.println(p.getName()+":"+p.getAge());
        }

    }

}

7.3.4 LinkedList代码示例

package cn.itcast.p4.Linklist.demo;
import cn.itcast.p4.Linklist.test.DuiLie;
public class LinklistDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
        LinkedList link=new LinkedList();
        link.addFirst("abc1");//作为第一个存储
        link.addFirst("abc2");
        link.addFirst("abc3");
        link.addFirst("abc4");
        System.out.println(link);
        System.out.println(link.getFirst());//获取第一个元素但不删除

        System.out.println(link.removeLast());//删除最后一个
        System.out.println(link);
        Iterator it=link.iterator();
        while(it.hasNext()) {
            System.out.println("iterator:"+it.next());
        }
        */
        DuiLie dl=new DuiLie();
        dl.myAdd("abc1");
        dl.myAdd("abc2");
        dl.myAdd("abc3");
        dl.myAdd("abc4");
        dl.myAdd("abc5");
        while(!dl.isNull())
        {
            System.out.println(dl.myGet());
        }

    }

}

LinkedList模拟队列结构

package cn.itcast.p4.Linklist.test;

import java.util.LinkedList;

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

7.4 Set
7.4.1 HashSet代码示例

package cn.itcast.p3.hashset.demo;

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

public class HashSetDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet hs=new HashSet();

        hs.add("abc1");
        hs.add("abc2");
        hs.add("abc3");
        hs.add("abc4");
        hs.add("abc5");

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

}

7.4.2HashSet存储对象,覆盖对象中的HashCode和equals方法

Person类

package cn.itcast.p.bean;

public class Person implements Comparable {
    private String name;
    private int age;

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }


    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        if(this==obj)//用于判定加入集合的是不是同一个对象,如果是则不让其加入集合
            return true;
        if(!(obj instanceof Person))
            throw new ClassCastException("类型错误");
        Person p=(Person)obj;
        return this.name.equals(p.name)&&this.age==p.age;//当姓名和年龄相同的时候才是同一个元素
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode()+age;//用于返回对象的hash值
    }
    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;
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        Person p=(Person)o;
        /*
         * 第二种方法
         * */
        int temp=this.age-p.age;
        return temp==0?this.name.compareTo(p.name):temp;

        /*第一种方法,以年龄排序,如果年龄相等就按姓名排序
        if(this.age>p.age)
            return 1;
        if(this.age<p.age)
            return -1;
        else {
            return this.name.compareTo(p.name);
        }
        */
    }



}
package cn.itcast.p3.hashset.demo;

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

import cn.itcast.p.bean.Person;

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

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet hs=new HashSet();
        /*HashSet集合数据结构是哈希表,所以存储元素的时候
         * 使用的元素的hashCode方法来确定位置,如果位置相同,再通过元素的equals来去顶是否相同
         * */
        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));//如果没有重写Person中的hashCode以及 equals方法,则能被加入到集合中,因为原Person中
                                        //调用的是Object对象的hashCode方法,new一个对象它的hashCode就不同,所以能通过

        Iterator it=hs.iterator();
        while(it.hasNext())
        {
            Person p=(Person)it.next();
            System.out.println(p.getName()+"..."+p.getAge());
        }

    }

}

7.4.3 LinkedHashSet代码示例

package cn.itcast.p3.hashset.demo;

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

public class LinkedHashSetDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashSet hs=new LinkedHashSet();//不重复且有序

        hs.add("abc1");
        hs.add("abc2");
        hs.add("abc3");
        hs.add("abc3");
        hs.add("abc5");

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

}

7.4.4 TreeSet代码示例

TreeSet存储对象Person时,第一种方法:Person类完成Comparable接口的实现

package cn.itcast.p.bean;

public class Person implements Comparable {
    private String name;
    private int age;

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }


    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        if(this==obj)//用于判定加入集合的是不是同一个对象,如果是则不让其加入集合
            return true;
        if(!(obj instanceof Person))
            throw new ClassCastException("类型错误");
        Person p=(Person)obj;
        return this.name.equals(p.name)&&this.age==p.age;//当姓名和年龄相同的时候才是同一个元素
    }
    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode()+age;//用于返回对象的hash值
    }
    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;
    }
    @Override
    public int compareTo(Object o) {
        // TODO Auto-generated method stub
        Person p=(Person)o;
        /*
         * 第二种方法
         * */
        int temp=this.age-p.age;
        return temp==0?this.name.compareTo(p.name):temp;

        /*第一种方法,以年龄排序,如果年龄相等就按姓名排序
        if(this.age>p.age)
            return 1;
        if(this.age<p.age)
            return -1;
        else {
            return this.name.compareTo(p.name);
        }
        */
    }



}

第二种方法是通过构造函数实现构造器的实现

package cn.itcast.p5.treeset.demo;

import java.util.Comparator;

import cn.itcast.p.bean.Person;

/*
 * 创建了一个根据Person类的name进行排序的比较器
 * */
public class ComparatorByName implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        // TODO Auto-generated method stub
        Person p1=(Person)o1;
        Person p2=(Person)o2;

        int temp=p1.getName().compareTo(p2.getName());

        return temp==0?p1.getAge()-p2.getAge():temp;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}
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) {
        // TODO Auto-generated method stub
        demo1();
        /*
         * 以Person年龄按从小到大的顺序排序
         * */
        TreeSet ts=new TreeSet(new ComparatorByName());//通过比较器进行指定排序,优选比较器进行排序,它是在构造过程中完成的
        ts.add(new Person("zhangsan",28));
        ts.add(new Person("wangu",23));
        ts.add(new Person("lisi",21));
        ts.add(new Person("zhouqi",29));
        ts.add(new Person("zhaoliu",25));
        ts.add(new Person("lisi",23));

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

    /**
     * 
     */
    public static void demo1() {
        TreeSet ts=new TreeSet();

        ts.add("abc");
        ts.add("aa");
        ts.add("nba");
        ts.add("cba");

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

}

7.5 泛型
7.5.1 泛型代码示例

基本数据类型对象泛型

package cn.itcast.p1.generic.demo;

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

public class GenericDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<String> al=new ArrayList<String>();//public boolean add(Object obj)
        al.add("abc1");
        al.add("abc2");
//      al.add(4);//al.add(new Integer(4))

        Iterator<String> it=al.iterator();//通过上面的泛型<String>保证了返回的是String类型的,因此迭代器返回的也应该是String类型的,所以在此处需要加上泛型
                                            //有了上面的泛型限制,下面就不需要强转了,同时添加al.add(4)再编译的时候就会报错
        while(it.hasNext())
        {
            String str=it.next();//由于al.add(4)添加的是Integer类型的,不能强转成String类型,所以会报错
            System.out.println(str);
        }
    }

}

自定义对象泛型

Person类

package cn.itcast.p2.bean;

public class Person implements Comparable<Person>{

    private String name;
    private int age;

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public int compareTo(Person obj) {
        Person p=(Person)obj;
        int temp=this.age-p.age;
        return temp==0?this.name.compareTo(p.name):temp;
    }

    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 Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person:"+getName()+":"+getAge();
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }



}

ComparatorByName构造器的实现

package cn.itcast.p3.comparator;

import java.util.Comparator;

import cn.itcast.p2.bean.Person;

public class ComparatorByName implements Comparator<Person> {

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        int temp=o1.getName().compareTo(o2.getName());
        return temp==0?o1.getAge()-o2.getAge():temp;
    }

}

自定义对象泛型的代码示例

package cn.itcast.p1.generic.demo;


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

import cn.itcast.p2.bean.Person;
import cn.itcast.p3.comparator.ComparatorByName;

public class GenericDemo2 {

    public static void main(String[] args) {
        //TreeSet<E>uto-generated method stub
//      TreeSet<Person>ts=new TreeSet<Person>();//第一种方式通过覆写Comparable接口
        TreeSet<Person>ts=new TreeSet<Person>(new ComparatorByName());//第二种方法通过实现比较器实现的
        ts.add(new Person("lisi",21));
        ts.add(new Person("lisi3",23));
        ts.add(new Person("lisi",21));
        ts.add(new Person("lisi",21));
        ts.add(new Person("lisi0",20));

        Iterator<Person>it=ts.iterator();
        while(it.hasNext()) {
            Person p=it.next();
            System.out.println(p.getName()+"---"+p.getAge());
        }
    }

}

7.5.2 泛型通配符

package cn.itcast.p4.generic.define.demo;

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

public class GenericAdvanceDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<String>al=new ArrayList<String>();
        al.add("abc");
        al.add("hehe");

        ArrayList<Integer>al2=new ArrayList<Integer>();
        al2.add(5);
        al2.add(67);

        printCollection(al);
        printCollection(al2);


    }
    /*
     * 迭代并打印集合中的元素
     * */
    private static void printCollection(Collection<?> al) {//通配符的使用,就是里面不管什么类型的都行
                                                    //之所以用Collection是因为这样可以兼容ArrayList、HashSet等都行
        // TODO Auto-generated method stub
        Iterator<?>it=al.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

}

7.5.3 泛型上限

Person类

package cn.itcast.p2.bean;

public class Person implements Comparable<Person>{

    private String name;
    private int age;

    public Person() {
        super();
        // TODO Auto-generated constructor stub
    }
    public int compareTo(Person obj) {
        Person p=(Person)obj;
        int temp=this.age-p.age;
        return temp==0?this.name.compareTo(p.name):temp;
    }

    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 Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Person:"+getName()+":"+getAge();
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }



}

Student类

package cn.itcast.p2.bean;

public class Student extends Person {

    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Student(String name, int age) {
        super(name, age);
        // TODO Auto-generated constructor stub
    }


    @Override
    public String toString() {
        return "Student:"+getName()+":"+getAge();
    }

}

Worker类

package cn.itcast.p2.bean;

public class Worker extends Person {

    public Worker() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Worker(String name, int age) {
        super(name, age);
        // TODO Auto-generated constructor stub
    }

    @Override
    public String toString() {
        return "Woker:"+getName()+":"+getAge();
    }

}

泛型上限代码示例:

package cn.itcast.p4.generic.define.demo;

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

import cn.itcast.p2.bean.Person;
import cn.itcast.p2.bean.Student;
import cn.itcast.p2.bean.Worker;

public class GenericAdvanceDemo2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Worker>al=new ArrayList<Worker>();
        al.add(new Worker("abc",30));
        al.add(new Worker("abc4",34));

        ArrayList<Student>al2=new ArrayList<Student>();
        al2.add(new Student("stu1",11));
        al2.add(new Student("stu2",22));

        /*ArrayList<String>al3=new ArrayList<String>();
        al2.add("stu1dsfa");
        al2.add("fandks");*///不能,因为它不是Person类型也不是它的子类

        printCollection(al);
        printCollection(al2);


    }
    /*
     * 迭代并打印集合中的元素
     * 可以对类型进行限定
     * ? extends E:接收E类型或者E的子类型对象。上限! 
     * ? super E:接收E类型或者E的父类型。下限!
     * 
     * */
    private static void printCollection(Collection<? extends Person> al) {//? extends Person泛型的限定,只能是Person类型或其子类型
                                                    //之所以用Collection是因为这样可以兼容ArrayList、HashSet等都行
        // TODO Auto-generated method stub
        Iterator<? extends Person>it=al.iterator();
        while(it.hasNext()) {
            Person p=it.next();
            System.out.println(p.getName()+":"+p.getAge());
        }
    }

}
package cn.itcast.p4.generic.define.demo;

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

import cn.itcast.p2.bean.Person;
import cn.itcast.p2.bean.Student;
import cn.itcast.p2.bean.Worker;

public class GenericAdvanceDemo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ArrayList<Person>al1=new ArrayList<Person>();
        al1.add(new Person("abc",30));
        al1.add(new Person("abc4",34));

        ArrayList<Student>al2=new ArrayList<Student>();
        al2.add(new Student("stu1",11));
        al2.add(new Student("stu2",22));

        ArrayList<Worker>al3=new ArrayList<Worker>();
        al3.add(new Worker("abc",30));
        al3.add(new Worker("abc4",34));

        ArrayList<String>al4=new ArrayList<String>();
        al4.add("abcedf");
//      al1.addAll(al4);//错误,类型不匹配


        /*ArrayList<String>al3=new ArrayList<String>();
        al2.add("stu1dsfa");
        al2.add("fandks");*///不能,因为它不是Person类型也不是它的子类

//      printCollection(al);
//      printCollection(al2);


    }
}
/*一般在存储元素的时候都是用上限,因为这样取出来都是按照上限类型来运算的,不会出现类型隐患
 * */
class MyCollection<E>{
    public void add(E e) {

    }
    public void addAll(MyCollection<E>e) {

    }
}   

7.5.4 泛型定义在方法和接口上

泛型定义在方法上(泛型类)

泛型类

package cn.itcast.p4.generic.define.demo;

/*public class Tool {
    private Object Object;

    public void setObject(Object Object) {
        this.Object = Object;
    }
    public Tool(Object Object) {
        super();
        this.Object = Object;
    }

}*/
//在jdk1.5后,使用泛型类来接受类中要操作的引用数据类型
//泛型类,什么时候用?当类中的操作的引用数据类型不确定的时候,就使用泛型类来表示
public class Tool<T>{
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }
    /*
     * 将泛型定义在方法上
     * */
    public <W>void show(W str){
        System.out.println("show:"+str.toString());
    }
    public void print(T str) {
        System.out.println("print:"+str);
    }
    /*
     * 当方法静态时,不能访问类上定义的泛型,如果静态方法使用泛型
     * 只能将泛型定义在方法上
     * */
    public static<Y> void method(Y obj) {
        System.out.println("method:"+obj);
    }

}

泛型类的使用

package cn.itcast.p4.generic.define.demo;

import cn.itcast.p2.bean.Student;

public class GenericDefineDemo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Tool<Student>tool=new Tool<Student>();
        tool.setT(new Student());
        Student stu=tool.getT();

    }

}
package cn.itcast.p4.generic.define.demo;

public class GenericDemo4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Tool<String>tool=new Tool<String>();

        tool.show(new Integer(4));//数据类型是Integer
        tool.show("abc");//数据类型是String
        tool.print("abc");
        Tool.method("haha");
        Tool.method(new Integer(9));
    }

}

泛型接口的使用

package cn.itcast.p4.generic.define.demo;

public class GenericDefineDemo5 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        InterImpl in=new InterImpl();
        InterImpl in2=new InterImpl();
        in.show("abc");
        in2.show("abc");
    }

}
//泛型接口,将泛型定义在接口上
interface Inter<T>{
    public void show(T t);
}
//第一种实现方法
class InterImpl implements Inter<String>{
    public void show(String str) {
        System.out.println("show:"+str);
    }
}
//第二种实现方法
class InterImpl2<Q> implements Inter<Q>{
    public void show(Q q) {
        System.out.println("show:"+q);
    }
}

7.6 Map
7.6.1 Map代码示例

package cn.itcast.p6.map.demo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Map<Integer,String>map=new HashMap<Integer,String>();
        //method(map);
        method_2(map);
    }
    public static void method_2(Map<Integer,String>map) {
        map.put(8,"wangwu");
        map.put(2, "zhaoliu");
        map.put(7,"xiaoqiang");
        map.put(6, "wangcai");

        //取出map中的所有元素
        //原理,通过keySet方法获取map中所有的键所在的Set集合,再通过Set迭代器获取到每一个键
        //再对每一个键获取其对应的值即可

        Set<Integer>keySet=map.keySet();
        Iterator<Integer>it=keySet.iterator();
        while(it.hasNext()) {
            Integer key=it.next();
            String value=map.get(key);
            System.out.println(key+":"+value);
        }
    }
    public static void method(Map<Integer,String>map)//学号、姓名
    {
        //添加元素
        System.out.println(map.put(8,"wangcai"));//null
        System.out.println(map.put(8, "xiaoqiang"));//wangcai,存相同键,值会覆盖
        map.put(2,"zhangsan");
        map.put(7,"zhaoliu");
        //删除
        System.out.println("remove:"+map.remove(2));
        //判断
        System.out.println("containskey:"+map.containsKey(7));
        //获取
        System.out.println("get:"+map.get(8));

    }
}
package cn.itcast.p6.map.demo;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapDemo_2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Map<Integer,String>map=new HashMap<Integer,String>();
        //method(map);
        method_2(map);
    }
    public static void method_2(Map<Integer,String>map) {
        map.put(8,"wangwu");
        map.put(2, "zhaoliu");
        map.put(7,"xiaoqiang");
        map.put(6, "wangcai");

        /*
         * 通过Map转成set就可以迭代
         * 找到了另一个方法:entrySet
         * 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map、Entry类型
         * 
         * */
        Collection<String>values=map.values();
        Iterator<String>it2=values.iterator();
        while(it2.hasNext()) {
            System.out.println(it2.next());
        }

        Set<Map.Entry<Integer,String>>entrySet=map.entrySet();
        Iterator<Map.Entry<Integer, String>>it=entrySet.iterator();
        while(it.hasNext()) {
            Map.Entry<Integer, String>me=it.next();
            Integer key=me.getKey();
            String value=me.getValue();
            System.out.println(key+":"+value);
        }
    }
    public static void method(Map<Integer,String>map)//学号、姓名
    {
        //添加元素
        System.out.println(map.put(8,"wangcai"));//null
        System.out.println(map.put(8, "xiaoqiang"));//wangcai,存相同键,值会覆盖
        map.put(2,"zhangsan");
        map.put(7,"zhaoliu");
        //删除
        System.out.println("remove:"+map.remove(2));
        //判断
        System.out.println("containskey:"+map.containsKey(7));
        //获取
        System.out.println("get:"+map.get(8));

    }
}

Map案例

package cn.itcast.p7map.test;

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

/*
 * 练习:
 * “fsdfasdfafda”获取该字符串中,每一个字母出现的次数
 * 要求打印结果是:a(2)b(1)....;
 * 思路:
 * 对于结果的分析发现,字母和数字之间存在着映射的关系,而且这种关系很多
 * 很多就需要存储,能存储映射关系的容器有数组和Map集合
 * 关系一方是有序集合吗?没有
 * 那就是使用Map集合,又发现可以保证唯一性的一方具备着顺序如a b c...
 * 所以使用TreeMap集合
 * 
 * 这个集合最终应该存储的是字母和次数的对应关系
 * 1、因为操作是字符中的字母,所以先将字符串变成字符数组
 * 2、遍历字符数组,用每一个字母作为键去查Map集合中这个表
 * 如果该字母键不存在,就将该字母作为键1作为值存储到map集合中
 * 如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中
 * 键相同值会覆盖。这样就记录了该字母表的次数
 * 3、遍历结束,map集合就记录所有字母的出现的次数
 * */
public class MapTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String str="fs dfa + sdfafda";
        String s=getCharCount(str);
        System.out.println(s);
    }

    private static String getCharCount(String str) {
        // TODO Auto-generated method stub
        //将字符串变成字符数组
        char[] chs=str.toCharArray();
        //定义map集合表
        Map<Character,Integer>map=new TreeMap<Character,Integer>();
        for(int i=0;i<chs.length;i++) {
            if(!(chs[i]>='a'&&chs[i]<='z'||chs[i]>='A'&&chs[i]<='Z'))
                continue;
            //将数组中的字母作为键去查map表
            Integer value=map.get(chs[i]);
            //判断值是否为null
            //第一种写法
/*          if(value==null) {
                map.put(chs[i], 1);
            }else {
                map.put(chs[i],value+1);
            }*/
            //第二种写法
            int count=1;
            if(value!=null) {
                count=value+1;
            }
            map.put(chs[i], count);

        }
        return mapToString(map);
    }

    private static String mapToString(Map<Character, Integer> map) {
        // TODO Auto-generated method stub
        StringBuilder sb=new StringBuilder();
        Iterator<Character>it=map.keySet().iterator();
        while(it.hasNext()) {
            Character key=it.next();
            Integer value=map.get(key);
            sb.append(key+"("+value+")");
        }
        return sb.toString();
    }

}
package cn.itcast.p7map.test;

import java.util.HashMap;
import java.util.Map;

public class MapTest2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * Map在有映射关系时,可以优先考虑
         * 在查表中的应用较为多见
         * */
        String week=getWeek(1);
        System.out.println(week);
        System.out.println(getWeekByMap(week));
    }
    public static String getWeekByMap(String week) {
        Map<String,String>map=new HashMap<String,String>();
        map.put("星期一", "Mon");
        map.put("星期二", "Tus");
        map.put("星期三", "Wes");
        map.put("星期四", "Thr");
        map.put("星期五", "Fri");
        map.put("星期六", "Sat");
        map.put("星期日", "Sun");
        return map.get(week);
    }
    private static String getWeek(int i) {
        // TODO Auto-generated method stub
        if(i<1||i>7)
            throw new RuntimeException("没有对应的星期,请重新输入");
        String[]weeks= {"","星期一","星期二"};
        return weeks[i];
    }

}

7.6.2 Map子类

HashMap

package cn.itcast.p7.hashmap.demo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

import cn.itcast.p2.bean.Student;

public class HashMapDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * 将学生对象和学生的归属地通过键和值存储到map集合中。
         * 
         * */
        HashMap<Student,String>hm=new HashMap<Student,String>();
        hm.put(new Student("lisi",38),"北京");
        hm.put(new Student("zhaoliu",24),"上海");
        hm.put(new Student("xiaoqiang",31),"沈阳");
        hm.put(new Student("wangcai",28),"大连");
        hm.put(new Student("zhaoliu",24),"铁岭");

        Set<Student>keySet=hm.keySet();
        Iterator<Student>it=keySet.iterator();
        while(it.hasNext())
        {
            Student key=it.next();
            String value=hm.get(key);
            System.out.println(key.getName()+":"+key.getAge()+"----"+value);
        }
    }

}

LinkedHashMap

package cn.itcast.p7.hashmap.demo;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashMapDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        HashMap<Integer,String>hm=new LinkedHashMap<Integer,String>();
        hm.put(7,"zhouqi");
        hm.put(3, "zhangsan");
        hm.put(1, "qianyi");
        hm.put(5, "wangwu");
        Iterator<Map.Entry<Integer,String>>it=hm.entrySet().iterator();
        while(it.hasNext()) {
            Map.Entry<Integer, String>me=it.next();
            Integer key=me.getKey();
            String value=me.getValue();
            System.out.println(key+":"+value);

        }

    }

}

TreeMap

package cn.itcast.p8.treemap.demo;

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;

import cn.itcast.p2.bean.Student;
import cn.itcast.p3.comparator.ComparatorByName;

public class TreeMapDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TreeMap<Student,String>tm=new TreeMap<Student,String>(new ComparatorByName());
        tm.put(new Student("lisi",38),"北京");
        tm.put(new Student("zhaoliu",24),"上海");
        tm.put(new Student("xiaoqiang",31),"沈阳");
        tm.put(new Student("wangcai",28),"大连");
        tm.put(new Student("zhaoliu",24),"铁岭");

        Iterator<Map.Entry<Student, String>>it=tm.entrySet().iterator();
        while(it.hasNext())
        {
            Map.Entry<Student, String>me=it.next();
            String value=me.getValue();
            Student key=me.getKey();

            System.out.println(key.getName()+":"+key.getAge()+"----"+value);
        }
    }

}

7.7 工具类
7.7.1 排序工具

package cn.itcast.p1.toolclass.collections.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CollectionsDemoSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * Collections:集合框架的工具类
         * 里面的方法都是静态的
         * 
         * */
        demo_1();
    }
    public static void demo_1(){
        List<String>list=new ArrayList<String>();
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        list.add("zzz");
        list.add("nbaa");
        list.add("zzz");
        System.out.println(list);
        //对list集合进行指定顺序的排序,因为list实现了Collection的接口
        Collections.sort(list);
        System.out.println(list);
    }

}

ComparatorByLength类

package cn.itcast.p1.toolclass.collections.demo;

import java.util.Comparator;

public class ComparatorByLength implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        // TODO Auto-generated method stub
        int temp=o1.length()-o2.length();
        return temp==0?o1.compareTo(o2):temp;
    }

}

自定义排序

package cn.itcast.p1.toolclass.collections.demo;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;

public class CollectionsDemoSortByLength {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * Collections:集合框架的工具类
         * 里面的方法都是静态的
         * 
         * */
        demo_1();
        demo_2();
        demo_3();
        demo_4();
        demo_5();
    }
    public static void demo_1(){
        List<String>list=new ArrayList<String>();
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        list.add("zzz");
        list.add("nbaa");
        list.add("zzz");
        System.out.println(list);
        //对list集合进行指定顺序的排序,因为list实现了Collection的接口
        mySort(list,new ComparatorByLength());
//      Collections.sort(list,new ComparatorByLength());//按长度排序(指定顺序)
        System.out.println(list);
    }

    public static void demo_2() {//折半查找
        List<String>list=new ArrayList<String>();
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        list.add("zzz");
        list.add("nbaa");
        list.add("zzz");
        Collections.sort(list);
        System.out.println(list);

        int index=Collections.binarySearch(list, "cba");
        System.out.println("index="+index);

    }
    public static void demo_3() {
        List<String>list=new ArrayList<String>();
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        list.add("zzz");
        list.add("nbaa");
        System.out.println(list);
        //获取最大值
        String max=Collections.max(list);
        String maxLen=Collections.max(list,new ComparatorByLength());
        System.out.println("max="+max);
    }
    public static void demo_4() {
        /*倒序
         * TreeSet<String>ts=new TreeSet<String>(new Comparator<String>(){

            @Override
            public int compare(String o1, String o2) {
                // TODO Auto-generated method stub
                    int temp=o2.compareTo(o1);
                    return temp;
            }

        });*/
        TreeSet<String>ts=new TreeSet<String>(Collections.reverseOrder());//将自然排序逆转
        ts.add("abc");
        ts.add("hahaha");
        ts.add("zzz");
        ts.add("aa");
        ts.add("cba");

        System.out.println(ts);
    }
    public static void demo_5() {
        List<String>list=new ArrayList<String>();
        list.add("abcde");
        list.add("cba");
        list.add("aa");
        System.out.println(list);
        Collections.replaceAll(list,"cba","nba");//用"nba"替换列表中的所有"cba"
//      Collections.fill(list, "cc");//将列表中的所有元素替换成"cc"
//      Collections.shuffle(list);//将列表中的元素随机打乱顺序
        System.out.println(list);
    }
    public static<T>void mySort(List<T>list,Comparator<? super T>comp){
        for(int i=0;i<list.size()-1;i++) {
            for(int j=i+1;j<list.size();j++) {
                if(comp.compare(list.get(i),list.get(j))<0) {
                    Collections.swap(list, i, j);
                }
            }
        }
    }
}

7.7.2 Arrays

package cn.itcast.p2.toolclass.collections.demo;

import java.util.Arrays;
import java.util.List;

public class ArraysDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_1();
        demo_2();
    }

    private static void demo_2() {
        // TODO Auto-generated method stub
        /*
         * 如果数组中的元素是对象,那么转成集合时,直接将数组中的元素作为集合中的元素进行集合存储
         * 如果数组中的元素是基本类型数值,那么会将该数组作为集合中的元素进行存储
         * */
        int[] arr= {31,11,51,61};
        List<int[]> list=Arrays.asList(arr);//int[]存储的是什么类型泛型就是什么样的
        System.out.println(list.size());//因为存储的是基本类型,所以此处打印的是1,如果是Integer类型则打印的是4
    }

    /**
     * 
     */
    public static void demo_1() {
        /*
         * Arrays:集合框架的工具类,里面的方法都是静态的
         * 
         * */
        /*int[]arr= {3,1,5,6,3,6};
        System.out.println(Arrays.toString(arr));*/
        /*
         * 重点:List asList(数组)将数组转成集合
         * 好处:可以使用集合的方法操作数组中的元素
         * 注意:数组的长度是固定的,所以对集合的增删方法是不可以使用的
         * 否则会发生UnsupportedOperationException异常
         * 
         * */
        String[] arr= {"abc","haha","xixi"};
        List<String>list=Arrays.asList(arr);
        boolean b=list.contains("xixi");
        System.out.println("b="+b);
    }

}
package cn.itcast.p2.toolclass.collections.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ToArray {
    public static void main(String[]args) {
        /*
         * 集合转成数组
         * 使用的就是Collection接口中的toArray方法
         * 集合转成数组:可以对集合中的元素操作的方法进行限定,不允许对其进行增删
         * 
         * */
        List<String>list=new ArrayList<String>();
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        /*
         * toArray方法需要传入一个指定类型的数组
         * 如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同size的数组
         * 如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null,
         * 所以建议最好长度就指定为集合的size
         * 
         * */
        String[]arr=list.toArray(new String[list.size()]);
        System.out.println(Arrays.toString(arr));
    }
}

7.8 新特性
7.8.1 高级for语句

package cn.itcast.p4.news.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ForEachDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /*
         * foreach语句:
         * 格式:
         * for(类型 变量:Collection集合|数组)
         * {
         * }
         * 传统for和高级for的区别:
         * 传统for可以完成对语句执行很多次,因为可以定义控制循环的增量和条件
         * 高级for是一种简化形式
         * 它必须有被遍历的目标,该目标要么是数组,要么是Collection单列集合
         * 对数组的遍历如果仅仅是获取数组中的元素,可以使用高级for
         * 如果要对数组的角标进行操作建议使用传统for
         * */
        List<String>list=new ArrayList<String>();
        list.add("abnc");
        list.add("abdnc");
        list.add("abnsc");
        list.add("ab1c");
        for(String s:list) {
            System.out.println(s);
        }

        //上面的是新式写法,一般只用与迭代,取出,不会对元素进行过多的操作
        /*Iterator<String>it=list.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }*/
        /*不能直接使用高级for遍历map集合,但是可以将它先转换成单列的set,就可以用了
         * */
        Map<Integer,String>map=new HashMap<Integer,String>();
        map.put(3, "zhjang");
        map.put(1, "wangyi");
        map.put(4, "wangwu");
        map.put(5, "zhangsan");
        for(Integer key:map.keySet()) {
            String value=map.get(key);
            System.out.println(key+":"+value);
        }
        for(Map.Entry<Integer, String>me:map.entrySet())
        {
            Integer key=me.getKey();
            String value=me.getValue();
            System.out.println(key+":"+value);
        }
    }

}

7.8.2 可变参数

package cn.itcast.p4.news.demo;

public class ParamterDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] arr= {5,1,4,7,3};
        int sum=add(arr);//可变参数
        System.out.println("sum="+sum);

//      新特性,函数的可变参数,其实就是一个数组,但是接收的是数组的元素
//      自动将这些元素封装成数组,简化了调用者的书写
//      注意:可变参数类型,必须定义在参数列表的结尾
//      例如:public static int newAdd(int a,int... arr)
        int sum2=newAdd(5,1,4,7,3);
        System.out.println("sum="+sum2);
        int sum1=newAdd(5,1,4,7,3,5,6,7);
        System.out.println("sum1="+sum1);
    }
    public static int newAdd(int... arr) {
        int sum=0;
        for(int i=0;i<arr.length;i++)
        {
            sum+=arr[i];
        }
        return sum;
//      System.out.println(arr);
//      return 0;
    }
    public static int add(int[] arr) {
        int sum=0;
        for(int i=0;i<arr.length;i++)
        {
            sum+=arr[i];
        }
        return sum;
    }

}

7.8.3 静态导入

package cn.itcast.p4.news.demo;

import java.util.ArrayList;
import java.util.List;
import static java.util.Collections.*;//静态导入,其实导入的是类中的静态成员

public class StaticImportDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        List<String>list=new ArrayList<String>();
        list.add("abc3");
        list.add("abc1");
        list.add("abc7");
        System.out.println(list);
        sort(list);//以前是Collections.sort
        System.out.println(list);

        String max=max(list);//以前是Collections.max
        System.out.println("max="+max);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值