栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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


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


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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/146906.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号