Map、Set、List是否有序?可否重复?常用方法整理;以及迭代器(Iterator)初步使用

版权声明:本文为BUG先生原创文章,可任意转载,愿请附上本文链接,谢谢。 https://blog.csdn.net/Edogawa_Konan/article/details/83345396

大致了解下面的图:

 

有序否

允许元素重复否

Collection

List

Set

扫描二维码关注公众号,回复: 3737807 查看本文章

AbstractSet

HashSet

TreeSet

是(用二叉树排序),默认排序

Map

AbstractMap

使用key-value来映射和存储数据,Key必须惟一,value可以重复

HashMap

TreeMap

是(用二叉树排序)

Map、Set、List是否有序

首先明确概念:这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。

list是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。

List<Map<String,Object>> listMaps = new ArrayList<Map<String, Object>>();

List<String> listMaps = new ArrayList<String>();

    Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。它的实现类有:HashMap、TableMap和TreeMap。

其中LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。

Map<String,String> map = new HashMap<String,String>();

    Set是无序的,并且set中的元素不能重复。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:hashSet、TreeSet。

其中LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。

Set<String> apple = new HashSet<String>();

    迭代器(Iterator)是一个对象,它的工作时遍历并选择序列中的对象。迭代器通常被称为轻量级对象,因为创建它的代价小,Java的Iterator只能用来单向移动。

其实,迭代器除了遍历容器之外,最大的功能就是统一了对容器的访问方式。

完全可以将Itarator作为参数,例如(Java编程思想中的源码):

  1. public class CrossContainerIterator{  
  2. public static  void display (Iterator<Pet> it){  
  3.   while(it.hasNext()){  
  4.   Pet p  = it.next();  
  5. System.out.println(p.id+":"+p);  
  6. }  
  7.    
  8. public static void main(String [] args){  
  9.   ArrayList<Pet> pets = Pets.arrayList(8);  
  10.   LinkedList<Pet> petsLL = new LinkedList<Pet>(pets);  
  11.   HashSet<Pet> petsHS = new HashSet<Pet>(pets);  
  12.   TreeSet<Pet> petTS = new TreeSet<Pet>(pets);  
  13.   display(pets.iterator);  
  14.   display(petsLL.iterator);  
  15.   display(petsHS.iterator);  
  16.   display(petsTS.iterator);    
  17. }  
  18. }  

初步使用: 

package Demo;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo_181024_Iterator {

	public static void main (String[] args){
		Set<String> apple = new HashSet<String>();
		apple.add("A1");
		apple.add("A2");
		apple.add("A3");
		apple.add("A4");
		
		Iterator Iter1 = apple.iterator();
		while(Iter1.hasNext()){
			String str1 = (String)Iter1.next();
			if(str1.equals("A2")){
				Iter1.remove();//这样就会影响到了iterator
			}
			System.out.println("Iterator打印方式一:"+str1);
		}
			
		/*for(Iterator Iter2 = apple.iterator(); Iter2.hasNext(); ){
			 String str2 = (String)Iter2.next();
		     System.out.println("Iterator打印方式二:"+str2);
		}*/
		
		System.out.println("Set<String> apple:"+apple);
	}	
}

 


package Demo;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 
 * @author BUG先生
 *	一:只是制定了一个新的地址,但是内容不变
 *	二:内容发生改变,影响到了iterator
 */
class Book
{
	private String name;
 
	public Book(String name) {
		super();
		this.name = name;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	@Override
	public String toString() {
		return "Book [name=" + name + "]";
	}
	
}
public class Demo_181024_Iterator2 {
 
	public static void main(String[] args) {
		
       Set<Book> books = new HashSet<Book>();
       books.add(new Book("sssss"));
       books.add(new Book("qqqqq"));
       books.add(new Book("rrr"));
       books.add(new Book("ttt"));
       
       Iterator<Book>  iter = books.iterator();
       while(iter.hasNext())
       {    	   
    	   Book temp = (Book) iter.next();
    	   System.out.println("1:"+temp);
    	   /*temp = new Book("shizhan");//一*/
    	   temp.setName("shizhan");//二
    	   System.out.println("2:"+temp);
       }
       System.out.println("Set<Book> books:"+books);
	}
}


猜你喜欢

转载自blog.csdn.net/Edogawa_Konan/article/details/83345396