J2EE集合框架Map

news/2025/1/11 20:05:19/

目录

一.Map特点

1.无序,键值对,键不能重复,值可以重复

2.键重复则覆盖,没有继承Collection接口

二.遍历方式

1.拿到key,再拿值2.拿到映射关系,键值都有  取出保存所有Entry的Set,再遍历此Set即可

三.HashMap与Hashtable的区别

1.Hashtable更安全 2.JDK 1.8之前hashtable的key不能存放null

1.2 HashMap(数组+链表+红黑树)

HashMap 的结构。

1.3 HashMap的基本原理

put执行过程

八.字符串切割


一.Map特点

1.无序,键值对,键不能重复,值可以重复

2.键重复则覆盖,没有继承Collection接口

二.遍历方式

1.拿到key,再拿值
2.拿到映射关系,键值都有  取出保存所有Entry的Set,再遍历此Set即可

三.HashMap与Hashtable的区别

1.Hashtable更安全
 2.JDK 1.8之前hashtable的key不能存放null

 

1.2 HashMap(数组+链表+红黑树)

HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快

的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null,允许多条记

录的值为 null。HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导

致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使

HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。我们用下面这张图来介绍

HashMap 的结构。

 

1.3 HashMap的基本原理

put执行过程

 

public class Demo1 {
    public static void main(String[] args) {
        Hashtable<String, Integer> table = new Hashtable<>();
        //有 synchronized 锁  安全
        table.put("a", 1);
        table.put("b", 2);
        
        
        Map<String, Integer> map = new HashMap<>();
        //增加
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        map.put("d", 4);
        System.out.println(map);
        //删除
        Object remove = map.remove("c");
        System.out.println(remove);
        System.out.println(map);
        //修改  调用put方法
        map.put("b", 88);
        System.out.println(map);
        //查询单个
        System.out.println(map.get("c"));
        //查询所有
        //1.先拿到map集合中的所有key
        Set keySet = map.keySet();
        for (Object key : keySet) {
            System.out.println(":"+key+";:"+map.get(key));
        }
        
        //2.拿到映射关系
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        for (Entry<String, Integer> entry : entrySet) {
            System.out.println(":"+entry.getKey()+";:"+entry.getValue());
        }
        
    }

四.ConcurrentHashMap特点


1.线程安全 由CPU硬件提供并实现的原子操作
2.性能高
3.并发性高   16 个线程并发写
4.分段锁 锁分段技术(JDK8:CAS)
5.键,值不可以为null

五. 泛型

    之前:不健壮的代码,会在运行时才会把错误暴露出来
     之后:
          将潜在的问题暴露出来,早预防早治疗
          将运行期出现的异常转换为编译期的错误

public class Demo3 {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(5);
        //打印偶数
        for (Object obj : set) {
            if(Integer.valueOf(obj.toString()) % 2 ==0) {
                System.out.println(obj);
            }
        }
        
    }

}
//泛型类
//以前

class BookDao{
    //add(Book book)
    //delete(Book book)
}
class UserDao extends BaseDao{
    
}

//现在
class BaseDao<T>{
    void add(T t) {
    }
    void delete(T t) {
    }
}

class Result{
    //泛型方法
    <T> void add(T t) {
    }
}
 

六.集合之间的相互转换

1.数组转集合:本质上依然是一个数组,长度不可变

 2.集合与数组所具备的方法不一样,如对于数组而言,就没有判断内部包含那个元素

public class Demo4 {
    public static void main(String[] args) {
         String[] arr= {"a","b","c","d"};
         //数组转集合
         List<String> list = Arrays.asList(arr);
         list.add("e");
         //集合转数组
         Object[] array = list.toArray();
        // java.lang.UnsupportedOperationExcept
         System.out.println(list.size());
         
    
    }
}

七.对于工具类其他方法的应用

1.排序 sort
 2.tostring

package com.zking.map;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * 对于工具类其他方法的应用
 * 1.排序 sort
 * 2.tostring
 * @author PC
 *
 */
public class Demo5 {
    public static void main(String[] args) {
    /*    List<String> list = new ArrayList<>();
        list.add("c");
        list.add("b");
        list.add("y");
        System.out.println(list);
        //排序
        Collections.sort(list);
        System.out.println(list);
        //改变排序规格 x y 指的是集合中的元素
        Collections.sort(list, (x,y) -> y.compareTo(x));
        System.out.println(list);*/
        
        List<Person> list = new ArrayList<>();
        list.add(new Person("b",12));
        list.add(new Person("u",16));
        list.add(new Person("c",18));
        System.out.println(list);
        //Collections.sort(list);
        Collections.sort(list, (x,y) -> x.getName().compareTo(y.getName()));
    
    
        Integer[] arr = {3,5,2,6,7,8};
        Arrays.sort(arr);
        //降序
        Arrays.sort(arr, (x,y) -> y-x);
        //升序
        System.out.println(Arrays.toString(arr));
    
    
    
    
    
    
    }
}

