1. 自己实现一个HashMap?
HashMap的实现思路:
1,利用key的hashCode计算当前对象在数组中的下标。
2,存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,覆盖原始值;(2)如果key不同(出现冲突),则将当前key-value放入链表中
3,获取值时,直接找到对应hash值对应的下标,再进行判断key是否相同,从而找到对应的value
源码实现参考:
https://blog.csdn.net/qq_34383019/article/details/100549644
2. 如何把Map和json之间互相转换?
json转换的时候通常使用fastJson或者Jackson工具类。
①使用Jackson ObjectMapper从JSON字符串读取Java Map的示例:
String jsonObject = "{"brand":"ford", "doors":5}";
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> jsonMap =
objectMapper.readValue(jsonObject, new TypeReference<Map<String,Object>>(){});
②java对象转json:
String json = objectMapper.writeValueAsString(map);
3. 说一下
HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。
HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();
HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在HashMap中调用put,首先会判断key是否存在,如果key存在则修改value值,如果key不存在这插入这个key-value。而在set中,因为value值没有用,也就不存在修改value值的说法,因此往HashSet中添加元素,首先判断元素(也就是key)是否存在,如果不存在这插入,如果存在着不插入,这样HashSet中就不存在重复值。
所以判断key是否存在就要重写元素的类的equals()和hashCode()方法,当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算次对象的哈希值,此哈希值决定了此对象在Set中存放的位置;若此位置没有被存储对象则直接存储,若已有对象则通过对象所在类的equals()比较两个对象是否相同,相同则不能被添加。
4. ArrayList 和 LinkedList 的区别是什么?
数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
综合来说,在需要频繁读取集合中的元素时,更推荐使用ArrayList,而在插入和删除操作较多时,更推荐使用LinkedList。
5. 如何实现数组和List之间的转换?
数组转List使用 Arrays. asList(array) 进行转换。
List 转数组:使用 List 自带的 toArray() 方法。