七、集合处理
1、尽量使用String对象做Map的key
2、list转数组,用list的toArray(T[] array),传入的参数array是类型完全一样的数组,大小是list.size()
示例:(无参的toArray返回的是Object[]类)
List<String> list = new ArrayList<String>(2); list.add("guan"); list.add("bao"); String[] array = new String[list.size()]; array = list.toArray(array);
3、数组转集合
(1)对基本数据类型的数组支持不友好
(2)Arrays.asList()返回的是Arrays类的一个内部类ArrayList,该内部类并未实现集合的修改方法(add/remove),因此不能使用这个转换后的集合
调用add/remove方法
(3)当使用该方法转换时,数组和列表将链接在一起,更新其中之一,另一个随之更新
依次给出3个示例:
static void example2(){
//第一个例子
int[] arr = {1, 2};//基本类型的数组 List list = Arrays.asList(arr); list.forEach(i->System.out.println(i));//打印出来的不是1,2,而是[I@2d98a335,这是一个对象的内存地址 System.out.println(list.size());//打印的是1而不是2,事实是list的元素类型变成了int[],而不是期望的int或Integer //第二个例子 String[] arr1 = {"a","b","c"}; List list1 = Arrays.asList(arr1); list1.add("d");//调用add报错java.lang.UnsupportedOperationException list1.remove("a");//调用remove报错java.lang.UnsupportedOperationException //第三个例子 list1.forEach(s->System.out.println(s));//打印结果是a,b,c arr1[0] = "d";//现在修改原数组的第一个元素为d System.out.println(list1.get(0));//转换后的list的第一个元素跟着变为d list1.set(0,"e");//现在修改转换后的list的第一个元素为e System.out.println(arr1[0]);//原数组的第一个元素跟着变为e }
4、for-each循环优先于传统的for循环,为了简洁性和预防bug,并且性能不会丢失
List<String> list = Arrays.asList("aa","bb","cc");
//增强的for循环 for (String s:list) { System.out.println(s); } list.forEach(s->System.out.println(s));
foreach内不要进行元素的修改(add/remove)操作,用Iterator
List<String> list3 = new ArrayList<>(); list3.add("aa"); list3.add("bb"); list3.add("cc"); list3.add("aa"); list3.add("dd"); list3.add("aa"); list3.add("ee"); Iterator<String> it = list3.iterator(); while(it.hasNext()){ if("aa".equals(it.next())){ it.remove(); } } list3.forEach(s->System.out.println(s));//bb,cc,dd,ee
5、集合初始化时指定集合大小
ArrayList:初始容量10,扩容倍数:1.5倍
HashMap 初始容量1<<4=16,扩容倍数:2倍
HashSet:基于HashMap实现,和HashMap相同
6、遍历HashMap用java8的foreach或entrySet
Map<String, Integer> map= new HashMap<>(); map.put("A", 10); map.put("B", 20); map.put("C", 30); map.forEach((k,v)->System.out.println( k + "= " + v)); map.forEach((k,v)->{ System.out.println( k + " = " + v); if("A".equals(k)){ System.out.println("Hello A"); } });