场景
Java中数组与List互转的几种方式
数组转List
1、最简单的方式,Arrays.asList(array); 创建的是不可变列表,不能删除和新增元素
String[] array = new String[]{"a","b"};List<String> stringList = Arrays.asList(array);System.out.println(stringList);//[a, b]
但是如果修改为如下
String[] arrayA = new String[]{"a","b"};List<String> stringListA = Arrays.asList(arrayA);
// System.out.println(stringListA);
// stringListA.add("c");
// System.out.println(stringListA);
运行直接抛出异常Exception in thread "main" java.lang.UnsupportedOperationException
这是因为通过Arrays.asList创建的List,虽然命名也是ArrayList,但是全路径为java.util.Arrays.ArrayList
不支持add,remove操作,但是可以更新列表中元素的值。
不支持add,remove操作,但是可以更新列表中元素的值。
stringListA.set(1,"c");System.out.println(stringListA);
2、如果需要对转换后的list进行操作,可以用以下方式
String[] arrayB = new String[]{"a","b"};ArrayList<String> strings = new ArrayList<>(Arrays.asList(arrayB));strings.add("c");System.out.println(strings);//[a, b, c]
相当于用列表创建列表,属于深拷贝的一种表现,获得的列表支持新增、删除
3、第三种借助于jdk提供的容器工具类Collections来实现-推荐写法
String[] arrayC = new String[]{"a","b"};//创建列表,并指定长度,避免可能产生的扩容List<String> list= new ArrayList<>(arrayC.length);//实现数组添加到列表中Collections.addAll(list,arrayC);//因为列表为我们定义的ArrayList,所以可以对它进行增删改list.add("c");System.out.println(list);
列表转数组
列表转数组,直接调用List.toArray
List<String> listA = Arrays.asList("a","b","c");//返回的是Object[]数组Object[] objects = listA.toArray();//如果需要指定数组类型,可以传一个指定各类型的空的数组String[] strings1 = listA.toArray(new String[]{});
Java中驼峰与下划线互转
1、使用guava
//驼峰转下划线String baDao = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "baDao");System.out.println(baDao);//下划线转驼峰String ba_dao = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "ba_dao");System.out.println(ba_dao);
2、使用Hutool工具类
String ba_dao1 = StrUtil.toCamelCase("ba_Dao");System.out.println(ba_dao1);String baDao1 = StrUtil.toUnderlineCase("baDao");System.out.println(baDao1);
Java中Map转换Map的几种方式
比如希望将一个Map<String,Integer>转换成Map<String,String>
首先提供一个创建Map的公共方法newMap
private static <T> Map<String,T> newMap(String key,T val,Object... kv){Map<String,T> ans = new HashMap<>(8);ans.put(key,val);for (int i = 0,size = kv.length; i < size; i+=2) {ans.put(String.valueOf(kv[i]),(T)kv[i+1]);}return ans;}
1、基本的for循环转换
Map<String, Integer> map = newMap("k", 1, "a", 2, "b", 3);HashMap<String,String> ans = new HashMap<>(map.size());for (Map.Entry<String,Integer> entry:map.entrySet()) {ans.put(entry.getKey(),String.valueOf(entry.getValue()));}System.out.println(ans);
2、容器的流式使用
Map<String, Integer> map1 = newMap("k", 1, "a", 2, "b", 3);Map<String, String> collect = map1.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, s -> String.valueOf(s.getValue())));System.out.println(collect);
3、Guava的transform方式
Map<String, Integer> map2 = newMap("k", 1, "a", 2, "b", 3);Map<String, String> stringStringMap = Maps.transformValues(map2, String::valueOf);System.out.println(stringStringMap);
Java中List转Map的几种方式
如何将List转为Map<Object,List<Object>>
1、基本写法
List<String> list = new ArrayList<String>(){{add("badao");add("de");add("cheng");add("xv");add("yuan");}};Map<Integer,List<String>> ans = new HashMap<>();for (String str:list) {List<String> sub = ans.get(str.length());if(sub == null){sub = new ArrayList<>();ans.put(str.length(),sub);}sub.add(str);}System.out.println(ans);
2、对于jdk8,上面for循环的内容可以利用Map.computeIfAbsent来替换
computeIfAbsent:如果key对应的value不存在,则使用获取 mappingFunction 计算后的值,
并保存为该 key 的 value,否则返回 value。
Map<Integer,List<String>> ans2 = new HashMap<>();for (String str:list) {ans2.computeIfAbsent(str.length(),k->new ArrayList<>()).add(str);}System.out.println(ans2);
3、在jdk8中借助stream的流处理,可以将上面更一步进行简化
Map<Integer, List<String>> collect = list.stream().collect(Collectors.groupingBy(String::length));System.out.println(collect);
4、上面是针对特定的列表,针对业务进行开发转换,下面构建一个通用的工具类toMapList
/*** List<V> 转换成Map<K,List<V>> 特点在于Map中的value是个列表,且列表中的元素就是从原列表中的元素获取* @param list* @param func* @param <K>* @param <V>* @return*/public static <K,V> Map<K,List<V>> toMapList(List<V> list, Function<V,K> func){return list.stream().collect(Collectors.groupingBy(func));}
对应的调用可以改为
Map<Integer, List<String>> integerListMap = toMapList(list, String::length);System.out.println(integerListMap);//{2=[de, xv], 4=[yuan], 5=[badao, cheng]}
5、如果希望对value也做处理,可以修改工具类
/*** List<I> 转换成Map<K,List<V>> 特点在于Map中的value是个列表,且列表中的元素是由list.item转换而来* @param list* @param keyFunc* @param valFunc* @param <K>* @param <I>* @param <V>* @return*/public static <K,I,V> Map<K,List<V>> toMapList(List<I> list,Function<I,K> keyFunc,Function<I,V> valFunc){return list.stream().collect(Collectors.groupingBy(keyFunc,Collectors.mapping(valFunc,Collectors.toList())));}
调用示例
Map<Integer, List<String>> integerListMap1 = toMapList(list, String::length, String::toUpperCase);System.out.println(integerListMap1);//{2=[DE, XV], 4=[YUAN], 5=[BADAO, CHENG]}
6、guava工具包中提供了一个HashMultimap的工具类,它的使用和平常的map的区别是,它的value是个集合
HashMultimap<Integer, String> map = HashMultimap.create();for (String str:list) {map.put(str.length(),str);}System.out.println(map);//{2=[de, xv], 4=[yuan], 5=[badao, cheng]}
Java中进行进制转换的几种方式
1、toString实现进制转换
Integer/Long toString(int i,int radix)可以将任一进制的整数,转换为其他任意进制的整数
第一个参数:待转换的数字
第二个参数:转换后的进制位
//十六进制转十进制System.out.println(Integer.toString(0x12, 10));//八进制转十进制System.out.println(Integer.toString(012,10));//八进制转二进制System.out.println(Integer.toString(012,2));
2、除了使用上面的方式,还可直接使用toBinaryString来实现转二进制
//十进制转二进制System.out.println(Integer.toBinaryString(2));//十进制转八进制System.out.println(Integer.toOctalString(9));//十进制转十六进制System.out.println(Integer.toHexString(10));