集合:

List和Set

java判断两个集合是完全一样 java判断集合是否重复_java判断两个集合是完全一样

List可重复,Set可重复

重不重复就是用equals比较的结果

查看集合中是否包含给定的元素

没重写equals还是判断是否是同一个对象,用的双等于

c.contanins(元素); 判断集合中是否包含某元素

包含取决于集合中的元素是否有与给定元素equals比较为true的
但是没有放进集合也有可能不包含。

给定的元素与集合中的每一个元素equals比较。

集合的其他方法

public static void main(String[] args) {

        Collection c = new ArrayList();
        int s1 = c.size();
        System.out.println("size:"+s1);
        /*
         * boolean isEmpry()
         * 查看集合中是否不含有任何元素
         * 就是是空的吗?
         */
        boolean e1 = c.isEmpty();
        System.out.println(e1);
        //增加元素
        c.add("111");
        c.add(123);

        int s2 = c.size();
        System.out.println("size:"+s2);
        boolean e2 = c.isEmpty();
        System.out.println(e2);

        c.clear();
        boolean e3 = c.isEmpty();
        System.out.println(e3);
    }

java判断两个集合是完全一样 java判断集合是否重复_System_02

addAll、containsAll

java判断两个集合是完全一样 java判断集合是否重复_List_03

一般也在集合中放同一类的元素

addALL方法

public static void main(String[] args) {

        Collection conn1 = new ArrayList();
        conn1.add("java");
        conn1.add(".net");
        conn1.add("c#");
        conn1.add("php");

        System.out.println(conn1);

        Collection conn2 = new ArrayList();
        conn2.add("android");
        conn2.add("ios");
        //addALL就是把另一个List中的元素放入这个List中
        conn1.addAll(conn2);
        System.out.println(conn1);
    }

java判断两个集合是完全一样 java判断集合是否重复_List_04

Collection conn3 = new ArrayList();
        conn3.add("java");
        conn3.add("ios");
        //查看当前集合中是否保护给定集合中的所有元素,
        //也是根据元素的equals来判断的。
        boolean b = conn1.containsAll(conn3);

        System.out.println("全包含:"+b);
    }

java判断两个集合是完全一样 java判断集合是否重复_List_05

删除 remove

传入参数: 要删除什么传入什么,然后比较用的是equals

boolean remove(object o)

从当前集合中删除给定元素
删除元素是根据元素的equals的结果判断

remove只删除第一个遇到的元素

使用迭代器遍历List中元素:

public class CollectionIterator {

    public static void main(String[] args) {
        Collection c = new ArrayList();
        c.add("a");
        c.add("b");
        c.add("c");
        c.add("d");
        c.add("e");
        /*
         * Iteartor是一个接口
         * java希望我们使用统一的方式遍历所有集合
         * 使用迭代器遍历集合必须遵循以下过程
         * 问,取,删(删除不是必须操作)
         * 
         */
        Iterator it =c.iterator();
        /*
         * boolean hashNext()
         * 询问迭代器,遍历的集合是否还有元素可以取出
         * 用while循环判断,有就继续取出,在list中都认为是object,什么都能取出来
         * 然后用object 接受 取出的,然后在给他强制转换为字符串
         */
        while (it.hasNext()){
            Object obj = it.next();
            String str = (String)obj;
            System.out.println(str);
//可以直接: String str = (String)it.next();
        }
    }

!!!
尽量使用字面量.equals(变量)
这样可以避免空指针异常的产生
如果在迭代器中 it.remove();要在前面it.next()才行,然后remove删除当前next出来的元素

。。。。。
另一种遍历集合的方法(java5.0后)
比迭代器更方便:

public static void main(String[] args) {

        Collection c = new ArrayList();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
        //新循环
        for(Object a:c){
            String str = (String)a;
            System.out.println(str);

        }

当然也可以用新循环遍历数组

泛型机制:

java判断两个集合是完全一样 java判断集合是否重复_java判断两个集合是完全一样_06

在类后面加个尖括号 ,一般一个字母,这个类型叫T,也可以叫别的。声明了T这么一个类型。
于是可以 在定义属性时 返回值可以定义为 T这个类型
在用的时候给真实类型
如:
在写一个类,

public class TypeDemo<T>{
    private int x;
    public TypeDemo(int x){
        this.x =x;
    }
    public String toString(){

        return x+"";
    }

然后在实例化时给到底是什么类型的

TypeDemo<String> t = new TypeDemo<String>(“qw”);

在类中的get,set方法中也要设置返回值为T

!!!!!
尖括号中只能写引用类型不能是基本类型也就是说要是用int就要:写 Integer
不能写基本类型,先不告诉他什么类型,后面用的时候告诉他

在集合中的泛型

public static void main(String[] args) {
        //所有的集合都支持泛型,那么一般一个集合的类型一样的话,可以直接用泛型指定为什么类型
        Collection<String> c = new ArrayList();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
        //因为泛型定义了是String,那么直接就可以赋值输出了
        for(String o:c){
            System.out.println(o);

        }

    }

迭代器也可以用泛型
Iterator<String>

List

分为:
ArrayList和LinkList

java判断两个集合是完全一样 java判断集合是否重复_泛型_07

ArrayList 内部是数组实现的 适用查找
LinkList内部是用于链表实现的 适用增删

List除了继承Coleection定义的方法外,还根据其线性表的数据结构定义了一系列方法,其中最长远的就是基于下标的get和set方法:
get(int index)
获取集合中指定下标对应的元素,下标从0开始
set(int index ,E element)
将给定的元素存入给定位置,并将原位置的元素返回。
相当于给替换了,然后把集合中的元素取出来。

List<String> c = new ArrayList();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
    System.out.println(c.get(1));
    System.out.println(c.set(1, "five"));
    System.out.println(c.get(1));
    }

List集合的插入和删除

插入指定位置

java判断两个集合是完全一样 java判断集合是否重复_System_08

List<String> list = new ArrayList();

        list.add("one");
        list.add("two");
        list.add("three");
        /*
         * void add(int index ,T t)
         * 将给定的元素添加到给定的位置上
         * 原位置以及后续的元素顺序向后移动
         * 插入操作
         */
        System.out.println(list);
        list.add(1,"123");
        System.out.println(list);

同样,remove是删除指定下标的元素,然后返回值是删除的元素。

List获取子集的方法:

public class ListDemo3 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList();
        for (int i=0;i<10;i++){
            list.add(i);    
        }
        System.out.println(list);
        /*
         * List subList(int start, int end)
         * 获取当前集合的子集
         */
        List<Integer> list1 = list.subList(3, 8);
        System.out.println(list1);
    }

java判断两个集合是完全一样 java判断集合是否重复_泛型_09

!!!!!!!
修改子集元素会影响原集合
!!!!!!

List转换为数组:

java判断两个集合是完全一样 java判断集合是否重复_泛型_10

集合转成数组容易,但是数组只能转为List

public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();
        c.add("one");
        c.add("two");
        c.add("thiree");
        //直接用toArray的话返回的是Object
        //Object[] array =c.toArray();
        //但是向方法里面传个数组就直接可以定义它的类型
        String [] array=c.toArray(new String[c.size()]);
        //如果传入的数组不够长,他会自己创建个同类型的数组
        //长度够就用
    }

