Java中集合的讲解

时间:2022-09-03 16:09:23

问题:
1、什么是集合
2、集合重用的有哪几种
3、集合中HashSet的存储样例
4、集合的遍历方法

集合:存储对象数据的集合容器

单例集合
——–| Collection 单例集合的根接口
————-|List 如果是实现了List接口的集合类,具备的特点:有序,可重复
—————-|ArrayList ArrayList底层是使用了Object数组实现的,特点:查询速度快,增删慢
—————-|LinkedList LinkedList底层是使用了链表数据结构实现的,特点:查询速度慢,增删快
—————-| Vector 底层是使用了Object数组实现的,实现原理与ArrayList是一致的,但是是线程安全的,操作效率低

————-|Set 如果是实现了Set接口的集合类,具备的特点:无序,不可重复
—————-|HashSet 底层是使用了哈希表实现的, 特点:存取速度快

HashSet存储元素的原理
往HashSet添加元素的时候,首先会调用元素的HashCode方法得到元素的哈希码值,然后把哈希码值经过运算算出该元素存在哈希表中的位置
情况1:如果算出的位置目前还没有存在任何的元素,那么该元素可以直接添加到哈希表中
情况2:如果算出的位置目前已经存在其他的元素,那么还会调用元素的equals方法再与这个位置上的元素比较一次
如果equals方法返回的是true,那么该元素被视为重复元素,不允许添加,如果equals返回的是false,那么该元素也可以被添加
—————-|TreeSet 底层是使用了红黑树(二叉树)数据结构实现的,特点:对集合中的元素进行排序存储

TreeSet要注意的事项
1、往TreeSet添加元素的时候,如果元素具备自然顺序的特点,那么TreeSet会根据元素的自然顺序特性进行排序存储
2、往TreeSet添加元素的时候,如果元素不具备自然顺序的特点,那么元素所属的类必须要实现Comparable接口,把比较的规则定义在CompareTo方法上
3、往TreeSet添加元素的时候,如果元素不具备自然顺序的特点,那么元素所属的类也没有实现Comparable接口,那么在创建TreeSet对象的时候必须要传入比较器对象

比较器的定义格式:
class 类名 implements Comparator{
}

双列集合
———|Map 存储的数据都是以键值对的形式存在的,键可以不重复,值可以重复
————|HashMap 底层也是使用了哈希表实现的
————|TreeMap 底层也是使用了红黑树数据结构实现的,默认对元素进行自然排序(String),如果在比较的时候两个对象返回值为0,那么元素重复
————|HashTable 底层也是使用了哈希表维护的,存取的读取快,存储元素是无序的

HashSet样例的说明

class person{
int id;
String name;
public person(int id,String name){
super();
this.id=id;
this.name=name;

}
public String toString(){
return "id是:"+this.id+" name是:"+this.name;
}
}
public class CollectionDemo {

public static void main(String[] args) {
HashSet<person> hs=new HashSet<person>();
hs.add(new person(123,"张三"));
hs.add(new person(123,"张三"));
System.out.println("集合的元素"+hs);

}

}

运行的结果是
集合的元素[id是:123 name是:张三, id是:123 name是:张三]

如果在person类中增加了自己实现的hashCode方法以后

public int hashCode(){
return this.id;
}

运行的结果是
集合的元素[id是:123 name是:张三, id是:123 name是:张三]

如果在person类中增加了自己实现的hashCode方法和equals方法以后

public int hashCode(){
return this.id;
}
public boolean equals(Object obj){
person p=(person)obj;
return this.id==p.id;
}

运行的结果是
集合的元素[id是:123 name是:张三]

集合的遍历方法有常用的for循环 迭代器 entrySet等方法

package cn.xlucas.list;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class CollectionDemo1 {

public static void main(String[] args) {
System.out.println("======get方式遍历=========");
ArrayList<String> ls=new ArrayList<String>();
ls.add("张三");
ls.add("李四");
ls.add("王五");
for(int i=0;i<ls.size();i++){
System.out.println(ls.get(i));
}
//使用迭代器 注意: 迭代器在迭代的 过程中不能使用集合对象修改集合中的元素个数。如果需要修改要使用迭代器的方法进行修改,
System.out.println("======迭代器方式遍历=========");
HashSet<String> hs=new HashSet<String>();
hs.add("张三");
hs.add("李四");
hs.add("王五");
Iterator<String> it=hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("======迭代器方式for增强版遍历=========");
for(String item:hs){
System.out.println(item);
}

System.out.println("======entrySet方式遍历=========");
HashMap<String,String> mp=new HashMap<String,String>();
mp.put("1", "张三");
mp.put("2", "李四");
mp.put("3", "王五");

Set<Entry<String, String>> entrys=mp.entrySet();
for(Entry<String,String> entry:entrys){
System.out.println("键位:"+entry.getKey()+" 值为: "+entry.getValue());
}

}

}

结果为
======get方式遍历=========
张三
李四
王五
======迭代器方式遍历=========
张三
李四
王五
======迭代器方式for增强版遍历=========
张三
李四
王五
======entrySet方式遍历=========
键位:3 值为: 王五
键位:2 值为: 李四
键位:1 值为: 张三