你的位置:首页 > Java教程

[Java教程]第4章 集合类


 

Java提供了一种可以存数一组数据的数据结构,其提供了丰富的方法,在实际开发中往往比数组使用的广泛。这种数据结构成为集合:Collection。

Collection是一个接口,其定义了集合的相关功能方法。

 

List接口是Collection的子接口,用于定义线性表数据结构;

可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少。并且List是可重复集.

List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口。

可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别。

 

4.1 List接口——有序集合类 279


4.1.1 add方法——向列表中插入元素 279

 

 List<String> list = new ArrayList<String>();    list.add("java");        list.add("cpp");        list.add("php");    list.add("c#");        list.add("objective-c");


4.1.2 addAll方法——将指定collection添加到列表中 280

 

 List<String> list = new ArrayList<String>();    list.add("java");        list.add("cpp");        list.add("php");    list.add("c#");        list.add("objective-c");        //addAll方法用于将给定集合中的所有元素添加到当前集合中    List<String> list2 = new ArrayList<String>();    list2.addAll(list);        System.out.println(list2);

 

4.1.3 clear方法——从列表中移除所有元素 282
4.1.4 contains方法——判断列表中是否包含指定元素 283
4.1.5 containsAll方法——判断列表中是否包含指定collection所有元素 283
4.1.6 equals方法——比较指定的对象与列表是否相等 285

 


4.1.7 get方法——获取列表指定位置的元素 285
4.1.8 set方法——替换列表中指定位置的元素 286

 

 List<String> list = new ArrayList<String>();    list.add("java");        list.add("cpp");        list.add("php");    list.add("c#");        list.add("objective-c");    // get方法遍历List    for (int i = 0; i < list.size(); i++) {      System.out.println(list.get(i));    }     String value = list.set(1, "c++");    System.out.println(value); // cpp    System.out.println(list); // [java, c++, php, c#, objective-c]     // 交换位置1和3上的元素    list.set(1, list.set(3, list.get(1)));    System.out.println(list);     // [java, c#, php, c++, objective-c]

 

4.1.9 hashCode方法——返回列表的哈希码值 287
4.1.10 indexOf方法——返回第一次出现指定元素的位置 287
4.1.11 lastIndexOf方法——返回最后一次出现指定元素的位置 288
4.1.12 isEmpty方法——判断集合是否为空 289

 


4.1.13 iterator方法——返回迭代器 290
4.1.14 listIterator方法——返回列表迭代器 290

Collection提供了一个遍历集合的通用方式,迭代器(Iterator)。获取迭代器的方式是使用Collection定义的方法:

迭代器Iterator是一个接口,集合在覆盖Collection的iterator()方法时提供了迭代器的实现。

Iterator提供了统一的遍历集合元素的方式。

迭代器用于遍历集合的两个主要方法:

  • boolean hasNext():判断集合是否还有元素可以遍历。
  • E next():返回迭代的下一个元素

遍历集合应遵循“先问后取”的方式,也就是说,应当在确定hasNext()方法的返回值为true的情况下再通过next()方法取元素。

由此可以看出,使用迭代器遍历集合是通过boolean值驱动的,所以它更适合使用while循环来遍历。

 

 Collection<String> c = new HashSet<String>();    c.add("java");        c.add("cpp");        c.add("php");    c.add("c#");        c.add("objective-c");    Iterator<String> it = c.iterator();    while (it.hasNext()) {      String str = it.next();      System.out.println(str);    } 

 

 


4.1.15 remove方法——移除列表中的指定元素 292
4.1.16 removeAll方法——从列表中移除指定collection包含的所有元素 293

 

 List<String> list = new ArrayList<String>();    list.add("java");    list.add("c#");    System.out.println(list); // [java, c#]             list.add(1, "cpp");    System.out.println(list); // [java, cpp, c#]             list.remove(2);    System.out.println(list); // [java, cpp]        list.removeAll(list);    System.out.println(list);


4.1.17 retainAll方法——保留指定collection包含的所有元素 294
4.1.18 size方法——返回列表中元素的个数 294


4.1.19 subList方法——获取列表中指定范围的子列表 295

 

List的subList方法用于获取子List。需要注意的是,subList获取的List与原List占有相同的存储空间,对子List的操作会影响的原List。

 List<Integer> list = new ArrayList<Integer>();    for (int i = 0; i < 10; i++) {      list.add(i);    }    System.out.println(list); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]    List<Integer> subList = list.subList(3, 8);    System.out.println(subList); // [3, 4, 5, 6, 7]     // subList获得的List和源List占有相同的数据空间    for (int i = 0; i < subList.size(); i++) {      subList.set(i, subList.get(i) * 10);    }    System.out.println(subList); // [30, 40, 50, 60, 70]    System.out.println(list); // [0, 1, 2, 30, 40, 50, 60, 70, 8, 9]     // 可以用于删除连续元素list.subList(3, 8).clear();    System.out.println(list);


4.1.20 toArray方法——返回所有元素的数组 296

List的toArray方法用于将集合转换为数组。但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能。

我们可以传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素。

 List<String> list = new ArrayList<String>();    list.add("a");    list.add("b");    list.add("c");    //通常我们传入的数组不需要给定长度    String[] strArr = list.toArray(new String[] {});        System.out.println(Arrays.toString(strArr)); // [a, b, c]

 

数组转化为list

//方法一    String[] strArr = { "a", "b", "c" };     List<String> list = Arrays.asList(strArr);    System.out.println(list); // [a, b, c]    // list.add("d"); // 会抛出UnsupportedOperationException     //   java.util.Arrays$ArrayList     System.out.println(list.getClass().getName());               //方法二    List<String> list1 = new ArrayList<String>();    list1.addAll(Arrays.asList(strArr));     list1.add("d");    System.out.println(list1);

 

 


4.2 Map接口——映射集合类 297


4.2.1 clear方法——移除所有映射关系 297
4.2.2 containsKey方法——判断是否包含指定的键名 298
4.2.3 containsValue方法——判断是否包含指定的键值 298
4.2.4 equals方法——判断是否与指定的对象相同 299
4.2.5 get方法——返回指定键所映射的值 300
4.2.6 isEmpty方法——判断是否为空 300
4.2.7 keySet方法——获取Map集合的所有key 301
4.2.8 put方法——向指定索引位置添加对象 301
4.2.9 putAll方法——追加另一个Map对象到当前Map集合 302
4.2.10 remove方法——移除Map集合中指定键名的内容 303
4.2.11 size方法——获取Map集合类的大小 304
4.2.12 values方法——获取Map集合中所有键值对象 304


4.3 Set接口——无重复元素集合类 305


4.3.1 add方法——向Set集合中添加对象 305
4.3.2 addAll方法——向Set集合添加另一个集合的所有内容 306
4.3.3 clear方法——从Set集合中移除所有内容 307
4.3.4 contains方法——判断Set集合是否包含指定对象 307
4.3.5 containsAll方法——判断Set集合是否包含另一个集合中全部对象 308
4.3.6 equals方法——比较指定对象与此Set是否相等 309
4.3.7 isEmpty方法——判断Set集合是否为空 309
4.3.8 iterator方法——获取Set集合的迭代器 310
4.3.9 remove方法——移除Set集合中指定对象 311
4.3.10 removeAll方法——移除另一个集合所包含的所有内容 311
4.3.11 retainAll方法——保留另一个集合所包含的所有内容 312
4.3.12 size方法——获取Set集合类的大小 313
4.3.13 toArray方法——用Set集合的所有对象创建数组 313