数组转为List

public static void main(String[] args) {
        String [] array = {"1","2","3","4","5"};
        List<String> list = Arrays.asList(array);
        //但是转换为List后,不能在增加了。是只读的
    }

可以增加的话就在自己创建个List

public static void main(String[] args) {
        String [] array = {"1","2","3","4","5"};
        List<String> list = Arrays.asList(array);
        //但是转换为List后,不能在增加了。是只读的’
        //要想添加就要复制个,可以直接把另一个List在创建List时直接传入,就相当于复制了一哈
        List<String> list2 = new ArrayList(list);
        list2.add("6");
        System.out.println(list2);
    }

java判断两个集合是完全一样 java判断集合是否重复_System_11

集合的排序:

public static void main(String[] args) {
        List<Integer> c = new ArrayList();

        Random random = new Random();

        for(int i=0;i<10;i++){
            c.add(random.nextInt(100));
        }
        System.out.println(c);
        //通过Collections这个集合的工具类
        //我们可以对List集合进行孜然排序
        Collections.sort(c);
        System.out.println(c);      
    }

java判断两个集合是完全一样 java判断集合是否重复_泛型_12

如果List中的是对象的话,不能用Collections.sort排序,如果用的话要是可以排序的
使用Colletions的sort方法进行排序的集合,要求元素必须实现Comparable接口,只有实现了该接口才认为是可比较的元素

那么就可以让那个对象被实例的类实现接口 Comparable
即:

类 implements Comparable<类(就是这个类,说明和自己比)>{

}

这个是比较大小的方法

返回值不关注具体的值,只关注取值范围
返回值<0: 当前对象比给定的对象小
返回值=0: 两个对象相等
返回值>0: 当前对象比给定的对象大
在下面就实现方法 compare(类 o){
在这里可以自己定义比较规划,定义比较什么,规定什么大,什么小。

return 两个值的差
}

就是用泛型说明比较的就是自己这个类,然后下面传入的参数也就变成了这个类

实现了接口就可以比较对象的大小了~~~

对于字符串排序的话,按首字母排序,相同看第二个~~

对于汉字的排序的话,按照 Unicode排序的。

如果要让他按我想的排序,就是按字符串长短排序

不能重写~

比较器:

写个类,然后实现接口 Comparator{

public int compare(String o1, String o2){
return o1.length()-o2.length();
}
}

然后在比较之前创建一个比较器,实例化这个类

Comparator com = new 那个类();

然后把创建的比较器和list一起传入Collection,调用sort排序方法进行比较,就按自己定义的排序方式来比较
Collections.sort(list,com);

何时使用匿名内部类

当我们需要用到一个实例,而该实例所属的类需要实现一个接口或者继承一个类,并且该实例仅在这里用一次,不会再其他地方使用时,我们就应当选取使用匿名内部类的形式创建实例

例如:
使用比较器

Comparator com = new Comparator(){
public int compare(Object o1,Object o2){
return 0;
}
};

还是可以使用泛型

Comparator com = new Comparator<类名>(){
public int compare(类名 o1,类名 o2){
return o1.属性-o2.属性;
}
};

然后Collections.sort(list,com);