百科游戏 手游攻略
今天给各位分享List和Set有什么区别的知识,其中也会对list和set集合有什么区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
set集合和list集合的区别
set集合中的数据没有顺序,且如果add两个一样的对象或基本类型的数据,set集合里也是只有一个,即set集合中的数据都是独一无二的;不能使用加强的for循环;list中的数据是有顺序的,可以加入多个一样的对象和基本类型的数据,可使用加强的for循环;
说明list和set的区别
List和Set都是接口。他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。
最大的不同就是List是可以重复的。而Set是不能重复的。
List适合经常追加数据,插入,删除数据。但随即取数效率比较低。
Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。
java中 List 与Set 有什么区别
Java的集合类都位于java.util包中,Java集合中存放的是对象的引用,而非对象本身。
Java集合主要分为三种类型:
a.Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。
b.List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。
c.Map(映射):集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,值对象可以重复。它的有些实现类能对集合中的键对象进行排序。
Set、List和Map统称为Java集合。
1.Set(集)
Set集合中的对象不按特定方式排序,并且没有重复对象。Set接口主要有两个实现类HashSet和TreeSet。HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。HashSet类还有一个子类LinkedHashSet类,它不仅实现了哈希算法,而且实现了链表数据结构。TreeSet类实现了SortedSet接口,具有排序功能。
Set的add()方法判断对象是否已经存在于集合中的判断流程:
booleanisExists=false;
Iteratorit=set.iterator();
while(it.hasNext()){
Objectobject=it.next();
if(newObject.equals(oldObject)){
isExists=true;
break;
}
}
2.HashSet类
当HashSet向集合中加入一个对象时,会调用对象的hashCode()方法获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。
当Object1变量和object2变量实际上引用了同一个对象,那么object1和object2的哈希码肯定相同。
为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为相等时,它们的哈希码也相等。即:
customer1.hashCode()==customer2.hashCode();
如:对应于Customer类的以下重写后的equals()方法:
publicbooleanequals(Objecto){
if(this==o)returntrue;
if(!oinstanceofCustomer)returnfalse;
finalCustomerother=(Customer)o;
if(this.name.equals(other.getName())&&this.age==other.getAge())
returntrue;
else
returnfalse;
}
为了保证HashSet正常工作,如果Customer类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Customer对象的哈希码也一样。
publicinthashCode(){
intresult;
result=(name==null?0:name.hashCode());
result=29*result+(age==null?0:age.hashCode());
returnresult;
}
3.TreeSet类
TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。TreeSet支持两种排序方式:自然排序和客户化排序,在默认情况下TreeSet采用自然排序方式。
a.自然排序
在JDK中,有一部分类实现了Comparable接口,如Integer、Double和String等。Comparable接口有一个compareTo(Objecto)方法,它返回整数类型。对于表达式x.compareTo(y),如果返回值为0,表示x和y相等,如果返回值大于0,表示x大于y,如果返回值小于0,表示x小于y。
TreeSet调用对象的compareTo()方法比较集合中对象的大小,然后进行升序排列,这种排序方式称为自然排序。
以下列出了JDK中实现了Comparable接口的一些类的排序方式
类排序
BigDecimal\BigInteger\Byte\Double\Float\Integer\Long\Short按数字大小排序
Character按字符的Unicode值的数字大小排序
String按字符串中字符的Unicode值排序
使用自然排序时,只能向TreeSet集合中加入同类型的对象,并且这些对象的类必须实现了Comparable接口,否则会在第二次调用TreeSet的add()方法时,会抛出ClassCastException异常。
例如:
以下是Customer类的compareTo()方法的一种实现方式:
publicintcompareTo(Objecto){
Customerother=(Customer)o;
//先按照name属性排序
if(this.name.compareTo(other.getName())>0)return1;
if(this.name.compareTo(other.getName())<0)return-1;
//再按照age属性排序
if(this.age>other.getAge())return1;
if(this.age return0; } 为了保证TreeSet能正确地排序,要求Customer类的compareTo()方法与equals()方法按相同的规则比较两个Customer对象是否相等。 因此在Customer类的equals()方法中应该采用相同的比较规则: publicbooleanequals(Objecto){ if(this==o)returntrue; if(!(oinstanceofCustomer))returnfalse; finalCustomerother=(Customer)o; if(this.name.equals(other.getName())&&this.age==other.getAge()){ returntrue; }else{ returnfalse; } } 值得注意的是,对于TreeSet中已经存在的Customer对象,如果修改了它们的属性,TreeSet不会对集合进行重新排序。在实际域模型中,实体类的属性可以被更新,因此不适合通过TreeSet来排序。最适合于排序的是不可变类。 b.客户化排序 除了自然排序,TreeSet还支持客户化排序。java.util.Comparator接口用于指定具体的排序方式,它有个compare(Objectobject1,Objectobject2)方法,用于比较两个对象的大小。当表达式compare(x,y)的值大于0,表示x大于y;当compare(x,y)的值小于0,表示x小于y;当compare(x,y)的值等于0,表示x等于y。 例如:如果希望TreeSet仅按照Customer对象的name属性进行降序排列,可以创建一个实现Comparator接口的类CustomerComparator: publicclassCustomerComparatorimplementsComparator{ publicintcompare(Objecto1,Objecto2){ Customerc1=(Customer)o1; Customerc2=(Customer)o2; if(c1.getName().compareTo(c2.getName())>0)return-1; if(c2.getName().compareTo(c2.getName())<0)return1; return0; } } 接下来在构造TreeSet的实例时,调用它的TreeSet(Comparatorcomparator)构造方法: Setset=newTreeSet(newCustomerComparator()); 4.向Set中加入持久化类的对象 例如两个Session实例从数据库加载相同的Order对象,然后往HashSet集合里存放,在默认情况下,Order类的equals()方法比较两个Orer对象的内存地址是否相同,因此order1.equals(order2)==false,所以order1和order2游离对象都加入到HashSet集合中,但实际上order1和order2对应的是ORDERS表中的同一条记录。对于这一问题,有两种解决方案: (1)在应用程序中,谨慎地把来自于不同Session缓存的游离对象加入到Set集合中,如: Setorders=newHashSet(); orders.add(order1); if(!order2.getOrderNumber().equals(order1.getOrderNumber())) order.add(order2); (2)在Order类中重新实现equals()和hashCode()方法,按照业务主键比较两个Order对象是否相等。 提示:为了保证HashSet正常工作,要求当一个对象加入到HashSet集合中后,它的哈希码不会发生变化。 5.List(列表) List的主要特征是其对象以线性方式存储,集合中允许存放重复对象。List接口主要的实现类有LinkedList和ArrayList。LinkedList采用链表数据结构,而ArrayList代表大小可变的数组。List接口还有一个实现类Vector,它的功能和ArrayList比较相似,两者的区别在于Vector类的实现采用了同步机制,而ArrayList没有使用同步机制。 List只能对集合中的对象按索引位置排序,如果希望对List中的对象按其他特定方式排序,可以借助Comparator和Collections类。Collections类是集合API中的辅助类,它提供了操纵集合的各种静态方法,其中sort()方法用于对List中的对象进行排序: a.sort(Listlist):对List中的对象进行自然排序。 b.sort(Listlist,Comparatorcomparator):对List中的对象进行客户化排序,comparator参数指定排序方式。 如Collections.sort(list); 6.Map(映射) Map(映射)是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象,而值对象仍可以是Map类型,依次类推,这样就形成了多级映射。 Map有两种比较常用的实现:HashMap和TreeMap。HashMap按照哈希算法来存取键对象,有很好的存取性能,为了保证HashMap能正常工作,和HashSet一样,要求当两个键对象通过equals()方法比较为true时,这两个对象的hashCode()方法返回的哈希码也一样。 TreeMap实现了SortedMap接口,能对键对象进行排序。和TreeSet一样,TreeMap也支持自然排序和客户化排序两种方式。 例:创建一个缓存类EntityCache,它能粗略地模仿Session的缓存功能,保证缓存中不会出现两个OID相同的Customer对象或两个OID相同的Order对象,这种惟一性是由键对象的惟一性来保证的。 Key.java: packagemypack; publicclassKey{ privateClassclassType; privateLongid; publicKey(ClassclassType,Longid){ this.classType=classType; this.id=id; } publicClassgetClassType(){ returnthis.classType; } publicLonggetId(){ returnthis.id; } publicbooleanequals(Objecto){ if(this==o)returntrue; if(!(oinstanceofKey))returnfalse; finalKeyother=(Key)o; if(classType.equals(other.getClassType())&&id.equals(other.getId())) returntrue; returnfalse; } publicinthashCode(){ intresult; result=classType.hashCode(); result=29*result+id.hashCode(); returnresult; } } EntityCache.java: packagemypack; importjava.util.*; publicclassEntityCache{ privateMapentitiesByKey; publicEntityCache(){ entitiesByKey=newHashMap(); } publicvoidput(BusinessObjectentity){ Keykey=newKey(entity.getClass(),entity.getId()); entitiesByKey.put(key,entity); } publicObjectget(ClassclassType,Longid){ Keykey=newKey(classType,id); returnentitiesByKey.get(key); } publicCollectiongetAllEntities(){ returnentitiesByKey.values(); } publicbooleancontains(ClassclassType,Longid){ Keykey=newKey(classType,id); returnentitiesByKey.containsKey(key); } } List和Set有什么区别的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于list和set集合有什么区别、List和Set有什么区别的信息别忘了在本站进行查找哦。
- 最近发表