热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

java中Collection存储器详解及简单实例

这篇文章主要介绍了java中Collection存储器详解及简单实例的相关资料,需要的朋友可以参考下

本篇仅为了巩固一下基础,回忆一下存储的这两个常用的东东…

一、Collection

1.存储对象可以考虑:①数组②结合

2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Stutdent();……

弊端:①一旦创建,其长度不可变
    ②真实的数组存放的对象的个数是不可知的

3.集合

Collection接口
    丨------List接口:存储有序,可以重复的元素
        丨-------ArrayList(主要的实现类,首选)
        丨-------LinkedList(频繁的插入,删除)
        丨-------Vector(古老的实现类,线程安全)
    丨------Set接口:存储无序,不可重复的元素,Set中常用的方法都是Collection下定义的
        丨-------HashSet(主要实现类)
        丨-------LinkedHashSet
        丨-------TreeSet

例: (这里主要是说Set接口)

1)HashSet

Set存储的元素是无序的,是不可重复的!

1.无序性:无序性 != 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。(根据hash值来存)

2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。

//说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashcode()方法。进而保证set中元素的不可重复性!

set中的元素时如何存储的呢?使用了哈希算法。

当向set中添加元素时,首先调用此对象所在类的hashCode()方法,计算此对象的hash值,此哈希值决定了此对象在set中的存储位置,若此位置之前没有对象存储,则此对象直接存到这个位置。(就好比一个教室,按号入座一样),若已有对象存储,在通过equals()方法比较这两个对象的是否相同,如果相同后一个对象不能再添加进来。

万一返回false呢?都存储。(不建议如此)

//>要求:hashcode()方法要与equals()方法一致。

事例代码如下:

public class TestSet{

  @Test
  public void testHashSet(){
    Set set = new HashSet();
    set.add(123);
    set.add(456);
    set.add(new String("AA"));
    set.add(new String("AA"));//若此时在这里加上相同元素,则加不进去。
    set.add("BB");
    set.add(null);
    System.out.println(set.size());
    System.out.println(set);
  }
}

2)LinkedHashSet()

/*
 *LinkedHashSet:使用链表维护了一个添加进集合中的顺序,导致当我们遍历LinkedHashSet集合元素是按照 
 *添加进去的顺序遍历的!但是存储是无序的!
 *LinkedHashSet得插入性能略低于HashSet,但在迭代访问Set里的全部元素时有很好的性能。
 *LinkedHashSet不允许集合元素重复。
 */
public class TestLinkedHashSet{

  @Test
  public void testLinkedHashSet(){
    Set set = new LinkedHashSet();
    set.add(123);
    set.add(456);
    set.add(new String("AA"));
    set.add(new String("AA"));
    set.add("BB");
    set.add(null);
    System.out.println(set.size());
    System.out.println(set);

    //迭代器去遍历
    Iterator iterator = set.iterator();
    while(iterator.hasNext()){
      System.out.println(iterator.next());
    }
  }
}
输出为:123,456,AA,BB,null

3)TreeSet

/*
 *1.向TreeSet中添加的元素必须是同一个类的
 *2.可以按照添加进集合中的元素的指定的顺序遍历,像String,包装类等默认按照从小到大的顺序遍历
 *3.当向TressSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
 *4.自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)
  在此方法中,指明按照自定义类额哪个属性进行排序。
 *5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的子属性值相同,  但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
 *>compartTo()与hashCode();以及equals()三者保持一致!
 */
False:
public class TestTreeSet{
  //这样添加会报出一个CastException,会出现异常
  @Test
  public void testTreeSet(){
    Set set = new TreeSet();
    set.add(123);
    set.add(456);
    set.add(new String("AA"));
    set.add(new String("AA"));
    set.add("BB");
  }
}
True:
public class TestTreeSet{

