Java集合知识点Q&A
2021-08-26 15:52:57 31 举报
AI智能生成
Java集合知识点Q&A
作者其他创作
大纲/内容
基础
Q&A总结
List相关问题
<font color="#f57f17">Q:arrList = new ArrayList(Arrays.asList(..)); 和 arrList = Arrays.asList(..); 的区别是什么?</font><br>A:<font color="#ff0000">Arrays.asList(..)返回的是一个与ArrayList同名的Arrays内部类</font>,里面实现的add,remove,clear等方法是直接throws异常<br><br><font color="#0000ff">int[] arr = new int[]{1,2,3};<br>List list1 = new ArrayList(Arrays.asList(arr));<br>List list2 = Arrays.asList(arr);<br>list1.add(4);<br>list2.add(4);</font><br>结果:list2运行失败!!!
<font color="#f57f17">Q:Arrays.asList支持通过修改原数组来修改list内容吗?</font><br>A:支持, <font color="#ff0000">Arrays.asList()返回的是一个包装原数组的AbstractList。修改数组元素会影响list的内容。</font><br><br><font color="#0000ff">String[] ss = {"a","b","c"};<br>List<String> arrList = Arrays.asList(ss);<br>ss[0] = "d";<br>System.out.println(arrList);</font><br>上面操作后arrList不会报错。arrList里的内容变成了{“d”,“b”,“c”}<br>
<font color="#f57f17">Q:这段代码最后结果是什么?</font><br> <font color="#0000ff"> List<Integer> list = new ArrayList<>();<br> list.add(1);<br> list.add(2,2);<br> int num = list.get(1);<br> System.out.println(num)</font><br>A:会报错,list.add(2,2)有问题, 需要理解list.add(index, num)的含义
<font color="#f57f17">Q:vector和ArrayList的区别</font><br>A:vector是线程安全的, <font color="#ff0000">每个方法都加了syn关键字</font>,频繁的加锁可能导致性能降低
<font color="#f57f17">Q:为什么不推荐使用stack</font><br>A:stack 继承自vector , 但是vector里包含了很多不需要的public方法<br>只是为了实现栈,不用链表来单独实现,而是为了复用简单的方法而迫使它继承 Vector,Stack 和 Vector 本来是毫无关系的。这使得 Stack 在基于数组实现上效率受影响,另外因为继承 Vector 类,Stack 可以复用 Vector 大量方法,这使得 Stack 在设计上不严谨
Map相关问题
<font color="#f57f17">Q: hashCode相同, 那么equals肯定true吗?</font><br>A: 不一定。
<font color="#f57f17">Q: equals为true, 那么hashCode肯定相同吗?</font><br>A: 对。
<font color="#f57f17">Q: 2个String如果内容相同,那么hashCode相同吗?</font><br>A: 对,相同。因为二者equals返回true,所以必定hashCode相同。
<font color="#f57f17">Q: 如果在插入后,修改某个key的hashCode,可能造成什么问题?</font><br>A:可能造成内存泄漏。因为map是按计算后的hashCode存放的,而如果在外部修改了某个key的值,可能造成之前塞入的那个哈希所在的地址无法被外部remove(key),却又无法被gc(因为一直持有),造成内存泄漏。
<font color="#f57f17">Q:Collections.synchronizedMap(map)和ConcurrentHashMap,哪个同步效果好?</font><br>A:Collections.synchronizedMap(map)与ConcurrentHashMap主要区别是:<br><font color="#ff0000"> Collections.synchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步</font><br><font color="#ff0000"> ConcurrentHashMap的实现却更加精细,分端加锁</font><br>
<font color="#f57f17">Q:linkedHashMap的accessOrder问题,下面输出什么</font><br> <font color="#0000ff"> public void fun2() throws Exception {<br> LinkedHashMap<String, String> accessOrderTrue = new LinkedHashMap<>(16, 0.75f, true);<br> accessOrderTrue.put("1","1");<br> accessOrderTrue.put("2","2");<br> accessOrderTrue.put("3","3");<br> accessOrderTrue.put("4","4");<br> System.out.println("put后的数据:"+accessOrderTrue);<br> accessOrderTrue.get("2");<br> accessOrderTrue.get("3");<br> System.out.println("get后的数据"+accessOrderTrue);<br> }</font><br>A:省略key值<br> put后的数据: {1=1,2=2,3=3,4=4}<br> get后的数据: {1=1,4=4,2=2,3=3}<br> <font color="#ff0000">accessOrder为true时, 会把最近访问过的数据放到链表 末尾。</font>
Collections
<ul><li>Collection是接口, Collections是1个工具类</li><li>排序: Collections.<font color="#ff0000">sort</font>(collection ,Comparator<>)</li><li>打乱顺序: Collections.<font color="#ff0000">shuffle</font>(collection ,Random)</li><li>填充: Collections.<font color="#ff0000">fill</font>(list, 对象) , 注意是<font color="#ff0000">浅拷贝填充</font>, 即填充后使用的是同一个引用。</li><li>返回不可变容器(即无法对容器做修改): Collections.<font color="#ff0000">unmodifiableMap</font>(容器)</li><li><span style="font-size: inherit;">返回空的不可变集合: Collections.emptyList()..</span></li><li><span style="font-size: inherit;">返回单个元素的不可变集合: </span>Collections.singletonList(T v)..</li></ul>
<font color="#f57f17">Q: 当输入为哪些字母时,迭代时会报错</font><br><font color="#0000ff">public static void main(String[] args) throws Exception {<br> List<String> list = Lists.newArrayList("A", "B", "C", "D");<br> String s = args[0];<br> for (String curStr : list) {<br> if (s.equals(curStr)) {<br> list.remove(curStr);<br> }<br> }<br>}</font><br>A:删除A或者B会报错, 但是删除C不会!<br><font color="#ff0000">对于foreach遍历容器,并用remove做删除时,当删除倒数第二个元素时,是不会报错的。(实现上的一个bug)</font>
0 条评论
下一页