Java基础练习题 (5)集合操作

(1)如何将数组转换为List?
java.util.Arrays 类有一个 asList 方法,接受可变参数,由于 List 并不接受基本数据类型,所以如果想将基本数据类型数组转换为 List,需要先进行装箱,然后就可以用

List list = Arrays.asList(array);

得到转换后的 List。

(2)如何将List转换为数组?
Collection 接口有一个 toArray 方法,可以返回一个 Object 数组。例如

List<Integer> list = new ArrayList<Integer>();
Integer[] intArray = (Integer[])list.toArray();

(3)如何将元素插入List的指定位置?
List 接口重载了 add 方法,其中有一个方法可以选择插入的位置

List<String> list = new ArrayList<String>();
list.add(0, "hello world");

上面的 add(0, “hello world”) 就是将这段字符串插入到 0 号位置上,就是第一个位置。

(4)如何将List反转?
java.util.Collections 类有很多操作集合的方法,反转 List 可以用 reverse 方法

Collections.reverse(list);

(5)如何将List乱序?
使用 Collections 类的 shuffle 方法

Collections.shuffle(list);

还有一个重载方法

Collections.shuffle(list, new Random());

可以自己指定随机源。

(6)如何删除List中符合指定条件的元素?
使用循环

List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Iterator<String> iter = list.iterator();
while(iter.hasNext()) {
  if(iter.next().equals("2")) {
    iter.remove();
  }
}

这样就删除了 “2” 这个元素,在 Java 1.8 中,我们还可以使用 Streams API 来实现

list = list.stream().filter(elem -> !elem.equals("2")).collect(Collectors.toList());

(7)如何复制List?

Collections.copy(destination, source);

将 source 复制给 destination,要注意目标 List 的长度如果小于复制源的话会抛出异常。这里的长度指的是 size,就是说你的目标 List 里面也要存有跟复制源一样多的元素。

还可以用

List<String> source = new ArrayList<String>();
List<String> destination  = new ArrayList<String>(source);

这两种方法都是浅拷贝,里面的元素都是同样的引用。

(8)如何清空List?
Collection 接口有一个 clear 方法,可以清空元素

List list = new ArrayList();
list.clear();

(9)如何创建空List?
最直接的

List list = new ArrayList();

使用 Collections 类

List list = Collections.emptyList();

(10)ArrayList和Vector有什么不同?
可以粗略的看成一样的了,只是 Vector 是线程安全的, ArrayList 不是线程安全的。还有一个是 ArrayList 在扩充的时候是扩充 0.5 倍的容量,Vector 默认扩充 1 倍,Vector 可以设置扩充量,ArrayList 不行。

(11)如何合并两个List?

List<String> list = new ArrayList();
List<String> list2 = new ArrayList();
list.addAll(list2);

将 list2 合并到 list 的尾部.

(12)Map中的一个key能否对应两个不同的value?
正常情况下,一个 key 应该只对应一个 value 的,准确点来说,应该是对于两个 key , 如果 key1.equals(key2) == true ,那 key1 和 key2 对应同样的 value。这也是 Map 的实现准则,就是使用 equals 来判断是否对应同样的 value。在 java 4 有一个类比较奇特,java.util.IdentityHashMap 类,先看下文档的说明

This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, in an IdentityHashMap, two keys k1 and k2 are considered equal if and only if (k1==k2). (In normal Map implementations (like HashMap) two keys k1 and k2 are considered equal if and only if (k1==null ? k2==null : k1.equals(k2)).)

This class is not a general-purpose Map implementation! While this class implements the Map interface, it intentionally violates Map’s general contract, which mandates the use of the equals method when comparing objects. This class is designed for use only in the rare cases wherein reference-equality semantics are required.

文档说这个类会比较地址而不是用 equals ,就是当 key1 == key2 为 true 时才认为它们对应同样的 value。这个类用在比较少见的、需要使用地址来比较对象的情形。

(13)Map中的一个value能否对应两个不同的key?
这个很明显是可以的。

(14)如何从Map中删除符合指定条件的value?

Map<String, String> map = new HashMap<String, String>();
map.put("1", "123");
map.put("2", "1234");
map.put("3", "12345");
Iterator<String> iterator = map.values().iterator();
while(iterator.hasNext()) {
  String value = iterator.next();
  if(value.length() > 3) {
    iterator.remove();
  }
}

这样就删除了长度大于 3 的值,这个跟 List 有点像,都是通过 Iterator 来操作。

(15)如何使遍历Map时取出的元素顺序与放入时一致?
要实现这样的功能就要使用到 LinkedHashMap 类,LinkedHashMap 继承自 HashMap,它主要是用链表实现来扩展 HashMap 类,HashMap 中条目是没有顺序的,但是在 LinkedHashMap 中元素既可以按照它们插入图的顺序排序,也可以按它们最后一次被访问的顺序排序。

(16)如何合并两个Map?
Map 的 putAll 方法

Map map1 = new HashMap();
Map map2 = new HashMap();
map1.putAll(map2);

将 map2 合并到 map1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值