list和set,list和set继承了哪个接口

http://www.itjxue.com  2023-01-06 02:06  来源:未知  点击次数: 

1、List 和 Set 的区别

一:区别概述

1:List:可重复,有序,数组或者链表存储

2:Set:不可重复,无序,使用ma存储

二:ArrayList

2.1:通过数组的方式进行存储:查询快,增删慢的特点,但是他的效率高

2.2:初始化过程中若知道数组的大约范围,建议制定长度;若不指定长度,默认初始化大小为10;

2.3:关注ArrayList两个属性

????????size 和?elementData,其中size可以理解为数组长度,elementData理解为容量大小;

????????比如,List a =new ArrayList(20);?a.add("1");? ? ? ? ? ? ? ? ? ? ?其中size = 1;elementData的长度为20

????????每次使用add方法时,会触发扩容方法,当容量不够时候,进行扩容:

????????扩容时步骤:

????????????1:将size+1,和现在的elementData长度比较比较

????????????2:若小于现有容量,则不扩容;

????????????3:若大于现有容量,则

????????????? ? ????3 .1:备份原数组;

? ????????????? ? ? 3.2:扩容为原来大小的1.5倍

? ? ????????????? ? 3.2:通过Arrays.copyOf(elementData, newCapacity)方法返回扩容后的数据。

? a:传空参数的情况是全删呀!!!

? b:主要使用了一个方法:fastRemove(int index),每次remove都是进行一次数组拷贝,remove 后size会变化

? ?方式1:Iterator迭代器

方式2:foreach

错误方式:

错误方式分析:

a: ArrayList extents? AbstractList,AbstractList类有一个变量modCount,记录数组的变化次数;

每次对数组进行增删操作时候,都会进行modCount++;

b:Iteratoriterator = a.iterator(); 是实例化一个AbstractList的内部类Itr;实例化时,初始化expectedModCount =modCount;

每次使用next方法时,会调用checkForComodification(),这个方法是比较expectedModCount和modCount;若不相等,就报错。

c:正确案例中,用了内部类Itr的remove方法,这个方法最后会强制expectedModCount=modCount;

d:错误案例中,使用了ArrayList类的remove,只会减小modCount,不会强制expectedModCount=modCount;所以删除一次后,expectedModCountmodCount,不会通过校验,失败。

三:LinkedList (直接抄的博客的)

?????a:是由node节点组成的双向链表,没有初始化容量,不存在扩容概念;

? ? b:node节点的结构如下

c:每当有新数据添加的时候,会将元素添加到链表的最后位置,并将元素的prev 指向前一个元素,前一个元素的next指向需要添加的元素;

参考文章: 从源码浅谈面试List 和 set 的区别

list和set的区别和联系有哪些?

1、作用区别:

set集合中的数据没有顺序,且如果add两个一样的对象或基本类型的数据,set集合里也是只有一个,即set集合中的数据都是独一无二的;不能使用加强的for循环;list中的数据是有顺序的,可以加入多个一样的对象和基本类型的数据,可使用加强的for循环;

2、意义区别:

Set(集):集合中的对象不按特定方式排序,并且没有重复对象。它的有些实现类能对集合中的对象按特定方式排序。

List(列表):集合中的对象按索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象。

List泛型:

通过允许指定泛型类或方法操作的特定类型,泛型功能将类型安全的任务从程序员转移给了编译器。

不需要编写代码来检测数据类型是否正确,因为会在编译时强制使用正确的数据类型。减少了类型强制转换的需要和运行时错误的可能性。泛型提供了类型安全但没有增加多个实现的开销。

java中set和list的区别

set和list都是集合接口

简要说明

set --其中的值不允许重复,无序的数据结构

list --其中的值允许重复,因为其为有序的数据结构

List的功能方法

实际上有两种List:

一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。

List :

次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。

ArrayList :

由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。

LinkedList :

对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(),

addLast(), getFirst(), getLast(), removeFirst() 和removeLast(), 这些方法

(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。

Set的功能方法

Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)

Set :

存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。

TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。

LinkedHashSet :

具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历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()方法判断对象是否已经存在于集合中的判断流程:

boolean isExists = false;

Iterator it = set.iterator();

