zoukankan      html  css  js  c++  java
  • Collection中四个接口,10个实现类的基本应用

    【colletion】:list(arryList,linkList)、set(hashSet)

    四个接口	colletion
    
    	list			            set						 map
    
    	[ArrayList]不安全	    [HashSet]				        HashMap(线程不安全,常用)
    	LinkList		            LinkedHashset			        LinkedHashMap
    	vector(线程安全)	    TreeSet					TreeMap* 												
                                                                                                        Hashtable(线程安全)
    		
            10个实现类
    

    StringBuffer线程安全。
    StringBild线程不安全。

    [四个接口的区别]
    collection:存储不唯一、无序的数据。
    list:存储有序的、不唯一的数据。
    set:存储无序的、唯一的数据。
    map:以键值对的形式存储数据,以键取值。键不能重复,值可以重复。

     【list 接口】
    

    1.常用方法:
    ①add():在列表最后添加元素;
    ②add(index,obj):在列表的指定位置插入元素。
    ③size();返回当前列表的元素。
    ④get(int index);返回下表为index的元素。
    如果没有泛型约束,返回object类型,需要强转;如果有泛型约束,直接返回泛型类型,无需强转。
    ⑤list.clear();清除列表中的所有数据。isEmpty检测列表不能为空
    ⑥传入一个对象检测了表中是否包含该对象,如果传入的是String和基本数据类型可以直接比对,
    如果传入的是实体对象,默认只比对两个对象的地址,因此需要在实体类中重写equals方法
    ⑦indexOf();传入一个对象,返回该对象在列表中首次出现的地址。
    ⑧remove();传入一个下标,或则和一个对象,删除指定的元素。
    如果是下标,返回删除元素的对象,如果大于size();下标越界。
    如果是对象,则要求重写equals对象返回true或false
    ⑨set(index obj);用新传入的对象将指定位置的对象替换掉。
    ⑩ subList(1,3);截取一个子列表,返回List类型;
    toArray();将列表转为数组,返回一个object[]类型的对象。

    [迭代器]
    使用迭代器遍历列表
    ①使用列表调用.iterator()返回一个迭代器对象。
    ②使用迭代器对象调用.hasNext()判断是否有下一条数据。
    ③使用迭代器对象调用.next()去除下一条数据

    使用:

    Iterator iter= list1.iterator();

    while(iter.hasNext()){
    News news = iter.next();
    system.out.println(news);

    }

    ArrayList
    实现了一个长度可变的数组,在内存空间中开辟了一串连续的空间,与数组的区别在于元素可以随时修改。
    这样存储结构,在循环遍历和随机访问时速度比较快。

    LinkedList
    使用链表结构存储数据,在插入和删除元素时比较快。

    linkedList的特有方法:
    ①addFirst();开头插入元素
    ② addLast();结尾插入元素

    removeFirst();删除第一个元素,返回删除的元素
    removeLast();返回列表最后一个元素,返回删除的元素

    getFirst();返回列表第一个元素,不会删除
    getLast();返回列表最后一个元素,不会删除

                【Set接口】
    	  
    	  1、 常用方法:与List接口基本相同。
    	     但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法。
    	    例如: get(index)  remove(index)   add(index,obj)  ....
    	     
    	 2、Set接口的特点: 唯一、 无序;
    	  
    	 3、 HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的hashCode进行散列运算,
    	    得到一个散列值后在进行运算,确定元素在序列中存储的位置。
    	    
    	    HashSet如何确定两个对象是否相等?
    	    ① 先判断对象的hashCode(),如果hashCode不同,那肯定不是一个对象。
    	    如果hashCode相同,那继续判断equals()方法;
    	    ② 重写equals()方法。
    	    
    	    >>>所以,使用HashSet存储实体对象时,必须重写对象的hashCode() 和 equals() 两个方法!!
    	    
    	 4、 LinkedHashSet: 在HashSet的基础上,新增了一个链表。
    	    用链表来记录HashSet中元素放入的顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读出元素。
    	    
    	 5、 TreeSet: 将存入的元素,进行排序,然后再输出。
    	    如果存入的是实体对象,那么实体类必须实现Comparable接口,并重写compareTo()方法;
    	    
    	    或者,也可以额在实例化TreeSet的同时,通过构造函数传入一个比较器:
    	    比较器: 一个实现了Comparator接口,并重写了compare()方法的实现类的对象。
    	    
    	    // 使用匿名内部类,拿到一个比较器对象。
    	    Set<Person> set = new TreeSet<Person>(new Comparator(){
    	  	public int compare(Person p1, Person p2){
    	    		return p1.getId() - p2.getId();
    	    	}
    	    });
    	    
    	    // 自定义一个比较类,实现Comparator 接口。
    	    Set<Person> set = new TreeSet<Person>(new Compare());
    	    class Compare implements Comparator(){
    	    		// 重写compare方法。
    	    }
    	    
    	 【Comparable接口 和 Comparator接口的区别】
    	 1、 Comparable由实体类实现,重写compareTo()方法;
    	    实体类实现Comparable接口以后,TreeSet使用空参构造即可。
    	    
    	 2、 Comparator需要单独一个比较类进行实现,重写Compare()方法。
    	 	    实例化TreeSet的时候,需要传入这个比较类的对象。
    
    
                /**
    	 * 使用foreach遍历
    	 */
    	for(String s : set1){
    		System.out.println(s);
    	}
    	
    	/**
    	 * 使用迭代器遍历
    	 */
    	Iterator<String> iter = set1.iterator();
    	while (iter.hasNext()) {
    		System.out.println(iter.next());
    	}
    
    
    	【map】
     
     以键值对的形式存储数据。键不能重复,值可以重复。
    
    [hashMap与hashTable的区别]----------------------------------------重点
    1.HashTable是线程安全(线程同步)的,HashMap是线程不安全的(线程不同步);
    2.hashTable的键不可以为null,HashMap的键可以为null;
    3.HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口。
    4.HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
        5.HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
        6.HashMap和Hashtable的底层实现都是数组+链表结构实现。
        7.两者计算hash的方法不同: 
            Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模:
    
    引用来自详解:https://blog.csdn.net/qq_35181209/article/details/74503362
    
    [LinkedHashMap]
    可以使用链表记录数据存入的次序。
    
    [根据键的顺序,选择排序后输出]
    
    [treeMap]
    根据键的顺序,进行排序后,输出。
    
    如果传入的是实体对象,必须重写比较函数,详见treeSet
  • 相关阅读:
    指针的相关概念
    Linux库函数
    计算机组成
    常用校验码及示例
    判断文件是否被占用的三种方法
    服务主机superFetch占用磁盘过多
    renameTo()判断文件是否被占用(判断大文件是否完成拷贝这个动作)
    xshell下mysql数据库只导出表结构不导出数据
    Java_判断文件是否写入完成
    Java_监听文件夹或者文件是否有变动
  • 原文地址:https://www.cnblogs.com/dadada-jiasheng/p/8853244.html
Copyright © 2011-2022 走看看