Set和List都是接口,都实现了Collection接口和Iterable接口。
两者的转换不常进行,通过集合的 addAll() 方法可以实现。
/**
* List和Set的转化(Set转化成List)。
*/
public static <T> List<T> SetToList(Set<T> set) {。
List<T> list = new ArrayList<>();。
list.addAll(set);// 转换核心。
return list;。
import java.util.HashSet;import java.util.Set;。
public class tes {。
public static void main(String[] args) {。
//set集合,元素是不重复的。通过equal判断是否相等。
//如果是自定义的对象,需要重写equal和hashcode方法。
Set set = new HashSet();。
set.add("sina");。
set.add("baidu");。
set.add("baidu");。
System.out.println(set.toString());。
set.remove("baidu");。
System.out.println(set.toString());。
======
结果:
[baidu, sina]
[sina]
转换其实很简单,SET集合里面的元素是不重复的赚LIST是比较容易的。
比如:
一个set集合A 要转换成一个LIST集合。
那么可以这么写
List list = new ArrayList(A);。
这样就能转换完成
Set和List都是接口,他们的取得都必须是实现了Collection接口和Iterable接口的类。只要是实现了这两个接口的类都就可以实现取得Set接口对象和List接口的目的。
我只用过Set,觉得他们用的地方不一样,所以应该是不能转换的。
真正要进行转换的话,就应当是用实现了Collection接口和Iterable接口的集合对象去取得这两个接口的对象吧。
类似的问题被提了很多遍了,你可以从根子上这样看:
HashSet<T>的构造方法之一是HashSet<T>(IEnumerable<T> collection),这说明哈希集可以在构造时通过传入一个有着*元素类型为T的可枚举的集合*完成初始化。
如1楼所示,List<string> _dd其实本身就继承有IEnumerable<string>接口,所以不要使用Linq的cast系列方法,你只需要一行:
HashSet<string> _ss=new HashSet<string>(_dd);。
大多数的集合类型都可以这样通过构造来初始化。
由于这种转换是结构上的转换而非值的转换,所以绝大多数情况下都需要new一下目标对象,指望List<T>自己提供转换结构的方法是不靠谱的。
此外要说一句,你说的“地球人都知道”没有错,但是它还真的不慢哟。要知道,即使是使用上述构造方法,本质上来说CLR也是通过一个一个枚举_dd的元素并添加到_ss去的,两种方法在代码量上有差距,但是执行效率上几乎相等的。(因为编译时代码会自动优化的)
真的要使用大数据(如含有10万string的List<string>),请勿使用上述两种方法(因为都慢),你需要学习Parallel系列的并行处理,可以理解为一种能够利用到所有CPU核心的多线程处理。
原文地址:http://www.qianchusai.com/list%E8%BD%AC%E5%8C%96%E4%B8%BAset.html