一:区别概述 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;所以删除一次后,expectedModCount<modCount,不会通过校验,失败。
List和Set都是接口。他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。
**的不同就是List是可以重复的。
而Set是不能重复的。List适合经常追加数据,插入,删除数据。但随即取数效率比较低。Set适合经常地随即储存,插入,删除。
但是在遍历时效率比较低。
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时,结果会按元素插入的次序显示。
**是无序的、不重复的数据**,它本身是可以变的,但里面的元素是不可变类型。
列表是Python中非常重要的数据类型,通常作为函数的返回类型。
列表和元组相似,也是由一组元素组成,列表可以实现添加,删除和查找操作,元素值可以被修改。
**和列表区别
简单的来讲,**和列表**的区别就是**无序、不可重复;而列表有序、可以重复。
**具有以下特点:
1、无序
2、可以用set()函数或者方括号{}创建,元素之间用逗号“,”分割;
3、不可索引,不可切片;
4、不可以有重复元素。
列表具有以下特点:
1、有序;
2、可以用list()函数或者方括号【】创建,元素之间用逗号“,”分割;
3、使用索引来访问元素,可以切片;
4、可以有重复元素。
set