大数据培训之旅——Java-5(集合类)

    数组大家都知道很重要,那么来看看另外一个很重要的干货,集合类。这东西的重要性不比数组差,甚至更加重要。想必学过数学的大家也知道集合是什么东西,那就不仔细解释这个了,我们直接来干货。

    在所有的集合类中,他们有着同一个最基本的集合接口,Collection,java中提供的集合类都继承与他的子接口,Collection是接口,所以不能直接实例化对象,同时他还有很多子接口,而且子接口还有很多实现类,我们创建这些实现类的对象就可以了。

    我们先说下List,这东西里面的数据是有序的,所以能够精准的确定每个元素的位置,使用索引来找到每一个数据,就类似于数组,而且list允许有相同的数据存在于一个list中,我们实现list接口常用的方法有ArrayList,LinkedList,Vector。在我们学习list之前需要说一个知识,自动拆包(在需要使用基本数据类型的时候,传入了封装类型,jdk会自动帮你转换为基本数据类型)和自动装包(需要使用封装类型的时候传入了基本数据类型,jdk会自动帮你转换成封装数据类型)

——————————————————————————————————————————————————————

    这个知识点说完之后,我们接着来说说List,看看下面的这个例子是如何使用ArrayList的。

——————————————————————————————————————————————————————

    当然ArrayList在不限制泛型的状态下,什么类型的数据都可以保存,那我们想想如果要取ArrayList里面所有的元素应该怎么获取呢,可以试试循环,这里稍微剧透一下,ArrayList的长度不是length而是其他的,大家可以自己去api文档里看看。既然有添加就应该有删除,那么我们该如何删除ArrayList里面的元素呢?

——————————————————————————————————————————————————————

扫描二维码关注公众号,回复: 2317756 查看本文章

  下面我们来看看泛型约束。

——————————————————————————————————————————————————————

    这里要注意以下,泛型的<>里面只能填写封装类,byte——Byte,short——Short,int——Integer,long——Long,float——Float,double——Double,boolean——Boolean,char——Character,void——Void,这就是八中基本类型以及其对应的封装类。

    不知道大家刚才的遍历输出ArrayList成没成功,不知大家是不是觉得挺麻烦的还得定义新的变量,控制循环的次数,而且还需要用get取出元素,为了不被麻烦,我们介绍一种新的for循环,增强for循环。格式为for(循环变量类型 循环变量名称:被遍历的对象),来看看代码是怎么实现的吧。

——————————————————————————————————————————————————————

    那么问题就来了,如果没有泛型约束,那么我们该怎么定义循环变量类型呢,不要着急,还记得我们之前说的所有类的父类么,没错就是object,我们把类型设为object就可以了。我们来看看泛型更为灵活的使用方法:动态参数列表。

——————————————————————————————————————————————————————

    当然泛型约束也不是随随便便写一个T就对的,他也有自己的规则,比如:K:键,V:值T:类型,E:枚举,?:任意类型

    既然删除都知道了,那么我们来看看如何给ArrayList去重。

——————————————————————————————————————————————————————

    当然去重还有别的方法,比如迭代,这个我们在下面说完迭代再给大家演示。

    我们来介绍下一个list,LinkedList,这东西说白了就是c语言的链表,因为链表需要指针的操作,而指针又容易引起内存的错误,所以java帮我们直接封装成了类,不用我们去操作指针,增强了程序的健壮性。链表是个很奇怪的东西,它类似于铁链,环环相扣,每个连接处存放着数据,比如现在有一个链表集合:5,2,7,8,1,4,如果我们向往中间插入一个3,我们只需要让他知道他的前面的内存地址是什么,后面的内存地址是什么,而不需要整个链表,比如我们把7,8中间的链剪断,之后将3的一端连在7的后面,将另一端连在8的前面,这样3就被插进去了变成了5,2,7,3,8,1,4,删除也是这个样子,我们只需要把3,前后的链剪断,把7,8连在一起就可以了。链表的好处一眼就可以看出来,他删除和添加的效率较高,而遍历的效率较低,我们只能从最前面顺藤摸瓜,一个一个找。那么我们来看看链表的操作吧。

——————————————————————————————————————————————————————

    vector的话简单了解下就好,vector和arraylist最大的不同就是,vector是同步的,而arraylist是非同步的,同步说白了就是独占,同步的代码只有当执行者执行完之后,其他人才可以访问,而异步可以随时打断,当然这东西在后面线程的时候回详细说明。现在来说说set集合,这东西是最简单的集合了,而且集合中的对象是无序(不按照添加顺序)不重复的,他的实现类主要有:Hashset(不按照添加顺序,并且不重复)和Treeset(按一定人为规则排序,并且不重复)

——————————————————————————————————————————————————————

    Hashset的其他方法就不演示了之后的代码用到会进行讲解,或者大家可以看看api,之后我们来看看迭代Iterator,这个通常用来遍历集合中的每一个元素。我们来看个例子,用hashset和iterator给arraylist去重,大概思路就是,以arraylist创建一个hashset,然后在使用iterator将hashset的元素遍历重新添加回arraylist。

——————————————————————————————————————————————————————

    在这个例子里我们发现有(String),这是防止arraylist被泛型约束,而it.next返回的值是object,需要使用强制转换转换为泛型约束的类型。我们再来看看直接使用ArrayList和迭代完成的去重。

