数组:长度固定,可存基本数据和对象。集合:只能放对象,不固定。容器也有共性,不断抽取成一个体系,集合框架。参阅顶层创建底层。顶层是collection。collection里有两个常见的接口,List和Set。常见集合有Arraylist,linkedlist,vector,hashSet TreeSet.为什么会出现这么多的容器呢,因为每一个容器对数据的存储方式都有不一样,。这个存储方式称之为数据结构!!因为他们的特点不一样
list因为有脚标存储和删除的效率很低,Set的效率高。
collection
共性方法。
1.集合中存放的都是地址,不可能使对象实例。和数组一样。2.add方法的参数是obj便于接收任意对象。直接打印出对象,用中括号封装起来了。删除元素,remove和clear(只能指定位置的删除,不恩能够改)判断元素。
集合,取交集,retainal1中只会保留和al2相同的元素。removeall,可以移除与2相同的元素
元素的取出:取出并操作元素。迭代器。把元素去出来,不是通过创建。it,next()。whileit,hasnex()迭代器就是集合的取出方式。对于取出不足以用一个方法来描述,数据结构不同,取出的方式肯定也不同,把描述定义成类,在集合内部定义了一个内部类,可以直接访问集合内的元素。不同的数据结构,但是都有共性内容判断和取出,那么可抽取共性,那么这些内部类都符合一个规则,该规则就是Iterator,并向外部提供了方法,iterator夹子就是迭代器
Iterator it=al.iterator;当我在while下面打印两次的时候就脚标越界了。。
List
关键!!特点:元素是有序的,元素可以重复,因为该集合体系有索引
Set:元素是无序的,不可重复。
List集合特有方法:
凡是可以操作脚标的方法都是该体系特有方法:增add(index,element)addall(index,collection)删remove(index)改set(index,element)查get(index);sublist(from,to);listIterator();在指定位置添加元素,相当于插入。但凡操作脚标的都是数组的原理,集合的长度是size。。。list可以遍历。也可以用迭代器
通过indexof获取元素位置。
listiterator列表迭代器:在迭代过程中添加或者删除元素。当迭代器正在操作时, 你又用集合的操作操作元素的时候会产生并发问题,不能对元素同时进行多种操作。所以要么用迭代器,要么只用集合。。。obj还持有引用,可以输出。将引用删除了。迭代器操作很少,只有3个,但是列表迭代器多得多,因为list有脚标。特有的迭代器ListIterator,在迭代时不可以通过集合对象的方法操作集合众的元素。否则会发生异常!!除了判断取出删除外,还可以添加,修改等,因为list可重复。。。 hasNext和hasPrevious返回的是Boolean。。。。集合中都有指针。。。正向遍历,反向遍历
list中的三个常见对象
ArrayList底层使用的数组结构:特点查询,修改速度很快,增删很慢。线程不同步
LinkedList底层使用的是链表结构:特点查询很慢,增删很快
Vector底层是数组数据结构,线程同步,增删改查很慢,被Arraylist取代
ArrayList,默认容量是10,当超过时,就会按50%延长,然后把原来容器元素加进来,把新元素加在后面。
Vector中有个枚举的功能。枚举就是vector特有的取出方式,和迭代器的功能是重复的。枚举的名称以及方法的名称都过长,枚举就郁郁而终了。只有vector支持枚举
LinkedList
特有方法:addfirst()addlast()getfirst()getlast()removefirst(),removelast
get取完不删,remove取完删除,若集合中没有元素,会出现异常!
while(!link.isempty())removefirst,可取出所有元素。移除并返回第一个!offer,peek,和poll是上操作的替代操作,从1.6开始
linkedlist的练习:使用linkelist模拟一个堆栈或者队列数据结构
堆栈:先进后出。队列先进先出。。。杯子和管子。
存储的时候:队列:first取last或者反过来。,同first或者同last堆栈。。。
将他们的方法封装起来,因为他们的名字不好认,最好通过封装成自己项目的名字;
Arraylist练习:1.去除重复元素。再迭代时next一次,has就要判断一次。
2.将自定义对象作为元素存到Arraylist集合中。并去除重复元素。
要做强转,因为对象里有obj不存在的特性方法。他只判断对象是否相同,contains,因为他使用的equals,contains调用 的底层原理就是equals。。。如果你没有重写那么他就会按obj的方法来判断。list集合判断包含的方法调用的equals方法。。。remove底层调用的也是equals!一般情况查询比较多,所以用arraylist很多。。。
Set
特点:元素无序就是存入和取出顺序不一定一致。不包含重复元素
Set的功能和collection的功能一致,重点关注子类对象。最常见的子类是HashSet和TreeSet。
HashSet的底层结构是has表。
存的顺序是按has值大小来存的,按表里的顺序存,就是别人定义的存储规则而不是按存储顺序,,,当has值重复了,还要做一个判断是否是同一个对象add方法返回布尔型。。。存成功为ture,若重复添加失败为假。。。
HashSet是怎么样保证元素的唯一性的呢?他是通过元素的两个方法hashcode()和equals(),如果元素的hashcode()值相同,才会调用equals()。。。提高效率
学会用@arrived那个重写的语句确保你复写的hashcode()和equals();
hashset的判断和删除的依据。
注意:对于判断元素是否存在以及删除等操作,依据的都是hashcode和equals算到hash值不一样就不调用equals。。。
ArrayList只依赖equals,而HashSet必须先判断hashcode!!!
TreeSet