hashMap底层原理,一个字符串中字母和数组出现的次数

List
    有序 :访问顺序和插入顺序一致
    
    添加了根据下标来操作元素
Set
    参考 数学上集合的概念
    无序(访问顺序和插入顺序不一致)
    不允许重复
    可以null
    
    没有添加额外的方法
    HashSet 最常用的实现类,此实现不是同步的
        实际上是一个 HashMap 实例
    LinkedHashSet
        维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序
        保证访问顺序和插入顺序一致
    TreeSet
        底层实现:红黑树
        使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
        根据Comparable接口中compareTo方法来判断元素是否重复的,不是equals() 
        但是一个类中同时有这两个方法时,相等的逻辑要一致
        
    练习:Student 使用集合存储        姓名 ,出生日期MyDate(年月日)
        要求输出,按照出生日期有小到大排序
    
    
    
Map 两列集合
    键映射到值---参考函数  y=x^2    ---键值对  Set<Node>
    一个映射不能包含重复的键---键唯一(set)
    每个键最多只能映射到一个值 ---一对一,多对一(Collection)
        
    V get(Object key) 根据键获取值 
    V put(K key, V value) 添加
    V remove(Object key)  移除
     
    boolean containsKey(Object key)  
    boolean containsValue(Object value) 
     
    Set<K> keySet()  
    Collection<V> values() 
    Set<Map.Entry<K,V>> entrySet()   
    
    具体实现类
    HashMap 最常用
        允许使用 null 值和 null 键
        不是同步的
        
        实现原理:
            jdk1.7   数组+链表
            jdk1.8  数组+链表/红黑树
        
            Node<K,V>[] table
            jdk1.8
            1、调用无参构造初始化时,没有申请空间
            2、第一次put对象的时候,申请长度为16的数组空间Node<K,V>[] table
            3、添加数据的时候,先计算hash值(会调用到hashCode()),确定元素在数组中的位置i
            4、判断i位置上是否已经有对象,
                如果没有,直接添加到数组i位置上----存
                如果有(哈希冲突),当前对象和i位置上对象进行比较(key的hash,equals)
                    如果相等,就把value覆盖---修改
                    如果不相等,遍历此位置上链表中存储的每一个对象进行比较(key的hash,equals)
                        如果存在相等,就把value覆盖---修改
                        如果不存在相等,直接添加到链表中(如果链表中数据量超过8,则使用红黑树存储)----存
            
            综上,key的hashCode    和equals()不相等,对象才会被存储    ,否则是被修改    
                        
            
    LinkedHashMap
        维护插入顺序的
    Hashtable  
        不允许使用 null 值和 null 键
        同步的


   输入一个字符串,判断里面字母和数字出现的次数。

package Map;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class Text1 {
    public static void main(String[] args) {
        HashMap<Integer, Integer> map = new HashMap<>();
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        for (int i = 0; i < a.length(); i++) {
            if(a.charAt(i)<='z'&&a.charAt(i)>='a') {
                if(map.containsKey(0)) {
                    map.put(0, map.get(0)+1);
                }
                else {
                    map.put(0, 1);
                }
            }if(a.charAt(i)<='9'&&a.charAt(i)>='0') {
                if(map.containsKey(2)) {
                    map.put(2, map.get(2)+1);
                }else {
                    map.put(2, 1);
                }
            }
            
        }
        Iterator<Map.Entry<Integer, Integer>> s = map.entrySet().iterator();
        while(s.hasNext()) {
            Map.Entry<Integer, Integer> entry = s.next();
            if(entry.getKey()==0) {
                System.out.println("字母出现的次数:"+entry.getValue());
            }else {
                System.out.println("数字出现的次数:"+entry.getValue());
            }
        }
    }
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值