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

从项目例子引发的总结:

@RequestMapping(value="/home")  
    public String home(Model model,PageRequest pageRequest){  
        try {  
         pageRequest.setSort(new Sort(Direction.DESC,"modelEditNo"));  
         Page<ContractModel> page = contractModelService.query(pageRequest);
            /*是根据合同模板编号modelNo,用来过滤掉之前的版本*/  
            Map<String,String> map = new HashMap<String,String>();  
            Iterator<ContractModel> clist = page.iterator();  
            while (clist.hasNext()) {  
                ContractModel objmodel = clist.next();  
              /*为什么要有这个Map集合呢?这就是存放模板编号,看已经存在了没。*/  
                if(map.get(objmodel.getModelNo())!=null){  
                    clist.remove();  
                }  
                map.put(objmodel.getModelNo(), objmodel.getModelNo());      
            }  
            model.addAttribute("page", page);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return "/modules/contractmodel/list";  
} 

那么,开始:先大致了解下面的图:

 

有序否

允许元素重复否

Collection

List

Set

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>();

遍历List集合的三种方法

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

list.add("aaa");

list.add("bbb");

list.add("ccc");

方法一:

超级for循环遍历

for(String attribute : list) {

System.out.println(attribute);

}

方法二:

对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:

for(int i = 0 ; i < list.size() ; i++) {

System.out.println(list.get(i));

}

方法三:

集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代

Iterator it = list.iterator();

while(it.hasNext()) {

System.out.println(it.next());

}

    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);
	}
}


 

 

 

发布了51 篇原创文章 · 获赞 66 · 访问量 12万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览