zoukankan      html  css  js  c++  java
  • Java——集合

    一、集合接口和迭代器

    在Java类库中,Collection接口是所有集合类的基本接口。这个接口有两个基本方法:add和iterator。
    add方法用于向集合中添加元素。如果结果改变返回true,否则返回false。
    iterator方法用于返回一个实现了Iterator接口的对象。
    public interface Iterator{
    
         Boolean hasNext(); 
         Object next(); 
         void remove();     
    }

    通过反复调用next方法,可以遍历集合中每个元素。为了防止在到达集合末尾时抛出异常,我们需要在调用next之前调用hasNext方法,如果迭代器对象还有多个可访问的元素,则返回true,否则返回false。

    public class Ergodic {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(5);
            list.add(2);
            list.add(3);
    
            java.util.Iterator<Integer> it = list.iterator();
            while (it.hasNext()) {
                int i = (Integer) it.next();
                System.out.println(i);
            }
    }

    当然,这里循环有更加简便的方法。

    public class Ergodic {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(5);
            list.add(2);
            list.add(3);
    
            System.out.println("用iterator+while");
            java.util.Iterator<Integer> it = list.iterator();
            while (it.hasNext()) {
                int i = (Integer) it.next();
                System.out.println(i);
            }
            
            System.out.println("用for循环遍历");
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
    
            System.out.println("用增强for循环");
            for (Integer i : list) {
                System.out.println(i);
            }
          
            System.out.println("用iterator+for");
            for (java.util.Iterator<Integer> iter = list.iterator(); iter.hasNext();) {
                int i = (Integer) iter.next();
                System.out.println(i);
            }
        
        }
    }

    由此可见,用增强for循环可以更加简练的表示同样的操作,并且对于任意标准类库中的集合都可以使用“for each”循环。

    二、具体集合

    集合类存放于java.util包中。
    集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
    集合类型主要有3种:set(集)、list(列表)和map(映射)。

    集set (没有重复项目的集合)  

    HashSet-构造一个散列集,用hashCode()方法返回这个对象的散列码

    TreeSet-构造一个有序树集  

    public class TreeSetT {
    
        public static void main(String[] args) {
            SortedSet<String> set = new TreeSet<>();
            set.add("B");
            set.add("C");
            set.add("A");
            for(String s:set){
                System.out.println(s);
            }
        }
    }

    运行结果:ABC

    对象的比较,这里使用compareTo,如果this位于other之前返回负值,如果两个对象在排列中处于相同的位置,返回0 ,否则返回正值。

    LinkedHashSet-对集迭代时,按增加顺序返回元素 

    列表List (描述一个有序的集合)

    ArrayList(封装了一个动态再分配的对象数组)-类似于Vector。区别:

    一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
    二.数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半。

    因此,在使用时代码要在同步上耗费大量时间,所以在不需要同步时,使用ArrayList。

    LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。 

    用add()加入元素,将对象添加至链表的尾部。 remove()删除元素。 运行结果:[B, C]

    public class LinkedListT {
        public static void main(String[] args) {
            List<String> list = new LinkedList<>();
            list.add("A");
            list.add("B");
            list.add("C");
            java.util.Iterator<String> iter = list.iterator();
            iter.next();//返回第一个元素。
            iter.remove();   
            System.out.println(list);
        }
    }

    由于要将元素添加至链表的中间,子接口ListIterator用来反向遍历链表,与next方法一样,previous返回越过的对象。

    下面是越过链表中第一个元素A并在第二个元素B之前添加元素a的一个例子。运行结果:[A, a, B, C]

    public class LinkedListT {
        public static void main(String[] args) {
            List<String> list = new LinkedList<>();
            list.add("A");
            list.add("B");
            list.add("C");
            java.util.ListIterator<String> iter = list.listIterator();
            iter.next();
            iter.add("a");   
            System.out.println(list);
        }
        
    }

    set()方法取代调用next或者previous返回的上一个元素。运行结果:[a, B, C][a, C]

    public class LinkedListT {
        public static void main(String[] args) {
            List<String> list = new LinkedList<>();
            list.add("A");
            list.add("B");
            list.add("C");
            java.util.ListIterator<String> iter = list.listIterator();
            iter.next();//返回第一个元素
            iter.set("a");
            System.out.println(list);
            iter.next();//返回下一个元素
            iter.remove();   
            System.out.println(list);
        }
    }

    映射表Map  (用于存放键/值对)

    实现Map接口的两个类:

    HashMap-散列表的通用映射表 

     Map<String, Integer> map = new HashMap<>();  
     map.put("key", 1); 

    TreeMap-构造树映射表   

    三个视图:

    键集KeySet()  

    值集合(不是集)values() 

    键/值对集enrySet()

    注意:KeySet既不是HashSet,也不是TreeSet,而是实现了Set接口的某个其他类的对象,Set扩展了Collection接口,因此可以与使用人任何集合一样使用KeySet。  

    Set<Integer> keys = map.keySet();   
    for (Integer key : keys) {
          System.out.println(key);             
    } 

    如果需要查看键与值,可用下面两种方法

    public static void main(String[] args) {
            HashMap<Integer, String> map = new HashMap<Integer, String>();  
            map.put(1, "a");  
            map.put(2, "b");  
            map.put(3, "c");        
            /* 
             * 第一种 
             */  
            Set<Entry<Integer, String>> set = map.entrySet();  
            java.util.Iterator<Entry<Integer, String>> itor = set.iterator();  
            while (itor.hasNext())  
            {  
                Entry<Integer, String> entry = itor.next();  
                System.out.println(entry.getKey() + "     " + entry.getValue());  
            }         
            /* 
             * 第二种 
             */  
            for (Entry<Integer, String> entry : map.entrySet())  
                System.out.println(entry.getKey() + "     " + entry.getValue());
        }

    专用集与映射表类


    WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

    LinkedHashMap用来记住插入元素项的顺序。

  • 相关阅读:
    UE4智能指针:TUniquePtr
    浅析UE4垃圾回收
    UE4中资源的引用
    ELF文件基础
    【JVM】JVM和Java 体系架构
    【Java多线程】Java线程生命周期、线程同步、线程通信(二)
    【Java多线程】Java多线程基础(一)
    【Java面试题】MySQL索引底层为什么用到B+树
    【算法】B树、B+树详解
    【Kafka】 Kafka的简介与架构(三)
  • 原文地址:https://www.cnblogs.com/iCcccy/p/4708600.html
Copyright © 2011-2022 走看看