java List 和Set集合遍历,以及相互转化

时间:2021-03-06 06:44:14

list和set集合是java中最常见的两种数据结构,都是Collection的子集,今天就简单的说说他们两者的遍历以及相互转化吧。


一、list的遍历

有三种遍历方法:
/** 
* list的三种遍历 
* @author Owner 

*/  
public class ListTest {  
 
   public static void main(String[] args) {  
         
       List<String> list = new ArrayList<String>();  
 
       list.add("a");  
       list.add("b");  
       list.add("c");  
       list.add("c");//可添加重复数据  
         
       //遍历方法一  迭代器
       for(Iterator<String> iterator = list.iterator();iterator.hasNext();){  
           String value = iterator.next();  
             
           System.out.println(value);  
       }  
         
       //遍历方法二  超级for循环
       for(String value : list){  
           System.out.println(value);  
       }  
         
       //遍历方法三   
       for(int i=0;i<list.size();i++){  
           System.out.println(list.get(i));  
       }  
         
   }  
}  

分析一下这三种遍历吧,第一种迭代器的遍历,执行过程中会进行数据锁定,性能上是安全的,效率较低;
第二种,是java新语法,增强型for循环,其中内部也是调用了迭代器;
第三种,直接使用取数组的方式,效率最快,但会有多线程安全问题。
原理如下:
ArrayList底层是采用数组来保存数据的,对于访问数组里的数据来说,直接采用数组索引当然是最快的了,相当于直接从内存读取数据,其他的两种迭代方式,实际上都是一种,即iterator,foreach包装了一下;iterator遍历最终还是要通过索引来访问数据,源码中对应的get方法了。

Set的遍历和List类似,由于set没有get方法,所有第三种是不可以的;
总结:综合考虑使用第二种,增强型for循环就可以

二、List和Set相互转化:
这个需求一般也不多,直接上代码吧:
/**
* List和Set的转化(Set转化成List)
*/
public static <T> List<T> SetToList(Set<T> set) {
List<T> list = new ArrayList<>();
list.addAll(set);
return list;
}
使用泛型实现。不过值得注意的是,list转化成set会丢失数据,重复数据会丢失。