判断集合元素唯一的原理-ArrayList的contains和HashSet的contains、add。Map接口、 集合嵌套
2018-10-17 10:59
1271 查看
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/20cd93f3f05cbfe8de8496128f8d2012.png)
1、判断集合元素唯一的原理
(1)ArrayList的contains方法判断元素是否重复原理
Contains():boolean类型,当此列表中含有元素的时候,返回true
ArrayList的contains方法会使用调用方法时,传入的元素的equals方法依次与集合中的旧元素所比较,从而根据返回的布尔值判断是否有重复元素。此时,当ArrayList存放自定义类型时,由于自定义类型在未重写equals方法前,判断是否重复的依据是地址值,所以如果想根据内容判断是否为重复元素,需要重写元素的equals方法。
(2)HashSet的contains、add判断元素重复的原理
add():添加指定元素
contains():当set中含有元素的时候,返回true
Set集合不能存放重复元素,其添加方法在添加时会判断是否有重复元素,有重复不添加,没重复则添加。
HashSet集合由于是无序的,其判断唯一的依据是元素类型的hashCode与equals方法的返回结果。规则如下:
先判断新元素与集合内已经有的旧元素的HashCode值
如果不同,说明是不同元素,添加到集合。
如果相同,再判断equals比较结果。返回true则相同元素;返回false则不同元素,添加到集合。
所以,使用HashSet存储自定义类型,如果没有重写该类的hashCode与equals方法,则判断重复时,使用的是地址值,如果想通过内容比较元素是否相同,需要重写该元素类的hashcode与equals方法。
2、Map接口
(1)Map接口介绍:
Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
Collection中的集合称为单列集合,Map中的集合称为双列集合。
需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
Map中常用的集合为HashMap集合、LinkedHashMap集合。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/38c276e9f1122752d9f158acfc1f0bd5.png)
(2)Map接口中的常用集合
Map有多个子类,我们主要介绍HashMap集合、LinkedHashMap集合。
HashMap<K,V>:存储数据采用的哈希表结构(数组和链表的结合结构),元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
(3)Map接口中的常用方法
get方法:获取指定键(key)所对应的值(value)
put方法:将指定的键与值对应起来,并添加到集合中
方法返回值为键所对应的值
使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;
使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。
(4)Map接口遍历
键找值方式:即通过元素中的键,获取键所对应的值
keySet()方法
步骤:
1、获取Map集合的键,因为键是唯一的,所以返回一个Set集合存储所有的键
Map<String,String> map=new HashMap<String,String>();
2、返回一个Set集合存储所有的键Set<String> set=map.keySet();
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/9d65957f889aed610afbf4177fd01115.png)
3、
遍历键的Set集合,得到每一个键
4.根据键,获取键所对应的值
流程图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/809a6bce1791b8432349b732be420c2e.png)
entrySet();方法Map类设计时,提供了一个嵌套接口:Entry,Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
Entry是Map接口中提供的一个静态内部嵌套接口。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/52784ba95fd81c9c7c2684c4b9a3dd86.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/ad26905974140fc0f145c671b480e705.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/5bce0cdb34016b7b9eb57390f2b03e19.png)
entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
getKey()方法:获取Entry对象中的键
getValue()方法:获取Entry对象中的值
entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201810/44fea5b02fd19947c4c2eaac82bfbd6e.png)
map方法、遍历练习:两种方法:keySet和entrySet
package demo02; import java.util.HashMap; import java.util.Map; import java.util.Set; public class Demo02 { public static void main(String[] args) { Map<String,String> map=new HashMap<String,String>(); //Map的常用方法 map.put("1", "a"); map.put("2", "b"); map.put("2", "z"); map.put("3", "c"); //移除 map.remove("3"); //取数据 System.out.println(map.get("1")); System.out.println(map.get("2")); System.out.println(map.get("3")); //遍历keySet() //第一步=获取map中的key锁对象应的Sst集合 Set<String> set=map.keySet(); //第二部遍历set找到每一个key值 for(String s:set){ String key=s; String value=map.get(key); System.out.println(key+" "+value); } //2、entryset()遍历 Set<Map.Entry<String, String>>s1=map.entrySet(); for(Map.Entry<String, String> e:s1){ String key=e.getKey(); String value=e.getValue(); System.out.println(key+" "+value); } //简写 for(Map.Entry<String, String> e:map.entrySet()){ System.out.println(e); } } }
可变参数
格式:
修饰符 返回值类型 方法名(参数类型... 形参名){ }
等价于:
修饰符 返回值类型 方法名(参数类型[] 形参名){ }
package demo02; public class Demo06 { public static void main(String[] args) { System.out.println(add(1,2,3,45)); System.out.println(add(3,5,7,9)); } //想要做一个求和的方法,单参数个数不一定,类型一定,int public static int add(int...a){ int sum=0; for(int i:a){ sum=sum+i;//相等于sum+=i; } return sum; } }
集合嵌套
ArrayList嵌套 ArrayList
ArrayList< ArrayList<String> > Collection< ArrayList<Integer> >
Map嵌套 ArrayList
HashMap<String, ArrayList<Person>> ArrayList< HashMap<String, String>>
l Map集合嵌套的遍历
HashMap<String, HashMap<String,String>> HashMap<String, HashMap<Person,String>>
package demo05; import java.util.HashMap; import java.util.Set; public class Demo02 { public static void main(String[] args) { method(); } public static void method(){ HashMap<String, HashMap<String,String>> map=new HashMap<String, HashMap<String,String>>(); HashMap<String,String> m1=new HashMap<String,String>(); m1.put("1", "王二"); m1.put("2", "张三"); HashMap<String,String> m2=new HashMap<String,String>(); m2.put("3", "李四"); m2.put("4", "王五"); map.put("一中", m1); map.put("二中", m2); Set<String>school=map.keySet(); for(String s:school){ String sch=s; HashMap<String,String>classes=map.get(sch); Set<String>class1=classes.keySet(); for(String ss:class1){ String classname=ss; String stuname =classes.get(classname); System.out.println("学校为"+sch+",班级为"+ classname+",姓名为"+stuname); } } } }
package demo05; import java.util.HashMap; import java.util.HashSet; import java.util.Set; public class Demo01 { public static void main(String[] args) { method(); }//HashMap<String, HashMap<String,String>> public static void method(){ HashMap<String, HashMap<String,String>> map=new HashMap<String, HashMap<String,String>>(); HashMap<String,String> m1=new HashMap<String,String>(); m1.put("1", "王二"); m1.put("2", "张三"); HashMap<String,String> m2=new HashMap<String,String>(); m2.put("3", "李四"); m2.put("4", "王五"); map.put("一中", m1); map.put("二中", m2); Set<String> school=map.keySet(); for(String s:school){ String sch=s; HashMap<String,String> classes=map.get(sch); Set<String>class1=classes.keySet(); for(String ss:class1){ String classname=ss; String stuname=classes.get(classname); System.out.println("学校为"+sch+",班级为"+ classname+",姓名为"+stuname); } } } }
相关文章推荐
- HashSet集合是如何做到存储元素唯一,没有重复元素的呢?
- java:ArrayList集合与HashSet集合元素重复性探讨
- ArrayList,HashSet判断对象是否重复的原理
- 判断集合是否包含元素list.contains(Object obj)
- 判断数组,集合元素是否唯一
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- Arraylist与Hashset的判断元素相同的依据
- 使用ArrayList集合,对其添加100个不同的元素: 1.使用add()方法将元素添加到ArrayList集合对象中; 2.调用集合的iterator()方法获得Iterator对象,并调用Ite
- 去除arrayList集合里面同样的元素
- 【Java总结-集合】Java集合的Collection接口,ArrayList,LinkedList,HashSet,TreeSet
- 使用ArrayList集合,对其添加100个不同的元素:
- 深入Java集合学习系列:LinkedHashSet的实现原理
- Java集合---ArrayList的实现原理
- 清除(ArrayList)集合中重复元素
- Collection方法之一 向集合添加元素,判断是否为空
- 使用ArrayList集合,对其添加100个不同的元素
- Java集合-04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
- 15-常用对象API(集合框架-ArrayList集合存储自定对象) 1 2 3 16-常用对象API(集合框架-HashSet集合) 19-常用对象API(集合框架-HashSet存储自定义
- Java 集合系列之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)
- map.containsKey 判断map集合中是否存在相同的健名