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

网友投稿 259 2023-05-25


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,http://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,ehttp://quals,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);

}

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring boot如何添加拦截器
下一篇:Vue异步组件使用详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~