• Java系列,《Java核心技术 卷1》,chapter 13,集合


    13.1.2 Java类库中的集合接口和迭代器接口
        删除元素,对于next和remove的调用是互相依赖的,如果调用remove之前没有调用next,则会跑出IllegalStateException异常。如果想要删除两个相连的元素:
    1. it.remove();
    2. it.remove();//error
    3. 而是应该
    4. it.remove();
    5. it.next();
    6. it.remove();
        
        怎么觉得这种接口设计好傻呢。谁干的?

        如果想要实现自己的集合类,可以从Abstractxxxx系列的抽象类来扩展,这样可以少实现很多方法。比如AbstractCollection, AbstractQueue方法。
        java中的迭代器和与c++中的迭代器是不同的,java中的集合本身实现了迭代器接口,而c++中则是通过
        
    1. import java.util.ArrayList;
    2. import java.util.Collection;
    3. import java.util.Iterator;
    4. public class LearnCollection {
    5. public static void main(String[] args) {
    6. // TODO Auto-generated method stub
    7. ArrayList<String> nameList = new ArrayList<String>();
    8. nameList.add("zhang.san");
    9. nameList.add("li.si");
    10. nameList.add("wang.wu");
    11. nameList.add("zhao.yi");
    12. System.out.println("initial content.");
    13. printCollection(nameList);
    14. printViaIterator(nameList.iterator());

    15. removeViaIterator(nameList.iterator(), "li.si");
    16. System.out.println("");
    17. System.out.println("after remove li.si");
    18. printCollection(nameList);
    19. printViaIterator(nameList.iterator());
    20. }
    21. /**
    22. * remove via iterator
    23. * @param it
    24. * @param value
    25. */
    26. static void removeViaIterator(Iterator<?> it, String value){
    27. while(it.hasNext()){
    28. if(it.next().toString() == value){
    29. it.remove();
    30. System.out.println(String.format("remove %s success.", value));
    31. return;
    32. }
    33. }
    34. System.out.println(String.format("remove %s failed.", value));
    35. }
    36. /**
    37. * @param it
    38. */
    39. static void printViaIterator(Iterator<?> it){
    40. System.out.println("Print via iterator:");
    41. while(it.hasNext())
    42. System.out.println(String.format(" item:%s", it.next().toString()));
    43. }
    44. /**
    45. * @param collection
    46. */
    47. static void printCollection(Collection<?> collection){
    48. System.out.println("collection content:");
    49. for(Object item: collection){
    50. System.out.println(String.format(" item:%s", item.toString()));
    51. }
    52. }
    53. }
    下面测试一下Collection.toArray的用法。
    从下面的代码可以看出,当arrayToFill的大小不够的时候,就不会填充。
    1. static void testToArray(){
    2. LinkedList<String> strList = new LinkedList<String>();
    3. strList.add("zhang.san");
    4. strList.add("li.si");
    5. strList.add("wang.wu");
    6. print("filled array is not large enough.");
    7. testToArrayHelper(strList, new String[2]);
    8. print("filled array is large enough.");
    9. testToArrayHelper(strList, new String[3]);
    10. }
    11. static void testToArrayHelper(LinkedList<String> strList, String[] filledArray){
    12. String[] returnedArray = strList.toArray(filledArray);
    13. printArray("filled array:", filledArray);
    14. print("");
    15. printArray("returned array:", returnedArray);
    16. print("");
    17. if(filledArray == returnedArray)
    18. print("filled array is equal returned array.");
    19. else
    20. print("filled array is not equal returned array.");
    21. }
    22. static <T> void printArray(String title, T[] array){
    23. print(title);
    24. for(T item: array){
    25. if(item != null)
    26. print("item:" + item.toString());
    27. else
    28. print("item is null");
    29. }
    30. }
    31. static void print(String info){
    32. System.out.println(info);
    33. }
    输出结果如下:
    1. filled array is not large enough.
    2. filled array:
    3. item is null
    4. item is null
    5. returned array:
    6. item:zhang.san
    7. item:li.si
    8. item:wang.wu
    9. filled array is not equal returned array.
    10. filled array is large enough.
    11. filled array:
    12. item:zhang.san
    13. item:li.si
    14. item:wang.wu
    15. returned array:
    16. item:zhang.san
    17. item:li.si
    18. item:wang.wu
    19. filled array is equal returned array.


    13.2 具体的集合
        除了以map结尾的类,其他都实现了collection接口。
       
        关于LinkedList的 ListIterator的add和remove    
    1. static void testListIteratorAdd(){
    2. LinkedList<String> strList = new LinkedList<String>();
    3. strList.add("1");
    4. strList.add("2");
    5. strList.add("3");
    6. print("init content:");
    7. printCollection(strList);
    8. ListIterator<String> it = strList.listIterator();
    9. it.next();
    10. it.add("1.1");
    11. it.add("1.2");
    12. print("after insert 2 item");
    13. printCollection(strList);
    14. }
    输出如下:
    1. init content:
    2. collection content:
    3. item:1
    4. item:2
    5. item:3
    6. after insert 2 item
    7. collection content:
    8. item:1
    9. item:1.1
    10. item:1.2
    11. item:2
    12. item:3

    测试listIterator的删除功能。
    1. static void testListIteratorRemove(){
    2. LinkedList<String> strList = new LinkedList<String>();
    3. strList.add("1");
    4. strList.add("2");
    5. strList.add("3");
    6. print("init content:");
    7. printCollection(strList);
    8. ListIterator<String> it = strList.listIterator();
    9. it.next();
    10. it.remove();//ok
    11. print("after remove 1 item");
    12. printCollection(strList);
    13. it.remove();//error
    14. print("after remove 2 item");
    15. printCollection(strList);
    16. }
    输出如下,也就是说,ListIterator.remove是依赖于迭代器的状态的,每次调用remove之前,必须先调用一次next或者previous函数。
    1. init content:
    2. collection content:
    3. item:1
    4. item:2
    5. item:3
    6. after remove 1 item
    7. collection content:
    8. item:2
    9. item:3
    10. Exception in thread "main" java.lang.IllegalStateException
    11. at java.util.LinkedList$ListItr.remove(LinkedList.java:923)
    12. at me.ygc.javabasic.learnJava.LearnCollection.testListIteratorRemove(LearnCollection.java:33)
    13. at me.ygc.javabasic.learnJava.LearnCollection.main(LearnCollection.java:15)

     13.2.3 散列集
        在java中,散列表用链表数组实现,每个列表被称为桶(bucket), 先用散列码找到桶,然后在桶内使用equals方法来逐个比较查找。
        如果散列表太满,就要再散列。也就是创建一个新的更大的散列表,将原来的所有元素转移过去,然后丢弃原来的表。
        装填因子默认值为0.75,当超过0.75的时候,就会自动进行再散列。
        
        只有不关心集合中元素位置的时候,才会使用HashSet。
        
        
    13.2.8 映射表
        有两种, HashMap,无序的, TreeMap,有序的;   
        如果不需要排序,就选择HashMap,因为这个会稍微快一点。













  • 相关阅读:
    HBuilder运行时Chrome时提示“浏览器运行尚不支持此种类型文件
    微信小程序开发指南
    mysql免安装版win10的安装教程
    跨域解决方案
    安装sass(css预处理语言)
    vscode必装插件(Vue)
    laravel低版本安装pjax出问题解决方法
    laravel笔记1后台配置
    php 类和方法
    PHP类和对象之类的属性
  • 原文地址:https://www.cnblogs.com/strinkbug/p/5062609.html
Copyright © 2020-2023  润新知