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