java的集合

 

 

 

 

 

 

Conllection常用功能

 

    public boolean add(E e): 把给定的对象添加到当前集合中
    public  void  clear(); 情况集合中所有的元素,但是不删除集合,集合是空而已
    public boolean remove(e);把给定的对象在当前的集合中删除,集合中存在则删除并返回true,不存在则返回false
    public  boolean contains(E e);判断当前集合是否含有给定对象
    public boolean isEmpty(); 判断当前集合是否给空
    public  int size();返回集合的元素个数
    public Object[] toArray() 把集合中的元素,存储到数组中

 

public class DemonCollection {
    public static void main(String[] args) {
//        创建集合对象,可以使用多态,接口指向一个实例类
        Collection<String> coll = new ArrayList<>();
        System.out.println(coll);//重写了toString方法
        boolean bl = coll.add("quan");
        coll.add("QQQ");
        System.out.println(coll);
//删除元素
        System.out.println(coll.remove("QQQ"));
        System.out.println(coll.remove("QQ"));
//判断是否包含元素
        System.out.println(coll.contains("quan"));
//判断是否为空
        System.out.println(coll.isEmpty());
//集合元素的多少
        System.out.println(coll.size());

        Object[] arr = coll.toArray();
        System.out.println(arr);

        coll.clear();
        System.out.println(coll.isEmpty());
    }
}

结果:

[]
[quan, QQQ]
true
false
true
false
1
[Ljava.lang.Object;@1b6d3586
true

 

Iterator 迭代器

 

 

迭代器用于对集合进行百年来
    boolean hasNext() 如果有元素可以迭代,则返回true
                        判断集合中还有没有下一个元素,如果有则返回true,没有则返回false
     E  next() 返回迭代的下一个元素。取出集合的下一个元素

     Iterator 地带其,是一个接口,我们二u发直接使用,需要使用Iterator
     接口的实现对象,获取实现类的方法比较特殊
     Conllection 接口中国有一个方法,叫iterator(),这个方法返回的就是迭代器的实现对象

     迭代器使用步骤:
        使用集合中的方法iterator获取迭代器 实现类对象,使用Iterator接口接受(多态)
        使用Iterator 接口中的方法hashnext 判断是否有下一个元素
        使用Iterator 接口中的方法next ,取出集合中的下一个元素
     注意:
     使用集合中的方法创建迭代器的时候,使用Iterator接口接受(多态)
     Iterator<E>也有泛型,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
     如果没有元素还进行取出,会返回异常:java.util.NoSuchElementException
 */

 

public class Demon {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("QQQQ");
        coll.add("AAA");
        coll.add("BBB");
        coll.add("DDDD");
//多态        接口              实现类对象
        Iterator<String> it = coll.iterator();
        boolean bl = it.hasNext();
        System.out.println(bl);

        String st = it.next();
        System.out.println(st);

//        知道长度用for,不知道长度用while
        while(it.hasNext()){
            System.out.println(it.next());
        }

    }
}
/*
true
QQQQ
AAA
BBB
DDDD
 */

 

 

增强for循环

/*
Collection<E> extends Iterable<E>,所有单鞋集合恶斗可以使用增强for

public interface Iterable<T>
实现此接口允许对象成为“for-each loop”语句的目标。

    增强for循环,用来遍历结合和数组
    格式:
        for(集合/数组的数据类型 变量名:集合名/数组名){
            sout(变量名)
        }
 */
public class DemoFor {
    public static void main(String[] args) {
        demo01();
        demo();
    }

//    遍历集合
    private static void demo(){
        ArrayList<String>  arrl = new ArrayList<>();
        arrl.add("QQQ");
        arrl.add("WWW");
        arrl.add("RRR");
        for (String str:arrl){
            System.out.println(str);
        }
    }
//遍历数组
    private  static  void demo01(){
        int [] arr = {1,1,2,3,4};
        for(int i:arr){
            System.out.println(i);
        }
    }
}
/*
1
1
2
3
4
QQQ
WWW
RRR

 */

 

List

 

 

 

IndexOutOfBoundsException越界异常:

public class d1 {
 
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
//安装存的方式输出,打印的不是地址,证明重写的toString
        System.out.println(list);

