javase java javase 集合 Map和其他相关 mengnankkzhou 2024-08-11 2024-08-20 其他相关
可变参数
一种特殊的形参
可以不传参数,也可以传多个或者一个或者数组
1 2 3 4 5 6 7 8 public class Test { public static void main(String[] args) { test(); } public static void test(int...nums){ } }
常常用来接受数据
可变参数在方法内部是一个数组
注意事项:
一个形参列表中,只能有一个可变参数
必须在形参列表的最后面
工具类
Collections是一个用来操作集合的工具类
1 2 3 4 List<String> names = new ArrayList<>(); Collections.addAll(names,"与马仔","我累哦二","array");//批量添加数据 Collections.shuffle(names);//打乱List的里面数据,在斗地主中可以进行洗牌的操作 Collections.sort(names);//对List里面的进行升序排序,自定义的类和前面一样
几个常用的方法
Map集合
Map集合是双列集合,一次要存一对数据
前面的叫做键,后面的叫做值。被成为键值对
所有的键是不能够重复的,但是值可以重复
键和值是一一对应的
Map是一个泛型接口
常见类型:
Hashmap 无序不重复无索引
Treemap 有序,不重复,无索引
LinkedHashMap 按照大小默认升序,不重复无索引
常用方法:
常见的方法都有。
get(Object key)获取键值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import java.rmi.MarshalledObject; import java.util.*; public class Test { public static void main(String[] args) { Map<String ,Integer> map = new HashMap<>(); map.put("a",5); map.put("d",4); map.put("e",7); map.put("b",6); System.out.println(map.get("e"));//根据键获取对应的值map System.out.println(map.remove("a"));//根据键删除,然后返回值 System.out.println(map.containsKey("a"));//判断是否有某个键 //类似的还有是否包含某个值,注意值的类型 Set<String> keys = map.keySet(); System.out.println(keys);//将Map集合里的全部值放到Set集合里 //类似的还有值 Map<String,Integer> map1 = new HashMap<>(); Map<String,Integer> map2 = new HashMap<>(); map1.putAll(map2);//将map2里的元素都倒入一份到map1里面 } }
遍历方式
键找值:
先获取键然后再找值
键值对:看成一个整体来找
Lambda
键找值
1 2 3 4 5 Set<String > keys = map.keySet();//用Set集合来存储键 for(String key:keys){//增强for循环 int value = map.get(key);//根据键获取对应的值 System.out.println(value); }
键值对
1 2 3 4 5 6 Set<Map.Entry<String, Integer>> entries = map.entrySet();//设置Entry对象 for (Map.Entry<String, Integer> entry : entries) {//增强for循环遍历 String key =entry.getKey(); int value = entry.getValue();//存储值 System.out.println(key+value); }
Lambda(最简单的)
1 2 3 map.forEach((k,v) -> { System.out.println(k+"---"+ v); });
直接遍历
是java书写的一个标准,以后尽量这样写。主要是简单
案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import java.util.*;public class Test { public static void main (String[] args) { List<String > date = new ArrayList <>(); String [] select = {"a" ,"b" ,"c" ,"d" }; Random r = new Random (); for (int i = 1 ;i<=80 ;i++){ int index = r.nextInt(4 ); date.add(select[index]); } Map<String,Integer> result = new HashMap <>(); for (String s : date) { if (result.containsKey(s)){ result.put(s,result.get(s)+1 ); } else { result.put(s,1 ); } } System.out.println(result); } }
注解:
在java中需要存储一一对应的数据的时候,就可以使用Map集合来做
HashMap
1 2 3 4 5 6 7 8 9 public static void main(String[] args) { Map<String ,Integer> map = new HashMap<>(); map.put("a",5); map.put("d",4); map.put("c",7); map.put("b",6); System.out.println(map); }
用的最多。
底层原理:
基于hash表实现的,set集合的底层就是map集合改过来的,只不过set只要键不要值而已
哈希表=数组+链表+红黑树
增删较好的,依赖hashcode和equals方法来保持键的唯一
LinkedHashMap
LinkHashMap是有序的
也是基于hash表实现的,有序是根据双列表实现的
LinkedHashSet就是根据LinkedHashMap实现的
TreeMap
按照键的大小默认升序排序
基于红黑树实现的
TreeSet是根据TreeMap实现的
自定义对象的排序是跟前面一样的
集合的嵌套
使用案例:
1 2 3 4 5 6 7 8 public class Test { public static void main(String[] args) { Map<String, List<String>> map = new HashMap<>(); List<String> cties1 = new ArrayList<>(); Collections.addAll(cties1, "南京", "南通"); map.put("江苏省", cties1); } }