class Person /*implements Comparable<Person>*/{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person() {
        // TODO Auto-generated constructor stub
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    /*@Override
    public int compareTo(Person o) {
        // TODO Auto-generated method stub
        return o.getName().compareTo(this.name);
    }*/
    
    
}
 

八.字符串切割

实现思路
         * 1.做字符串切割,得到一个字符组
         * 2.再遍历,拿到单个字符
         * 3.如果该字符没有出现过,即value值为null,那么该字符为KEY键,值初始化为1
         * 4.如果已经出现过,拿到原来的值+1

public class Demo2 {
    public static void main(String[] args) {
        String s = "asdfggyehcbckndxbssjjdhggfj";
      
        char[] arr = s.toCharArray();
        Map<Character, Integer> map = new TreeMap<>();
        for (char c : arr) {
            Integer value = map.get(c);
            if(value == null ) {
                map.put(c, 1);
            }
            else {
                map.put(c, value+1);
            }
        }
        
        Set<Entry<Character, Integer>> entrySet = map.entrySet();
        for (Entry<Character, Integer> entry : entrySet) {
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
        
        
    }
}
 


http://www.ppmy.cn/news/819801.html

相关文章

apk软件网络验证一机一码自带后台管理系统

安卓端apk网络验证&#xff0c;自带后台管理系统&#xff0c;一键注入工具小纸片千纸鹤arm最新源码 Q&#xff1a;注入注册机后怎么管理弹窗数据内容 &#xff1f; A&#xff1a;打开侧滑菜单&#xff0c;点击“注册机/弹窗管理”&#xff0c;打开指定软件进行配置。记得点保存…

朋友兰的故事

朋友兰的故事&#xff0c;早期活跃在呼市&#xff0c;他是一个非常勤奋的人&#xff0c;赚过很多钱&#xff0c;后来慢慢淡出了&#xff0c;急流勇退&#xff0c;享受生活去了。

德尔菲法

德尔菲法&#xff0c;是采用背对背的通信方式征询专家小组成员的预测意见&#xff0c;经过几轮征询&#xff0c;使专家小组的预测意见趋于集中&#xff0c;最后做出符合市场未来发挥在那趋势的预测结论。德尔菲法又名专家意见法&#xff0c;是依据系统的程序&#xff0c;采用匿…

水果兰

水果兰&#xff08;学名&#xff1a;Teucrium Fruticans&#xff09; 别名&#xff1a;灌从石蚕 原产地&#xff1a;原产于地中海地区及西班牙&#xff0c;唇形科木本植物&#xff0c;常绿灌木类。 生长环境&#xff1a;喜光耐旱&#xff0c;适应性强&#xff0c;生长迅速&…

Tableau 南丁格尔玫瑰图

简介:南丁格尔玫瑰图是弗罗伦斯南丁格尔所发明的。又名为极区图。是一种圆形的直方图。 应用场景&#xff1a;可以看到比饼图更加详细地信息。 参考书目&#xff1a;跟阿达学 Tableau 数据可视化 操作步骤&#xff1a; 以示例-超市为例 1、导出相关数据&#xff08;处理数…

爱尔兰风笛

1.The Immigrant 移民 http://www.pxvnet.com/MP3/XIYAN/JoanieMadden/01.mp3 2.Down By The Salley Gardens 漫步神秘园 http://www.pxvnet.com/MP3/XIYAN/JoanieMadden/02.mp3 3.The Otters Nest-Richie Dwyer 獭巢 http://www.pxvnet.com/MP3/XIYAN/JoanieMadden/03.m…

Wald检验

Wald检验 Wald 检验是先对原方程&#xff08;无约束模型&#xff09;进行估计&#xff0c;得到参数的估计值&#xff0c;再代入约束条件检查约束条件是否成立。Wald检验的优点是只需估计无约束一个模型。因此&#xff0c;当约束模型的估计很困难时&#xff0c;此方法尤其适用。…

兰切斯特方程的分析和案例解释

兰切斯特方程的分析和案例解释 兰切斯特除了类似动量定理和动能定理的表达方式的兰切斯特法则&#xff0c;还有以微分形式表达的微分方程。 我们通过实际推演和兰切斯特方程进行对比&#xff0c;验证一下兰切斯特方程是否计算准确。 假如A队有9名士兵&#xff0c;B队有6名士兵…