        list.add(1,"D");
        System.out.println(list);

//        移除a元素,返回移除的元素
        System.out.println(list.remove(0));
        System.out.println(list);

//      特换指定索引的元素,并返回所替换的元素内容
        System.out.println(list.set(0,"ddd"));
        System.out.println(list);

//        list集合遍历方式
        for (int i = 0;i<list.size();i++){
            System.out.println(list.get(i));
        }
        System.out.println("############");
        //d迭代器遍历
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("############");
//        增强for循环
        for (String s :list){
            System.out.println(s);
        }
   }

}

 

List子类

ArrayList集合:

 

 

 

linkedList集合

 

 

 

/*
特点:
    底层是一个链表结构,查询慢,增删块
    里面包含大量操作单点首位方法,不能用多态
    注意:使用LinkedList 集合特有的方法,不能使用多态
 */

import java.sql.ClientInfoStatus;
import java.util.LinkedList;
import java.util.List;

public class LinkListT {
    public static void main(String[] args) {
        show1();
        show2();
    }

    private static void show2(){
        LinkedList<String> lisked = new LinkedList<>();
        lisked.add("QQ");
        lisked.add("DAWI");
        lisked.add("UUUU");

        String first = lisked.getFirst();
        System.out.println(first);

        String second = lisked.getLast();
        System.out.println(second);

        lisked.clear();
        
    }

    private  static void show1(){
        LinkedList<String> linked = new LinkedList();

        linked.add("A");
        linked.add("B");
        linked.add("C");
        System.out.println(linked);

        linked.addFirst("ONE");
        System.out.println(linked);

        linked.addLast("last");
        System.out.println(linked);


    }

}
/*
[A, B, C]
[ONE, A, B, C]
[ONE, A, B, C, last]

 Vector,认识就好

  • Vector类实现了可扩展的对象数组。 像数组一样,它包含可以使用整数索引访问的组件。 但是, Vector的大小可以根据需要增长或缩小,以适应在创建Vector之后添加和删除项目。

 

 

Set接口

/*
    set特点:
         不允许存储重复元素
         没有索引,没有索引的算法不能通过普通for遍历
    HashSet特点:
        不允许存储重复元素
         没有索引,没有索引的算法不能通过普通for遍历
         是一个无序的集合,存储元素和取出元素的顺序有可能不一致
         底层是一个哈希表结构,查询结构非常块
 */

 

public class DDD1 {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();

        set.add(21);
        set.add(3);
        set.add(4);
        set.add(21);
//        使用迭代器遍历
        Iterator<Integer> it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

        System.out.println("############");
        for (Integer i:set){
            System.out.println(i);
        }
    }
}
/*
3
4
21
############
3
4
21
 */

 

HashSet集合存储数据结构—哈希表

/*
哈希值:是一个十进制的整数,由系统随机给出
        (就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)
        在Object 类有一个方法,可以获取对象的哈希值
        int hashCode()
            返回对象的哈希码值。
 */

 

public class HashCode {
    public static void main(String[] args) {
        //    person类默认继承了object类,可以使用hashCode方法
        Person person = new Person();
        int h1 = person.hashCode();
        System.out.println(h1);


        Person person2 = new Person();
        int h2 = person2.hashCode();
        System.out.println(h2);
////        toString 源码
//        public String toString() {
//            return getClass().getName() + "@" + Integer.toHexString(hashCode());
//        }
        System.out.println(person);//这里的哈希值是上面哈希值的16进制表示方法
        System.out.println(person2);

//        字符串类的哈希值
        String s = new String("abc");
        String s1 = "abc";
        String ss = new String("abc");

        System.out.println(s.hashCode());
        System.out.println(ss.hashCode());
        System.out.println(s1.hashCode());
    }
}
/*
460141958
1163157884
quan.set.Person@1b6d3586
quan.set.Person@4554617c
96354
96354
96354
 */

 

 

 

 

 

 

 

 

HashSet存储自定义的元素:

//存储自定义类型元素
//set集合保证元素唯一:
//    存储的元素,必须重写hashVCode和equals方法

 

 

自定义的类:

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

    public Person() {
    }

    public Person(String name, int age) {
        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;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

hashset储存:

public class SetPerson {
//    要求同名同年龄的人,视为同一个人,只能村一次
    public static void main(String[] args) {
        HashSet<Person> hp = new HashSet<>();
        Person p1 = new Person("quan",22);
        Person p2 = new Person("quan",22);
        Person p3 = new Person("quan",11);

        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());

        hp.add(p1);
        hp.add(p2);
        hp.add(p3);
        System.out.println(hp);
    }
}
/*
107941030
107941030
[Person{name='quan', age=11}, Person{name='quan', age=22}]
 */

 

LinkedHashSet

