java集合

Java集合分类

数据结构

 一:集合框架的概述

1.集合、数组都是对多个数据进行存储的结构 简称java容器
说明:此时的存储,主要还是内存层面的存储,不涉及持久化存储(数据库、硬盘等等)
2.数组在存储多个数据方面的特点:
》一旦初始化以后,长度就确定了
》指明数组的数据类型 例如:string[] int [] 一旦定义好其数组的类型、其元素的类型也就指定了
2.2数组在存储多个数据方面的缺点
》一旦初始化以后,其长度就不可以修改
》数组中提供的方法非常有限、对于添加、删除、插入数据等操作,非常不便、同事效率不高
》获取数组中实际元素的个数需求,数组没有现存的属性和方法可用
》数组存储的数据的特点:有序、可重复。对于无序、不可重复的需求、不能满足
二:集合框架: collection接口:单列集合,用来存储一个一个的对象
---list接口:存储有序的可重复的数据 ---》“动态数组”
-----arraylist linkedlist vector
---set接口:无序的不可重复的数据-----》高中讲的“集合”
----hashset linkedhashset
----Map接口:双列集合,存储一对一对的数据(key,value)
-----hashmap、linkedhashmap

package CollectionTest.SetList;

import org.junit.Test;

import java.util.*;

/**
 *set接口的框架结构:
 *      1.collection
 *          1.2set接口 储存无序的、不可重复的数据
 *              1.2.1HashSet :作为set接口的主要实现类:线程不安全的;可以储存null值
 *              1.2.1LinkedHashSet: 作为HashSet的子类,特点就是加了一个linked,使得遍历kinkeshashset的时候回按照添加顺序进行输出
 *              1.2.3TreeSet(二叉树:红黑树) : 可以按照添加的对象的指定属性进行排序
 *set接口的:无序和不可重复的数据
 * 1.set作为接口没有定义额外的方法,使用的都是collection的方法
 *
 * @ Author     :wiselee
 * @ Date       :Created in 11:32 2020/4/27
 * @ Description:
 * @ Modified By:
 * @Version: $
 */
public class SetTest {
    /*
    * set:储存无序的、不可重复的数据
    * 1.无序性:不等于随机性
    *以hashset为例:储存的数据在底层数组中并非按照数组索引的顺序添加,而是根据数组的hash值来决定
    *
    * 2.不可重复性:保证添加的元素按照equals判断是不能返回true,即相同的元素不能添加进来,只能添加一个
    * 3.添加元素的过程:以hashset为例:
    * 我们向hashset中添加元素:a,首先调用元素a的所在类的hashcode()方法,计算元素的哈希值,次哈希值通过某种算法
    * 计算出在hashset在底层数组中的存放位置(即:索引位置),判断此位置是否为null
    * 如果此位置没其他元素,则元素a就直接添加成功(情况一),如果此位置有其他元素,则调用hash值比较哈希值的异同,如果不同则添加成功(情况二)如果相同则需要调用a的equals方法进行比较,如果返回为true则添加失败,如果返回false则添加成功(情况三)
    *
    *   对于添加成功的情况2、情况3而言:元素a与已经存在的指定索引位置上的位置上以链表的方式存储
    * jdk7:元素a放在数组中,指向原来的元素
    * jdk8:原来的元素在数组中,指向元素a
    *   总结:七上八下
    *hashset底层:数组加链表
    *
    *
    * 2.要求:向set中添加的数据,其所在的类一定要重写hashcode equals
    *   要求:重写的hashcode euqals尽可能保证一致性
    * */
    @Test
    public void test1(){
        Set set = new HashSet();
        set.add(456);
        set.add(123);
        set.add("aa");
        set.add("bb");
        set.add(new User("jj",12));
        set.add(new User("jj",12));
        set.add(159);
        set.add(159);

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

    }
    /*LinkedHashSet的使用
    LinkedHashSet作为hashset的子类,再添加数据的同时,每个数据还维护了两个引用,记录前一个数据和后一个数据
    对于频繁的遍历操作,LinkedHashSet比hashset快一些
    *
    *
    * */
    @Test
    public void test2(){
        Set set = new LinkedHashSet();
        set.add(456);
        set.add(123);
        set.add("aa");
        set.add("bb");
        set.add(new User("jj",12));
        set.add(new User("jj",12));
        set.add(159);
        set.add(159);

        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
    @Test
    public void test3(){
        TreeSet set = new TreeSet();
        //不能添加不同类的对象:失败
//        set.add(123);
//        set.add(456);
//        set.add("aa");
        //举例一
//        set.add(123);
//        set.add(2123);
//        set.add(3);
//        set.add(23);
//        set.add(9);
//        Iterator iterator = set.iterator();
//        while (iterator.hasNext()){
//            System.out.println(iterator.next());
//        }
        /*自然排序
        定制排序
        *
        自然排序中:比较两个对象是否相同的标准为:compareto()返回是否为0
        *定制排序:comparator 比较两个对象是否相同的标准为:compareto()返回是否为0
        * */
        //举例二
        set.add(new User("tom",12));
        set.add(new User("jj",12));
        set.add(new User("hh",13));
        set.add(new User("pp",122));
        set.add(new User("to",15));
        set.add(new User("om",18));
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }
    @Test
    public void test4(){
        Comparator com = new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof User && o2 instanceof User){
                    User u1 = (User)o1;
                    User u2 = (User)o2;
                    return Integer.compare(u1.getAge(),u2.getAge());
                }else {
                    throw new RuntimeException("输入数据不一致");
                }

            }
        };
        TreeSet set = new TreeSet(com);
        set.add(new User("tom",12));
        set.add(new User("jj",12));
        set.add(new User("hh",13));
        set.add(new User("pp",122));
        set.add(new User("to",15));
        set.add(new User("om",18));
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

    }


}
posted @ 2022-11-13 20:00  wiselee/  阅读(20)  评论(0编辑  收藏  举报