首页 > 编程语言 >java集合

java集合

时间:2022-11-13 20:13:27浏览次数:42  
标签:set java iterator add User 数组 集合 new

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());
        }

    }


}

标签:set,java,iterator,add,User,数组,集合,new
From: https://www.cnblogs.com/wiseleer/p/16886763.html

相关文章

  • Java数组工具类Arrays
    Arrays所在的包是Java.util.*,Arrays提供的全部是static方法。1.转字符串1.1一维数组--publicstaticStringtoString(int[]a)参数即可以是基础类型数组,也可以是包装......
  • idea将java项目打成jar包并使用
    1.首先编写一个工具类2.进行打包操作)3.Build之后在项目的out包下面就出现了一个jar包在新建一个项目新建lib文件夹将jar包放进去4.最后即可调用......
  • Java自学,要有技巧的学
    学习Java是有一定技巧和方法的,钻牛角尖的去学习它,只能让你感觉到费神费力,最终陷入到无穷无尽的细枝末节之中。然后渐渐的消磨掉你的耐心,直到你放弃。  学习的过程都是......
  • JavaScriptの类型
    前言此篇小结来源与《你不知道的JavaScript》和《JavaScript高级程序设计》的结合??或许是的,龟速总结中...七种内置类型nullundefinedbooleannumberstringobjectsy......
  • day2 java基础语法
    day1复习1.java的特点  2.jdk,jre,jvm的关系  3.为什么要配置path 基本语法1.关键字与保留字    2.标识符与标识符规则  3.java的命名规范 ......
  • java.方法.learn
    1.方法:什么是方法,方法的格式,方法的好处  2.方法的格式:把一些代码打包在一起,用到的时候就调用 一:最简单方法定义和调用:  二:带参数的方法调用:    形......
  • 大学生HTML期末作业, JavaScript期末大作业
    ......
  • 【Javaweb】四(关于接口类的作用)
    这里我们还是以房产信息管理系统的题目举例:   发现在DAO层和service层都有接口类(注:impl是实现类)为什么要用接口,不直接写实现类:1、简单、规范性:这些接口不仅告诉开......
  • Day3-4 包机制,JavaDoc
    包机制为了更好地组织类,java提供包机制,用于区别类名的命名空间鲍鱼举的语法格式为 packagepkg1[.pkg2[.pkg3...]] 一般利用公司域名倒置作为包名......
  • 【Java】Java中StringBuilder()成员方法append()和toString()
    StringBuilder就相当于C++的String长度可变,用于构造字符串对象,内部使用自动扩容的数组操作字符串数据。StringBuilder和StringBuffer使用的是相同的API【区别单独开一篇来......