集合框架map

目录

map集合的特点:

增删改查

HashMap与 Hashtable的区别

遍历方式

entrySet方式

keySet方式

常用实现类HashMap

泛型

集合框架工具类

集合与数组之间的互转

排序

Collections

Arrays


map集合的特点:

1、增删改查

2、以键值对形式存在

3、key可以为空 ​

增删改查

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);
        //删
        map.remove("b");
        System.out.println("删:"+map);
        //改 也是调put方法
        map.put("b", 23);
        System.out.println("改:"+map);
        
        //查询单个  根据键拿到值
        //map.get("这里直接放键,也就是key");
            System.out.println("查单个:"+map.get("c"));
        
        //查询全部(这里列举了一种方式,具体请看下方的遍历方式)
        Set keys = map.keySet();
        for (Object key : keys) {
            System.out.println("键:"+key+"值:"+map.get(key));
        }

看效果图

 

这里说一个题,面试的时候可能会提到:

HashMap与 Hashtable的区别

这里定义了两个集合,一个是HashMap,一个是Hashtable,分别给两个集合放入一个null键与null值,说出两者之间的会发生什么?

  Map<String,Integer> map = new HashMap<>();
        map.put(null, 1);
        Hashtable<Object, Object> hashtable = new Hashtable<>();
        hashtable.put(null, 1);

咱来看效果图:

HashMap是能打印出来的,并且键是null,值为1

 

Hashtable是不能打印出来的,且会抛出异常,这其实是跟jdk版本相关,jdk1.8以下Hashtable的key不能存放null

且在编译时不报错,在运行后才会显示错误 

这里再多说一点:

在Hashtable这个类中定义的方法是 public synchronized V put(K key, V value)

而HashMap 这个类中定义的方法是 public V put(K key, V value)

synchronized 是同步的意思,所以Hashtable是面向线程安全的

所以在此我给大家的总结是:

1.Hashtable是面向线程安全的

2.jdk1.8以下Hashtable的key不能存放null,在编译时不报错,运行时会报错

HashMap的key则可以存放null,编译与运行时都不报错

遍历方式

entrySet方式

        Set<Entry<String,Integer>> entrySet = map.entrySet();
        System.out.println("entrySet方式");
        for (Entry<String, Integer> entry : entrySet) {
            System.out.println("键:"+entry.getKey()+"值:"+entry.getValue());
        }

效果图:

keySet方式

        Set keys = map.keySet();
        System.out.println("keySet方式");
        for (Object key : keys) {
            System.out.println("键:"+key+"值:"+map.get(key));
        }

效果图:

 

 

常用实现类HashMap

统计字符串中各字母出现的次数

这里给定一个字符串,计算出该字符串中各个字母出现的次数

大致思路是:

1.做字符串切割,得到一个字符数组 ​

2.接下来遍历,拿到单个字符

​3.如果该字符没有出现过,即value值为null,那么该字符为KEY,值初始化为1 ​

4.如已出现过,拿到原来的值+1

        //定义一个字符串
        String s="kjfksafkdvnsnopiefewojewokpkhuhijuhoijkcfdswtyfzxcvbnm";
        //切割字符串
        char[] array = s.toCharArray();
        //定义map集合
        Map<Character,Integer> map = new HashMap<>();
        //遍历切割后的字符集合
        for (char c : array) {
            //定义次数
            Integer value=map.get(c);
            //判断后加入map集合
            if(value==null) {
                map.put(c, 1);
            }
            else {
                map.put(c,value+1);
            }
        }
        //用entrySet方式遍历map集合
        Set<Entry<Character,Integer>> entrySet = map.entrySet();
        for (Entry<Character, Integer> entry : entrySet) {
            System.out.println(entry.getKey()+":"+entry.getValue());
        }

效果图:

泛型

这里只讲作用

例:这里用set集合来做,定义一个set集合

        Set set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        set.add(5);
        set.add(6);
        //下面这行代码,由于没规定泛型,因此在编译时不报错,运行后才会报错
        set.add("a");
        for (Object obj : set) {
            if(Integer.valueOf(obj.toString()) % 2==0) {
                System.out.println(obj);
            }
        }

报错效果图:

 

这里我们加上泛型,在这里做限制

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

加入泛型后,将异常提到编译时显示

 

来看加入泛型的前后对比,上面是加入后的效果,下面是加入前的效果 

结论:

1.加入泛型之前:不健壮的代码,会在运行时才会把错误暴露出来

2.将潜在的问题暴露出来,避免不必要的错误,将运行期出现的异常转化为编译期的错误

集合框架工具类

集合与数组之间的互转

        String[] arr={"a","b","c","d"};
		//数组转集合	Arrays.asList
		List<String> list = Arrays.asList(arr);	
		//集合转数组  toArray
		Object[] array = list.toArray();

排序

Collections

        //定义一个集合
		List<String> list = new ArrayList<>();
		list.add("b");
		list.add("g");
		list.add("d");
		list.add("s");
		System.out.println("没进行排序的:"+list);
		//排序用系统自带的 Collections.sort 
		Collections.sort(list);
		System.out.println("进行排序了的:"+list);
		//按字母排序  倒序   这里的x、y值得是集合中的元素
		Collections.sort(list, (x,y)-> y.compareTo(x));
		System.out.println("按字母进行倒序排序了的:"+list);

效果图:

 

实体类的排序:先定义一个实体类

public 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
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Person o) {
		return o.getName().compareTo(this.name);
	}
}

然后进行排序

        //定义一个集合
		List<Person> list = new ArrayList<>();
		//给集合添加数据
		list.add(new Person("l", 12));
		list.add(new Person("g", 13));
		list.add(new Person("d", 14));
		list.add(new Person("s", 15));
		//排序前
		System.out.println(list);
		//进行排序
		Collections.sort(list);
		//排序后
		System.out.println(list);

效果图:从name可以看出,是根据字母进行排序的,不过这里是倒序

 

弄成升序的只需改动以下这行代码即可:

Collections.sort(list, (x,y)->x.getName().compareTo(y.getName()));

效果图:

Arrays

        Integer[] arr= {3,0,3,5,7,9};
		//默认是升序
		Arrays.sort(arr);
		System.out.println("默认排序:"+Arrays.toString(arr));
		//降序
		Arrays.sort(arr, (x,y)->y-x);
		System.out.println("降序排序:"+Arrays.toString(arr));

效果图如下:

 

 

今天分享到这儿。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值