/*
java.util.LinkedHashSet集合 extends HashSet集合
    LinkedHashSet集合提点:
        底层是一个哈希表(数组+链表/红黑树)+链表
        多了一个链表(就hi了元素的存储顺序),保证元素有序
 */
public class LinkHashSet {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("www");
        set.add("abc");
        set.add("quan");
        set.add("abc");
        System.out.println(set);//不允许重复,无序

        LinkedHashSet<String> linkedset = new LinkedHashSet<>();
        linkedset.add("www");
        linkedset.add("abc");
        linkedset.add("quan");
        linkedset.add("abc");
        System.out.println(linkedset);//不允许重复,有序
    }
}

 

操作集合的工具

 

 

/*
    sort方法的使用前提,
    对排序的集合里面必须实现Comparable ,重写定义排序的规则

    Comparable的排序规则
        自己(this) - 参数:升序
 */

 

public class Demo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
//        集合加入多个元素,因为addALL是静态方法
        Collections.addAll(list,"A","tt","b","uu","B");
        System.out.println(list);
//打乱顺序,打乱集合的顺序
        Collections.shuffle(list);
        System.out.println(list);
//自然排序
        Collections.sort(list);
        System.out.println(list);

        ArrayList<Integer> listInt = new ArrayList<>();
        listInt.add(22);
        listInt.add(21);
        listInt.add(12);
        listInt.add(42);
        System.out.println(listInt);



//        sort<List<T> list> 将集合中的元素安装默认规则排序
        Collections.sort(listInt);//默认是升序排序
        System.out.println(listInt);

        ArrayList<Person> personlist = new ArrayList<>();
        personlist.add(new Person("AA",12));
        personlist.add(new Person("BB",9));
        personlist.add(new Person("CC",82));
        System.out.println(personlist);

        Collections.sort(personlist);
        System.out.println(personlist);

    }
}

结果:

[A, tt, b, uu, B]
[A, B, b, tt, uu]
[A, B, b, tt, uu]
[22, 21, 12, 42]
[12, 21, 22, 42]
[Person{name='AA', age=12}, Person{name='BB', age=9}, Person{name='CC', age=82}]
[Person{name='BB', age=9}, Person{name='AA', age=12}, Person{name='CC', age=82}]

其中Person类:

package quan.kebvian;

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


    public Person() {
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", 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;
    }

    @Override
    public int compareTo(Person o) {
//        return 0;表示元素都是相同的
//        自定义比较的规则,比较两个人的年龄
//        return .getAge() - this.getAge();//年龄降序序排序
        return this.getAge() - o.getAge();//年龄升序排序
    }
}

 

Comparator和Comparable的区别

/*
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较规则
Comparator: 相当于找一个第三方的裁判,比较两个

Comparator 的排序规则
    o1 -o2 升序
 */

 

 

public class Comparator {
    public static void main(String[] args) {
        ArrayList<Integer> listInt = new ArrayList<>();
        listInt.add(22);
        listInt.add(21);
        listInt.add(12);
        listInt.add(42);
        System.out.println(listInt);

        Collections.sort(listInt, new java.util.Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        System.out.println(listInt);


        System.out.println("@@@@@@@@@@@@@@@@@");
        ArrayList<Person> personlist = new ArrayList<>();
        personlist.add(new Person("AA",12));
        personlist.add(new Person("BB",90));
        personlist.add(new Person("CC",12));
        personlist.add(new Person("DD",9));
        System.out.println(personlist);

        Collections.sort(personlist, new java.util.Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        System.out.println(personlist);


        Collections.sort(personlist, new java.util.Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int re = o1.getAge() - o2.getAge();
//                如果两个人的年龄相同,再使用姓名的首字母比较
                if (re == 0){
                    re = o1.getName().charAt(0) -o2.getName().charAt(0);
                }
                return re;
            }
        });
        System.out.println(personlist);

    }
}
[22, 21, 12, 42]
[12, 21, 22, 42]
@@@@@@@@@@@@@@@@@
[Person{name='AA', age=12}, Person{name='BB', age=90}, Person{name='CC', age=12}, Person{name='DD', age=9}]
[Person{name='DD', age=9}, Person{name='AA', age=12}, Person{name='CC', age=12}, Person{name='BB', age=90}]
[Person{name='DD', age=9}, Person{name='AA', age=12}, Person{name='CC', age=12}, Person{name='BB', age=90}]

 

posted @ 2020-05-31 18:20  小丑quan  阅读(213)  评论(0)    收藏  举报