  @Test
  public void testTreeSet(){
    Set set = new TreeSet();
//   set.add(new String("AA"));
//   set.add(new String("AA"));//相同的元素没有进去
//   set.add("JJ");
//   set.add("GG");
//   set.add("MM");

    //String没有报错是以为String类型实现了Comparable接口,已经重写好了排序的方法

    //当Person类没有实现Comparable接口时,当向TreeSet中添加Person对象时,报   //ClassCastException
    set.add(new Person("CC",23));
    set.add(new Person("MM",21));
    set.add(new Person("GG",25));
    set.add(new Person("JJ",24));
    set.add(new Person("KK",20));//新加一个KK,但是age相同
    set.add(new Person("DD",20));

    for(Object str : set){
      System.out.println(str);
    }
  }
}
输出为AA,GG,JJ,MM

//当向TreeSet中添加Person类的对象时,依据此方法,确定按照哪个属性排列。
//需要重写compareTo方法
//Person(name,age,get/set方法,空构造器,toString,equals,hashCode)

  @Override
  public int compareTo(Object o){
    if(o instanceof Person){
      Person p = (Person)o;
    // return this.name.compareTo(p.name);  从小往大排
    // return -this.name.compareTo(p.name);  从大往小排
      int i = this.age.compareTo(p.age);
      if(i == 0){
        return this.name.compareTo(p.name);
      }else{
        return i ;
      }
    }
    return 0;
  }
//定制排序

//Customer(name,id,get/set方法,空构造器,toString,equals,hashCode)
public class TestTreeSet{

  @Test
  public void testTreeSet2(){
  //1.创建一个实现了Comparator接口的类对象
    Comparator com = new Comparator(){
      //
      @Override
      public int compare(Object o1,Object o2){
        if(o1 instanceof Customer && o2 instanceof Customer){
          Customer c1 = (Customer)o1;
          Customer c2 = (Customer)o2;
          int i = c1.getId().compareTo(c2.getId());
          if(i == 0){
            return c1.getName().compareTo(c2.getName());
          }
          return i;
        }
        return 0;
      }
    };
    //2.将此对象作为形参传递给TreeSet的构造器中
    TreeSet set = new TreeSet(com);
    //3.向TreeSet中添加Comparator接口中的compare方法中涉及的类的对象
    set.add(new Customer("AA",1003));
    set.add(new Customer("BB",1002));
    set.add(new Customer("GG",1004));
    set.add(new Customer("CC",1001));
    set.add(new Customer("DD",1001));

    for(Object str : set){
      System.out.println(str);
    }
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 本文深入探讨了动态赋值的概念及其在编程实践中的应用,特别是通过Java代码示例来展示如何利用循环结构动态地为数组分配值。 ... [详细]
  • 在解决ACM竞赛题目或力扣挑战时,通常面临1秒到2秒的时间限制。为了确保程序能够高效运行,C++等语言的代码执行次数建议不超过1千万次。 ... [详细]
  • 变量间相关性分析
    本文探讨了如何通过统计方法评估两个变量之间的关系强度,重点介绍了皮尔森相关系数的计算及其应用。除了数学公式外,文章还提供了Python编程实例,展示如何利用实际数据集(如泰坦尼克号乘客数据)进行相关性检验。 ... [详细]
  • OpenCV中的霍夫圆检测技术解析
    本文详细介绍了如何使用OpenCV库中的HoughCircles函数实现霍夫圆检测,并提供了具体的代码示例及参数解释。 ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 本文介绍了如何利用OpenCV库进行图像的边缘检测,并通过Canny算法提取图像中的边缘。随后,文章详细说明了如何识别图像中的特定形状(如矩形),并应用四点变换技术对目标区域进行透视校正。 ... [详细]
  • 本文将探讨一个经典算法问题——最大连续子数组和。我们将从问题定义出发,逐步深入理解其背后的逻辑,并通过实例分析加深理解。 ... [详细]
  • 本文介绍了多维缩放(MDS)技术,这是一种将高维数据映射到低维空间的方法,通过保持原始数据间的关系,以便于可视化和分析。文章详细描述了MDS的原理和实现过程,并提供了Python代码示例。 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
author-avatar
燕阳阳消_469
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有