
话说 你用linq不就行了,灵活得多,foreach那么麻烦
var reslut = listWhere(c=>cid == "zz")Select(t=>t);通过remove和add方法,set集合中的对象属性为private final
Set接口
集合里的多个对象没有明显顺序。Set集合和Collection基本一样,没有
提供额外方法,只是和Collection行为不同
Set集合不允许包含相同的元素,如果add的是两个相同元素会返回false
Set不实用==运算符,根据equals方法
HashSet类
HashSet类是Set接口的典型实现,大多数时候使用Set集合都是用这个类实现
HashSet按Hash算法来存储集合中的元素
HashSet特点:
1不能保证元素的排列顺序,顺序可能变化
2HashSet不是同步的,多个线程同时访问一个Set集合,必须用代码
保证同步
3集合元素值可以是null
当向HashSet集合中存入一个元素,HashSet会调用该对象的HashCode()
得到对象的hashCode,根据HashCode来决定对象在HashSet中的位置
如果两个元素equal方法比较返回true但是hashCode()方法返回值不同,
HashSet会把两个元素存储在不同位置
HashSet判断两个元素相同需要equal和hashCode都相同
因此重写类的equals方法和hashCode()方法要保证两个对象通过equals
返回true时hashCode也相等
Hash算法保证通过一个对象快速找到另一个对象。可以很快的执行,当需要
查找集合中的某个元素时,hash算法可以直接根据该元素的值找到该元素
从而让程序快速找到元素。
在数组中通过数组元素索引寻找元素,HashSet通过hashcode索引
重写hashCode()方法的基本步骤
当两个对象通过equals方法返回true时,两个对象的hashCode相等
对象中用作equals比较标准的属性,应该用来计算hashCode
向HashSet中添加可变对象时,如果修改HashSet集合中对象,有可能导致
该对象与集合中其他对象相等,从而导致HashSet无法正确访问对象
HashSet有一个子类 LinkedHashSet,LinkedHashSet集合也是根据HashCode来决定
元素的存储位置,同时使用链表维护元素次序,这样是的元素看起来是以
插入顺序保存,便利集合时会按插入顺序来访问。
Linked需要维护元素的插入顺序,性能略低于HashSet,但在迭代时性能更好
TreeSet是SortedSet接口的唯一实现
TreeSet可以确保元素处于排序状态。提供了几个额外方法:
1Comparator
comparator():返回当前Set使用的Comparator,或者null,表示
自然的方式排序
2Object first():返回集合中的第一个元素
3Object last():返回集合中最后一个元素
4Object lower(Object
e):返回集合中位于指定元素之前的元素
5Object higher(Object
e):返回集合中位于制定元素之后的元素
6SortedSet
subSet(fromElement,toElement):返回set的子集,范围从from到to
7SortedSet headSet(toElement)返回set子集,小于toElement
8SortedSet
tailSet(fromElement)返回set子集,由大于等于fromElement元素组成
TreeSet是根据元素值来进行排序而不是根据插入顺序
TreeSet采用红黑树的数据结构对元素排序 :支持自然排序(默认)和定制排序
自然排序:
TreeSet会调用集合元素的compareTo方法来比较元素之间的大小关系,
然后将集合元素按升序排列。
Java提供了一个Comparable接口,该接口定义了一个compareTo(Object obj)方法
该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象
可以比较大小。obj1compareTo(obj2),如果方法返回0,表明两个对象相等。如果
返回正整数,表明obj1大于obj2;如果返回负整数,表明obj1小于obj2
如果要将对象添加如TreeSet该对象必须实现Comparable接口
当想TreeSet中添加对象时,会先将要添加的对象与TreeSet中的对象用compareTo比较
如果找不到compareTo则引发ClassCastException异常
因为只有同一个类型才能比较大小 所以TreeSet中添加的应该是同一个类型的对象
TreeSet和HashSet集合中的对象如果是可变对象,对象属性改变时,会导致集合处理
对象复杂化,易出错。所以应该尽量在集合中添加不可变对象
不可变对象是
1属性为private final
2含有带参数构造器,为对象初始化
3属性有get方法没有set方法
定制排序:
TreeSet的自然排序是根据集合元素大小,TreeSet将它们以升序排列。使用定制
排序,如降序,使用Comparator接口的帮助。接口中包含一个int compare(T o1,T o2)
用于比较o1和o2的大小:重写该方法可以改变排序规则
List<String> list = new ArrayList<String>();
List<String> new_list = new ArrayList<String>();
for (int i = 0 ; i < 1200000;i++)
{
listadd(i+"");
}
long time1 = SystemcurrentTimeMillis();
Collectionsshuffle(list);
new_list = listsubList(0,1000);//方法1耗时65~130
new_list = createRandomList(list,1000);//方法2耗时2~5
long time2 = SystemcurrentTimeMillis();
Systemoutprintln(time2 - time1);
private static List createRandomList(List list, int n)
{
Map map = new HashMap();
List listNew = new ArrayList();
if (listsize() <= n)
{
return list;
}
else
{
while (mapsize() < n)
{
int random = (int) (Mathrandom() listsize());
if (!mapcontainsKey(random))
{
mapput(random, "");
listNewadd(listget(random));
}
}
return listNew;
}
}
这个方法测试
HashSet插入元素的顺序和元素输出的或者说是元素在HashSet中的位置不一致。
HashSet可以插入null值
保存存储在HashSet中的元素都是唯一的。
那么HashSet是如何保证集合中的元素是不重复的呢。
当有对象插入HashSet中的时候,首先需要判断该对象的HashCode的值在HashSet中是否有相同的,如果没有,那么就插入,如果有相同的HashCode值的对象,这时会调用对象的equals方法来检查对象是否真的相同,如果真的相同,那么就不能插入。
HashSet加入的源码
mapput(e,PRESENT)==null它又是HashMap的源码
putval源码为
从上述源码可以看出,当将一个键值放入HashMap中时,首先根据key的hashCode()返回值决定该Entry的存储位置,如果有两个key的hash值相同,那么就让这两个key进行equals比较,如果两者相等,那么就不允许插入。
用循环或者迭代器
创建set的iterator
Set<Object> set = new HashSet<Object>();
Iterator<Object> it = setiterator();
while(ithasNext())//判断是否有下一个
itnext()取出元素
======================================
import javautilHashSet;
import javautilIterator;
import javautilSet;
class ADD{
public String a;
public static void main(String[] args) {
ADD a = new ADD();
aa = "a";
ADD b = new ADD();
ba = "b";
Set<ADD> set = new HashSet<ADD>();
setadd(a);
setadd(b);
Iterator<ADD> it = setiterator();
while(ithasNext()){
Systemoutprintln(((ADD)itnext())a);
}
}
}
往集合类set里添加数据:
1、定义一个set对象
Set h=new HashSet();
2、往set中添加数据
hadd("1st");//往里添加一个字符串
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。
Set接口主要实现了两个实现类:
HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。
TreeSet: TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。
以上就是关于C#取list集合里的值全部的内容,包括:C#取list集合里的值、java怎么修改Set里的值、java 从几十万条数据的list集合中随机取出1000个元素重新生成集合等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)