首页 > 代码库 > 黑马程序员——集合基础知识(Collection)
黑马程序员——集合基础知识(Collection)
集合基础知识 |
数组:长度固定,可存基本数据和对象。
集合:只能放对象,不固定。容器也有共性,不断抽取成一个体系,集合框架。参阅顶层创建底层。顶层是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
Set无序:(set其实就是collection,它里面没有特性方法的,重点就是排序控制内容)
TreeSet:可以对set集合的元素进行排序。默认按照字符的hash值排序
自定义TreeSet:
学生有自己的姓名和年龄,按照年龄结构排序
Comparable 实现他对对象整体的排序,自然排序,必须让你的元素具备了可比较性才能排序。就只有一个方法compareto,该接口强制使学生具备比较性。覆盖的方法不能声明异常,抛出runtime或者trycatch。假如只比较年龄不科学,同龄人只能存一个,咋俩都19岁,一个08一个09也要排序啊,主要条件相同时比较次要条件排序。String类自身实现了Comparet,他按字典排序的作用就在这里。重复元素进不来。之前是return0,现在return次级元素的比较值。
TreeSet的数据结构:新进来元素都和第一个元素比较,二叉树结构。可以减少比较次数。很吊的,元素多的时候 ,二叉树会自动折中,保证元素唯一性的依据:compareto方法return0
比较的无非就是两个东西(字符串和数值)字符串很好比较,数值封装起来也行~comparable是个接口嘛,里面是compareto,object里面没有compareto的方法哟,这个是在实现comparable的类中的方法,是不是特别麻烦?
集合工具类
Collections里面提供了一些共性方法来操作集合,注意里面没有改变集合元素的方法,比如没有增加元素,删除元素的方法,改也是全部替换的方式。
Collections—sort
sort语句对list类型进行排序
sort<T extends comparable<?super T>>对象比较不是comparto就是compara
Collection—max
返回排序的最大值
Collections—binarySearch
二分法搜索的是有序序列。如果存在返回索引值,如果不存在,返回-插入点-1!
Collections—fill 集合工具类替换
全都替换成某个元素
Collections.reverse;反转原理就是交换位置,。
Collection.reverseorder();返回一个将比较器强行逆转指定的比较器
synchronized 把不安全集合加锁,底层实现原理。哥们把list的所有操作加了锁,并且加了同一把锁。
collections—shuffle把集合中的元素随机排序。调用这个方法就是洗牌。
数组的排序啥的不用自己写~
tostring[1,2,3]
Array.asList把数组变成List,把数组变成List集合的好处,可以使用集合的思想和方法来操作数组中的元素。数组的功能比较少。注意当数组变成集合,不可以使用集合的增删方法,因为数组的长度固定,会发生不支持操作异常。
如果数组中的元素都是对象,(数组完全可以装对象的)那么变成集合时,数组中的元素直接转成集合中的元素
如果数组中的元素都是基本数据类型,那么会将该数组作为集合众的元素存在。也就是说如果你是int[]存到集合中的永远都那个地址值.
集合变数组:
toarray。传入一个指定的集合类型,转成该类型的数组形式
1.当指定类型的数组到底要定义多长呢?
当指定的数组长度小于了集合的size没把没改方法内部会创建新的数组,长度为集合的size/
其实为什么要将集合变数组?
为了限定元素的操作,数组不能增删!就这么多~往回返给用户的数组的形式。
foreach()
for(class 对象或者int x :集合或者数组)集合中该元素遍历,取出对象或者x
给你个好理解的例子(float x:f)把每一个f赋给x,下面语句需要使用的时候就不是使用f,是使用x~
这个s第一次指向了集合的第一个元素,然后一直往后走 。只能取出不能修改集合的元素。其实拷贝一个副本出来,你对s操作什么都没用。迭代器至少还有个remove,迭代器list操作比较多。
传统for和什么区别呢?
高级for有一个局限性,必须有遍历目标。比如把helloword打印100次,增强就不能够用,数组还是建议传统for,可以加脚标!
遍历map集合:
for(Mapentry<integer strting> me:hm.entryset)
{
syso(me.getkey()+"-----"+me.getvalue())
}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。