java里set list 为啥能遍历集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java里set list 为啥能遍历集合相关的知识,希望对你有一定的参考价值。

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会丢失数据,重复数据会丢失。
参考技术A 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会丢失数据,重复数据会丢失。
参考技术B 底层实现了迭代器。

Java中Set集合怎样用for遍历?

Java中Set集合怎样用for遍历?

增强型的for循环 和普通for循环一样
增强型的for循环 优点主要体现在集合中,随便举个例子
比如对 set 的遍历
一般是迭代遍历:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext())
String str = it.next();
System.out.println(str);

for循环遍历:
for (String str : set)
System.out.println(str);

是不是简单些?

优点还体现在泛型 假如 set中存放的是Object

Set<Object> set = new HashSet<Object>();
for循环遍历:
for (Object obj: set)
if(obj instanceof Integer)
int aa= (Integer)obj;
else if(obj instanceof String)
String aa = (String)obj

........


唯一的缺点就是 在遍历 集合过程中,不能对集合本身进行操作
for (String str : set)
set.remove(str);//错误!
参考技术A for(Object object : set)
for(int i=0;i<=list.size();i++)
list.get(i);

两种方式都可以
在MyEclipse中打for 按 Alt +/ 有for的所有使用方式 。
手打不容易谢谢采纳
参考技术B 你如果觉得set集合跟你以往集合操作习惯不一样,完全可以把他转化成List集合,
Set<String> set = new HashSet<String>();
List<String> list=new ArrayList<String>(set);

以上是关于java里set list 为啥能遍历集合的主要内容,如果未能解决你的问题,请参考以下文章

Java中Set集合怎样用for遍历?

Java中Set集合怎样用for遍历?

Java中Set集合怎样用for遍历?

Java集合list,map,set区别及遍历

java list集合问题

java 遍历集合的时候对集合进行操作