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

发布时间 - 2026-01-11 00:34:39    点击率:

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

一、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);
    }
  }
}

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


# java  # Collection  # Collection详解  # Collection实例  # JAVA对list集合进行排序Collections.sort()  # 如何解决Mybatis--java.lang.IllegalArgumentException: R  # JAVA collection集合之扑克牌游戏实例  # 浅谈Java中Collection和Collections的区别  # 详解java中的Collections类  # 用Java集合中的Collections.sort方法如何对list排序(两种方法)  # java Collection 之Set使用说明  # 遍历  # 重写  # 这两个  # 自定义  # 都是  # 实现了  # 若此  # 迭代  # 在这里  # 很好  # 好了  # 在此  # 已有  # 但在  # 希望能  # 就不能  # 是说  # 仅是  # 当我们  # 将此 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: PythonWeb开发入门教程_Flask快速构建Web应用  如何快速搭建高效香港服务器网站?  Laravel怎么实现验证码(Captcha)功能  Laravel如何实现API资源集合?(Resource Collection教程)  深圳网站制作平台,深圳市做网站好的公司有哪些?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  js实现点击每个li节点,都弹出其文本值及修改  深圳网站制作培训,深圳哪些招聘网站比较好?  如何挑选优质建站一级代理提升网站排名?  如何用PHP快速搭建CMS系统?  利用vue写todolist单页应用  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  电商网站制作价格怎么算,网上拍卖流程以及规则?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  Laravel如何配置Horizon来管理队列?(安装和使用)  如何快速生成可下载的建站源码工具?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  香港网站服务器数量如何影响SEO优化效果?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  详解jQuery中基本的动画方法  黑客入侵网站服务器的常见手法有哪些?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何在万网主机上快速搭建网站?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  WEB开发之注册页面验证码倒计时代码的实现  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  如何快速搭建虚拟主机网站?新手必看指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  ,交易猫的商品怎么发布到网站上去?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网站建设要注意的标准 促进网站用户好感度!  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Bootstrap整体框架之CSS12栅格系统  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Laravel如何优化应用性能?(缓存和优化命令)  googleplay官方入口在哪里_Google Play官方商店快速入口指南  详解jQuery停止动画——stop()方法的使用  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