欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-01 11:51:22
本篇仅为了巩固一下基础,回忆一下存储的这两个常用的东东… 一、collection 1.存储对象可以考虑:①数组②结合 2.数组存储对象的特点:student[] s...

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

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

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