Collection和Map

93 阅读3分钟

image.png HashSet无重复性
在向 HashSet 集合中增加元素时,会先计算此元素的 hashcode 值,如果 HashSet 集合中没有此 hashcode 值,那么此元素就可以插入。如果 hashcode 值与 HashSet 集合中的某个元素的 hashcode 值相同,HashSet 就会继续调用 euqals() 方法进一步判断它们的内容是否相同,如果相同就忽略这个新增的元素,如果不同才能把它增加到 HashSet 集合中。

list

  • 对于 “索引访问” 较多的集合操作建议使用 ArrayList,而对于 “增删” 较多的集合操作建议使用 LinkedList。

inkedList 的底层是链表。LinkedList 和 ArrayList 在应用层面类似,只是底层存储结构上的差异导致了二者对于不同操作,存在性能上的差异。这其实就是顺序表和链表之间的差异。一般而言,对于 “索引访问” 较多的集合操作建议使用 ArrayList 实现类,而对于 “增删” 较多的集合操作建议使用 LinkedList 实现类 Comparator 是外部比较器,需要单独创建比较器制定规则。

Comparator 可以理解为一个专用的比较器,当集合中的对象不支持自比较或者自比较的功能不能满足程序员的需求时,就可以写一个实现 Comparator 接口的比较器来完成两个对象之间的比较,从而实现按比较器规则进行排序的功能。

Iterator 接口为遍历集合而生,是 Java 语言解决集合遍历的一个工具。

iterator() 方法定义在 Collection 接口中,因此所有单值集合的实现类,都可以通过 iterator() 方法实现遍历。iterator() 方法返回值是 Iterator 对象,通过 Iterator 接口的 hasNext() 和 next() 方法即可实现对集合元素的遍历。

set遍历

1.迭代遍历:

Set<String> set = new HashSet<String>();

Iterator<String> it = set.iterator();

while (it.hasNext()) {undefined

  String str = it.next();

  System.out.println(str);

}
2.for循环遍历:

for (String str : set) {undefined

      System.out.println(str);

}

List遍历

增强型for循环遍历

   for(String attribute : list) {
     System.out.println(attribute .getId()+" *"+attribute .getName());
}
一般型for循环遍历

for(int i = 0;i < list.size(); i ++){
    System.out.println(list.get(i));
}
集合类的通用遍历方式 用迭代器迭代

正向迭代

Iterator it = list.iterator();
    		while(it.hasNext()) {
      			System.ou.println(it.next);
    }

反向迭代

 Iterator it = list.iterator();
        while(listIt.hasPrevious()){
       System.out.println(listIt.previous());
       }

map遍历

因为map是键值对,不是单值,
所以第一步 把map转为单值集合(Set/get) map内置keySet()方法可以把关键值转换成set集合
第二步:用forEach,或者迭代器循环
Map.keySet()得到map里面key集合
Map.get(key)得到和对应key关联的值。

            System.out.println(key+"="+map.get(key));
   }

第二种方法,使用entry集合;
啥是entry?

image.png 如同,我们用第一种方法是左边图,entry是右边哪个,
我们可以通过把map变成entry集合,用entryset方法,然后foreach遍历 Set 名字=Map.entrySer();

练习题


键盘输入字符串,统计他每一个字母出现次数,然后用map存储,key表示字母,value表示值,,,相同字母value++
思路:::: 在类中添加 statis() 方法,该方法参数为一个字符串,返回值类型为一个 Map 集合。
statis()方法要求传入一个字符串,统计该字符串中每个字母出现的次数,将字母和其出现次数存入 Map集合中并返回出去。
其中需要将非字母的字符去掉,可以采用字符串中的方法 replaceAll("[^a-zA-Z]", "") 方式完成操作。
控制台输入一个字符串,将其传入 `statis()` 方法,控制台输出字符串中每个字母出现的次数
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串");
String s=sc.next();
1.把字符串,加入map
 Map<Character, Integer> map = new HashMap<>();
 for (int i = 0; i < s.length(); i++) {
            int count = 0;
            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    count++;
                }
            }
            map.put(s.charAt(i), count);
        }
 2.遍历map
   for(Character key:map.keySet()){
   //判断是不是字母
            if((key>='a'&&key<='z')||(key>='A'&&key<='Z'))
            System.out.println(key+"="+map.get(key));
        }

答案

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Statistics {
     Map<Character, Integer> map = new HashMap<>();

    public Map statis(String s) {

        for (int i = 0; i < s.length(); i++) {
            int count = 0;
            for (int j = 0; j < s.length(); j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    count++;
                }
            }
            map.put(s.charAt(i), count);
        }
       
        for(Character key:map.keySet()){
            if((key>='a'&&key<='z')||(key>='A'&&key<='Z'))
            System.out.println(key+"="+map.get(key));
        }
        return map;
    }

    public static void main(String[] args) {
Statistics st=new Statistics();
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串");
String s=sc.next();
st.statis(s);


    }
}