while(it.hasNext()){

Object object = 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()方法:

public boolean equals(Object o){

if(this==o) return true;

if(!o instanceof Customer) return false;

final Customer other = (Customer)o;

if(this.name.equals(other.getName())this.age==other.getAge())

return true;

else

return false;

}

为了保证HashSet正常工作,如果Customer类覆盖了equals()方法,也应该覆盖hashCode()方法,并且保证两个相等的Customer对象的哈希码也一样。

public int hashCode(){

int result;

result = (name==null?0:name.hashCode());

result = 29*result+(age==null?0:age.hashCode());

return result;

}

3.TreeSet类

TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序。TreeSet支持两种排序方式:自然排序和客户化排序,在默认情况下TreeSet采用自然排序方式。

a.自然排序

在JDK中,有一部分类实现了Comparable接口,如Integer、Double和String等。Comparable接口有一个compareTo(Object o)方法,它返回整数类型。对于表达式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()方法的一种实现方式:

public int compareTo(Object o){

Customer other = (Customer)o;

//先按照name属性排序

if(this.name.compareTo(other.getName())0) return 1;

if(this.name.compareTo(other.getName())0) return -1;

//再按照age属性排序

if(this.ageother.getAge()) return 1;

if(this.ageother.getAge()) return -1;

return 0;

}

为了保证TreeSet能正确地排序,要求Customer类的compareTo()方法与equals()方法按相同的规则比较两个Customer对象是否相等。

因此在Customer类的equals()方法中应该采用相同的比较规则:

public boolean equals(Object o){

if(this==o) return true;

if(!(o instanceof Customer)) return false;

final Customer other = (Customer)o;

if(this.name.equals(other.getName())this.age==other.getAge()){

return true;

}else{

return false;

}

}

值得注意的是,对于TreeSet中已经存在的Customer对象,如果修改了它们的属性,TreeSet不会对集合进行重新排序。在实际域模型中,实体类的属性可以被更新,因此不适合通过TreeSet来排序。最适合于排序的是不可变类。

b.客户化排序

除了自然排序,TreeSet还支持客户化排序。java.util.Comparator接口用于指定具体的排序方式,它有个compare(Object object1,Object object2)方法,用于比较两个对象的大小。当表达式compare(x,y)的值大于0,表示x大于y;当compare(x,y)的值小于0,表示x小于y;当compare(x,y)的值等于0,表示x等于y。

例如:如果希望TreeSet仅按照Customer对象的name属性进行降序排列,可以创建一个实现Comparator接口的类CustomerComparator:

public class CustomerComparator implements Comparator{

public int compare(Object o1,Object o2){

Customer c1= (Customer)o1;

Customer c2 = (Customer)o2;

if(c1.getName().compareTo(c2.getName())0) return -1;

if(c2.getName().compareTo(c2.getName())0) return 1;

return 0;

}

}

接下来在构造TreeSet的实例时,调用它的TreeSet(Comparator comparator)构造方法:

Set set = new TreeSet(new CustomerComparator());

4.向Set中加入持久化类的对象

例如两个Session实例从数据库加载相同的Order对象,然后往HashSet集合里存放,在默认情况下,Order类的equals()方法比较两个Orer对象的内存地址是否相同,因此order1.equals(order2)==false,所以order1和order2游离对象都加入到HashSet集合中,但实际上order1和order2对应的是ORDERS表中的同一条记录。对于这一问题,有两种解决方案:

(1)在应用程序中,谨慎地把来自于不同Session缓存的游离对象加入到Set集合中,如:

Set orders = new HashSet();

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(List list):对List中的对象进行自然排序。

b.sort(List list,Comparator comparator):对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:

package mypack;

public class Key{

private Class classType;

private Long id;

public Key(Class classType,Long id){

this.classType = classType;

this.id = id;

}

public Class getClassType(){

return this.classType;

}

public Long getId(){

return this.id;

}

public boolean equals(Object o){

if(this==o) return true;

if(!(o instanceof Key)) return false;

final Key other = (Key)o;

if(classType.equals(other.getClassType())id.equals(other.getId()))

return true;

return false;

}

public int hashCode(){

int result;

result = classType.hashCode();

result = 29 * result + id.hashCode();

return result;

}

}

EntityCache.java:

package mypack;

import java.util.*;

public class EntityCache {

private Map entitiesByKey;

public EntityCache() {

entitiesByKey=new HashMap();

}

public void put(BusinessObject entity){

Key key=new Key(entity.getClass(),entity.getId());

entitiesByKey.put(key,entity);

}

public Object get(Class classType,Long id){

Key key=new Key(classType,id);

return entitiesByKey.get(key);

}

public Collection getAllEntities(){

return entitiesByKey.values();

}

public boolean contains(Class classType,Long id){

Key key=new Key(classType,id);

return entitiesByKey.containsKey(key);

}

}

说明list和set的区别

List和Set都是接口。他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。

最大的不同就是List是可以重复的。而Set是不能重复的。

List适合经常追加数据,插入,删除数据。但随即取数效率比较低。

Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。

python里面set()和list()区别是什么?

set是集合,list是列表,主要区别:一是根据两个函数调用时所传的参数情况来分析;一是两个函数创建出的对应的数据类型来分析

(责任编辑:IT教学网)

更多

推荐网络媒体文章