——————————————————————————————————————————————————————
 

    总结下迭代吧,我们常用的方法有三个hasnext(),next(),remove(),他们需要注意的是hasnext是判断集合中是否有能够迭代的元素存在,next()取出的是集合中的下一个元素,第一次调用的时候取第一个元素,而remove则是删除了next取出的元素。

    我们完成一个小程序:大乐透彩票(35选5加12选2),我们需要选出5个普通球和2两个特殊球,思路是这样的,使用随机数方法在1-35中随机获取5个不重复的数,从1-12中随机获取2个不重复的数,组成中奖号码。当然我们需要注意的是,如果使用ArrayList就有可能出现重复值,使用HashSet就有可能凑不够7个数字,解决方法也很好解决,ArrayList去重之后判断长度,那一部分不够那一部分继续,HashSet同样那一部分不够,那一部分继续。来看看代码。

——————————————————————————————————————————————————————

    HashSet搞定了,我们来看看TreeSet,这东西是一个有顺序的集合,他会把元素按照升序排列,默认是按照字典的顺序。

——————————————————————————————————————————————————————

    我们来看几个集合的小练习:集合1:a,b,c,d,e;集合2:b,c,d,e,f。由这两个集合得到:集合3:a,b,c,d,e,f;集合4:b,c,d,e;集合5:a,f

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    来看看map映射类,这东西后面还会用,它存储的是键值对类型,一个key对应一个value,所以我们插入元素的时候需要以键值对的类型存进去。map的实现类有HashMap和TreeMap,他们和HashSet,TreeSet差不多只不过存储的内容格式不同。来看个例子。

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    我们知道这些之后可以模拟一个简单的登录,当然正常的登录得连接数据库,我们只是模拟。

——————————————————————————————————————————————————————

    这么是不是特别不方便,每次还需要去改代码才能实现登录,总不能真把代码也给别人用吧,不急,我们来看看下一个。

——————————————————————————————————————————————————————

    这些说完了,就得说说栈,队列和链表了,当然在java里面帮我们封装好了,我们只需要去掉用就可以了,不需要像c里面一样自己去创建。

    先说说栈,这东西是一种数据结构,只能在某一端插入和删除的特殊线性表,按照先进后出的规则,先进去的被压入栈底(bottom),后进去的数据在栈顶(top),读的时候先从栈顶读,这就类似于我们摞积木,要想完好的拿出最下面的,就需要从上面一块一块拿下来。栈的栈底是固定的,栈顶是浮动的,当栈内元素个数为0时我们叫做空栈,插入数据叫做入栈(PUSH),删除则叫退栈(POP),因为栈存取数据的特性,我们也管他叫先进后出表。

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

——————————————————————————————————————————————————————

    嗯嗯嗯嗯呃,之前说过迭代,这次说说枚举……这东西和迭代类似,英文叫:Enumeration,同样他也有hasMoreElements()用来判断是否还有元素可以来枚举,nextElements()如果还可以枚举,则返回此枚举的下一个元素,啊和迭代好像啊,不想打代码了,可是为了大家,继续看演示吧。

——————————————————————————————————————————————————————

    栈说完了,来说说队列,这东西就像排队一样,只能从后面插入,只能从前面删除,我们把能插入的叫做队尾(rear),删除的一端叫做队首(front),向队列插入元素叫做进队或者入队,新元素被插入之后就变成了队尾,而从队列中移除元素则叫做离队或者出队,队首的元素离队之后,下一个元素则变成了新的队首,我们还管队列叫做先进先出表。同样队列(Queue)是一个接口,我们需要通过他的子类来实现。很多人不知道如何去找子类这个在api里面可以找到的。

——————————————————————————————————————————————————————

    链表……这货在c语言还有点说头,在java里就是由LinkedList实现的,这个之前就介绍过了,这里再把每个链的结点说下,每个结点都由两部分即存储的数据和指针构成,这个指针会指向下一个数据的内存地址,一个连着一个,这样就连接到一起了,当然java中没有指针这东西,这样少了些关于指针的有趣操作,但是也提高了程序的安全性,不然指针一下指错了内存地址,指到了给系统分配的内存空间,然后我们写入数据覆盖了原来的东西,瞬间电脑就蓝屏了。

——————————————————————————————————————————————————————

    当然链表和其他的集合类一样还有很多方法,比如clear删除链表所有节点使链表变为空链表,remove删除指定下标的结点,removeFirst删除第一个结点,当然还有removeLast删除最后一个节点,get获取指定下标处的结点内的元素,getFirst和getLast,分别为获取第一个和最后一个节点内的元素,indexOf返回链表中某个数据第一次出现的位置,如果没有返回-1,set替换结点内的元素,size返回链表长度,contains判断是否含有指定元素。

    对于集合类来说有很多方法都是相通的,因为他们实现了很多个接口,而这些接口又有很多是同一个,所以我们要学会举一反三,而且还要学会查询api,集合类说完之后会在下一章要先说下mysql数据库,为我们的jdbc做铺垫。

猜你喜欢

转载自blog.csdn.net/g982508295a/article/details/81153601
今日推荐