---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
今天和昨天学习了集合里面的Set集合和Map集合,主要包含Set集合和List集合的区别,Set集合子类的特点及原理,Map集合的特点,Map集合和Colleaction集合的区别,Map集合的遍历方式。
1:Set集合和List集合的区别:
Set集合和List集合是Collection集合下的两个子接口,Set集合和List集合的区别:
Set集合中的元素是唯一的并且是存入和取出的顺序是不同的。
List集合中的元素是可以重复的并且元素的取出顺序和存入顺序是相同的。
2:List集合的子类特点及原理:
List集合常见的子类有三个,分别是HashSet,TreeSet和LinkedHashSet。
特点及原理:
A:HashSet:HashSet集合的底层数据结构是哈希表结构,HashSet里面的元素唯一是依赖于两个方法,分别是hashCode()和equals()。
执行原理是给集合中存入一个元素的时候,首先会在内部调用hashCode()方法,比较要存入的元素的哈希值是否和集合中已有元素的哈希值相同,如果返回的结果是false,则说明与集合中已有元素不重复,将其添加到集合中。如果返回的结果是true,那么就调用equals()方法比较哈希值相同的元素的内容是否相同,如果返回结果是false,则说明不重复,将其添加到集合中,如果返回的结果是true,则说明该元素与集合中已经存在的元素是重复的,不会将其添加到集合中。
因为String类中重写了hashCode()方法和equals()方法,所以添加String类型对象的时候不用重写这两个方法,但是如果添加的对象是自定义类,那么在定义类的时候要重写hashCode()方法和equals()方法,否则不能保证集合中元素的唯一性。
B:TreeSet集合:TreeSet集合的底层数据结构是二叉树节后,TreeSet集合里面的对象的唯一是取决于实现comparable接口或者comparator接口后对对象的变量进行比较,如果返回值为0,那么说明两个对象重复,就不会将其添加到集合中。
TreeSet集合还可以对存入集合中的对象按照一定的规则进行排序(不是存取顺序),其原理与保证唯一性的原理相同,也是通过实现comparable接口或者comparator接口后返回的数值进行判断,如果返回的是正数,就是按照该变量从小到大的顺序进行排序,如果返回的是负数,那么就是按照该变量从大到小的顺序进行排序。TreeSet的排序有两种,分别是自然排序和比较器排序。自然排序就是元素所属的类实现comparable接口,类中的元素具备比较性。比较器排序就是集合的构造方法接收comparator接口,这样集合就具备比较性。
C:LinkedHashSet集合:LinkedHashSet集合是Set集合中的一个特殊的集合,它的底层数据结构是哈希表和链表。哈希表保证元素唯一,链表保证元素有序。所以LinkedHashSet集合中的元素是唯一并且有序的。
3:TreeSet集合存取元素的方式:
TreeSet的底层数据结构是二叉树结构,在存储元素的时候把第一个元素存入根节点,后面要存入的每一个元素都和根节点的元素进行比较,如果小于根节点,那么就存入根节点的左边,大于根节点就存入根节点的右边,依次向下存。在取出元素的时候,是从左向右去的,保证取出来的是从小到大排列的。
下面的例子是通过HashSet集合对元素进行遍历的
/*
需求:通过HashSet集合存储字符串并进行遍历
*/
import java.util.HashSet; //导入所需的包
public class HashSetDemo {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<String>(); //创建集合对象
hs.add("hello"); //添加元素
hs.add("world");
hs.add("java");
hs.add("java");
for (String s : hs) { //遍历集合
System.out.println(s);
}
}
}
这段代码的输出结果是hello java world,去除了重复的元素,顺序也发生了变化。
4:Map集合的特点:
Map集合是用于存储键值对元素的集合,Map集合中的键是唯一的,值是可以重复的。
5:Msp集合和Collection集合的区别:
Map集合是存储键值对的双列集合,其中的键是唯一的,值是可重复的。
Collection集合是单列集合,其中的子类Set中的元素是唯一并且无序的,List中的元素是有序可重复的。
6:Map集合的子类:
Map的常见子类有4个,分别是HashMap,TreeMap,LinkedHashMap和Hashtable。
HashMap和Hashtable的区别:
HashMap:线程不安全,效率高,允许null值和null键。
Hashtable:线程安全,效率低,不允许null值和null键。
7:Map集合的遍历方式:
Map集合的遍历方式有两种,一种是通过键获取值,另一种是通过键值对对象获取键和值。
下面一段代码就是通过两种遍历方式对HashMap集合进行遍历的例子:
/*
需求:用HashMap集合存储字符串并用两种方式进行遍历
*/
import java.util.HashMap;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
//创建Map集合
HashMap<String,String> map = new HashMap<String,String>();
//向集合中添加元素
map.put("吕布","貂蝉");
map.put("郭靖","黄蓉");
map.put("孙权","小乔");
map.put("周瑜","大乔");
//方式1:通过键获取值
Set<String> set = map.keySet();
for(String key : set) {
String value = map.get(key);
System.out.println(key+"--"+value);
}
//方式2:通过键值对对象获取键和值
Set<Map.Entry<String,String>> keySet = map.entrySet();
for(Map.Entry<String,String> me : keySet) {
String value = me.getValue();
String key = me.getKey();
System.out.println(key + "--" + value);
}
}
}
经过这几天的学习,集合部分的内容大概就学完了,集合的内容比较多,需要多多加强啊。
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com" target="blank">www.itheima.com</a>