JAVA集合试题库_第1页
JAVA集合试题库_第2页
JAVA集合试题库_第3页
JAVA集合试题库_第4页
JAVA集合试题库_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档集合一、第一模块:知识点讲解图解集合Iterator Collection MapListIterator List Set HashMap TreeMap LinkedHashMap ArrayList LinkList HashSet TreeSet CollectionsArrays LinkedHashSet Comparable comparator1、集合的由来:我们学的语言是面向对象的语言,为了方便对多个对象进行操作,我们就必须把对象存储。而要存储多个对象,就不能是一个基本变量,而应该是一个容器类型的变量。这样就引入了集合。*以前接触过得容器:数组、StringBuffer等由于StringBuffer的结果是一串字符,不一定能满足我们的要求,所以我们只能选择数组,这就是对象数组。而对象数组不能适应变化的需求,因为数组的长度是固定。2、数组和集合的区别 长度区别 集合的长度可变 数组长度不可变 内容区别 集合可以存储不同类型的元素 数组存储的是同一种类型的元素 元素的数据类型问题 数组可以存储基本数据类型也可以存储引用数据类型集合只能存储引用类型 针对不同的需求,Java提供了不同的集合类,这多个集合的数据结构不同 *数据结构:数据的存储方式Java提供的多种集合类,他们的数据结构不同,但是,他们肯定有共性的内容(存储、获取、判断等)。通过不断的向上提取,我们就能够得到一个集合的继承体系结构图。把上面这段话转化为图形的形式: collection List SetArrayList Vector LinkedList HashSet TreeSet 通过这个图可以清楚的理解集合现在我们从最低层开始学习 一、Collection(接口 Java.util ) 1、功能:添加 boolean add(Object obj) 添加一个元素 boolean addAll(Collection c)添加一个集合的元素 :删除 void clear() 移除所有元素 boolean remove(Object obj) 移除一个元素 boolean removeAll(Collection c)移除一个集合的元素:判断 boolean cotains(Object o)判断集合中是否包含指定元素 boolean containsAll(Collection c)判断集合中是否包含指定集合Collection c1=new ArrayList();c1.add(hello);c1.add(java);c1.add(world);Collection c2=new ArrayList();c2.add(a);c2.add(c);c2.add(world);System.out.println(containsAll:+c1.containsAll(c2);System.out.println(c1);System.out.println(c2); 打印结果:containsAll:falsec1hello, java, worldc2a, c, world boolean isEmpty() 判断是否是空获取 Iterator iterator()长度 int size()交集功能(了解) boolean retainAll(Collection c)交集 两个集合中都有的元素,返回值的意思? 假设有两个集合A,B。A对B做交集,最终存在A中,B不变,返回值表示的是A是否发生过改变。 Collection c1=new ArrayList(); c1.add(hello); c1.add(java); c1.add(world); Collection c2=new ArrayList(); c2.add(a); c2.add(c); c2.add(world); System.out.println(retainAll:+c1.retainAll(c2); System.out.println(c1:+c1); System.out.println(c2:+c2); 打印结果: retainAll:truec1:worldc2:a, c, world 把集合转成数组 Object toArray()注意:*通过测试得出的一些结论 removeAll():只要有一个被移除就叫移除 containsAll():只有包含所有的元素才叫包含 retainsAll():谁调用谁变,没有交集元素,那个集合就变为空。返回值的含义就是有集合变了就返回true,否则返回false。2、创建Collection对象 Collection c=new ArrayList();/因为Collection是接口,并且它没有直接实现类,而ArrayList是其子接口,通过测试,可以看出它重写了toString()方法,直接输出打印的是,ArrayList集合里面的元素可以重复 3、集合的遍历把集合转成数组,可以实现集合的遍历/创建对象 Collection c=new ArrayList(); c.add(“hello”); c.add(“world”); c.add(“java”);/遍历(toArray() Object objs=c.toArray(); for( int x=0;xobjs.length;x+) System.out.println(objsx);/但是要想得到个字符串的长度,则需要向下转型String s=(String)objsx;System.out.println(s.length(); Iterator迭代器 /创建对象 Collection c=new ArrayList(); c.add(“hello”); c.add(“world”); c.add(“java”); /遍历 Iterator it=c.iterator(); while(it.hasNext() String s=(String)it.next();/next()的返回值是 System.out.println(s);另一种方式改进,for循环改进for(Iterator it=c.iterator();it.hasNext();) String s=(String)it.next(); System.Out.println(s); 4、迭代器 是遍历集合的一种方式。迭代器依赖于集合而存在。 迭代器的方法 next(),hasNext() 5、集合的使用步骤 创建集合对象 创建元素对象 把元素添加到集合 遍历集合 通过集合对象获取迭代器对象 通过迭代器对象的hasNext()方法判断是否还有下一个元素 通过迭代器对象的next()方法获取元素,并移动到下一个位置 *迭代器为什么不定义成一个类,而是一个接口假设迭代器是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现集合的遍历。但是Java中提供了很多的集合类,这些集合类的数据结构是不同的,所以,存储方式和遍历方式不同,最终,就没有定义迭代器类而无论是哪种集合,你都应该具备获取元素的操作,并且,最好具有判断功能,这样,在获取前,先判断就不容易出错,也就是说,判断功能和获取功能是一个集合所具备的,而每种集合的方式又不太一样,所以我们把这两个功能给取出来并不提供具体实现类,这种方式就是接口。那么真正的具体实现类在哪呢?在真正的具体的子类中,以内部类的方式体现。 二、List集合(Collection的子类) 1、List集合的特有功能 添加功能 void add(int index,Object elment);在指定位置添加元素/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java); list.add(4,javaee);System.out.print(list:+list);报错:IndexOutOfBoundsException/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java); list.add(3,javaee);System.out.print(list:+list);打印结果: list:hello, world, java, javaee 获取功能 Object get(int index);获取指定位置的元素/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java); System.out.print(list:+list.get(3); 报错:IndexOutOfBoundsException/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java); System.out.print(get():+list.get(2); 打印结果: get():java 列表迭代器 ListIterator listIterator();List集合中特有的迭代器 删除功能Object remove(int index);根据索引删除元素/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java);System.out.print(remove():+list.get(2);打印结果: remove():java 修改功能Object set(int index,Object element);根据索引修改元素,返回被修复的元素/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java); System.out.println(set():+list.set(2,javaee);System.out.print(list);打印结果:set():javahello, world, javaee 2、List集合的遍历/创建对象List list=new ArrayList();list.add(hello);list.add(world); list.add(java); /遍历for(int x=0;xlist.size();x+) String s=(String)list.get(x);System.out.println(s); 3、listIterator()的使用(只能创建list对象,一般不用) List list=new ArrayList(); list.add(hello); list.add(world); list.add(java); ListIterator lit=list.listIterator(); while(lit.hasNext() String s=(String)lit.next(); System.out.println(s); /可以从后面开始打印,逆向遍历 System.out.println(-); while(lit.hasPrevious() String s=(String)lit.previous(); System.out.println(s); /这段代码只有在正向遍历之后才有效,所以一般无意义,不使用 打印结果: helloworldjava-javaworldhello 4、List的子类特点ArrayList:底层数据结构是数组,查询快,增删慢 线程不安全,效率高Vector:底层数据结构是数组,查询快,增删慢 线程安全,效率低LinkedList:底层数据结构是链表,查询慢,增删快 线程不安全,效率高 5、并发修改的异常(ConcurrentModificationException) 出现的现象 迭代器遍历集合,集合修改集合 代码演示: List list=new ArrayList(); list.add(hello); list.add(world); list.add(java); Iterator it=list.iterator(); while(it.hasNext() String s=(String)it.next(); if(world.equals(s) list.add(javaee); System.out.println(list:+list); 原因 迭代器是依赖于集合,而集合的改变迭代器不知道 解决方案 迭代器遍历,迭代器修改(ListIterator) 元素添加在刚才迭代的位置 List list=new ArrayList(); list.add(hello); list.add(world); list.add(java); ListIterator lit=list.listIterator(); while(lit.hasNext() String s=(String)lit.next(); if(world).equals(s) lit.add(javaee); System.out.print(list:+list); 打印结果: list:hello, world, javaee, java 集合遍历,集合修改(size(),get() 元素添加在集合的末尾 List list=new ArrayList(); list.add(hello); list.add(world); list.add(java); for(int i=0;ilist.size();i+) String s=(String)list.get(i); if(world.equals(s) list.add(javaee); System.out.print(list+list); 打印结果: listhello, world, java, javaee 三、1、ArrayList集合(List的子类) 由于ArrayList是list的子类,所以多种方法都是从基类上继承下来的。 下面看ArrayList是如何遍历的 /创建对象 ArrayList array=new ArrayList(); /创建元素对象,并添加元素 array.add(hello); array.add(world); array.add(java); /第一种遍历 Iterator it=array.iterator(); while(it.hasNext() String s=(String)it.next(); System.out.println(s); /第二种遍历 for(int x=0;xarray.size();x+) String s=(String)array.get(x); System.out.println(s); *例题: ArrayList去除集合中字符串的重复值(字符串的内容相同)分析: * A:创建集合对象 * B:添加多个字符串元素(包含内容相同的) * C:创建新集合 * D:遍历旧集合,获取得到每一个元素 * E:拿这个元素到新集合去找,看有没有 * 有:不搭理它 * 没有:就添加到新集合 * F:遍历新集合public class ArrayListDemo public static void main(String args) ArrayList array = new ArrayList(); / 添加多个字符串元素(包含内容相同的)array.add(hello);array.add(world);array.add(java);array.add(world);array.add(java);array.add(world);array.add(world);array.add(world);array.add(world);array.add(java);array.add(world); / 创建新集合ArrayList newArray = new ArrayList(); / 遍历旧集合,获取得到每一个元素Iterator it = array.iterator();while (it.hasNext() String s = (String) it.next(); / 拿这个元素到新集合去找,看有没有if (!newArray.contains(s) newArray.add(s); / 遍历新集合for (int x = 0; x 2 ? new Cow() : null; / 填空 /方法:作用:此方法带一个参数n,是用来传递年数的。 public static void showTotalCowNum(int n)/显示13年后全部牛的数量 /这个地方用到了List集合,但由于List是接口,所以找到了它的直接实现类ArrayList /创建一个集合对象,这个集合的类型为Cow List list = new ArrayList(); /创建了一个牛,把它加到了集合中 list.add(new Cow(); /n为年数 for (int i = 0; i n; i+) int cowCount = list.size();/集合的长度即牛的个数 for (int j = 0; j cowCount; j+) Cow cow = list.get(j).afterYear();/三年后,母牛就会每年生一只小牛,/如果cow对象不为空时 if (cow != null) cow.afterYear(); /这个对象调用afterYear填空 list.add(cow); System.out.println(n + year after,sum: + list.size(); public class Main public static void main(String args) Cow.showTotalCowNum(13); 四、Vector集合(List的子类) 1、Vector的特有功能: A、添加功能 public void addElement(Object obj); B、获取功能 public Object elementAt(int index); public Enumeration elements(); boolean hasMoreElements(); Object nextElement(); 遍历: /创建对象 Vector v=new Vector(); v.addElement(hello); v.addElement(world); v.addElement(java); for(int x=0;xv.size();x+) String s=(String )v.elementAt(x); System.out.println(s); /使用elements()方法 /由于这个方法的返回值是Enumeration Enumeration en=v.elements(); while(en.hasMoreElements() String s=(String)en.nextElement(); System.out.println(s); 打印结果: helloworldjavahelloworldjava五、LinkedList集合 Linkedlist的特有功能: 1、添加功能 public void addFirst(Object e); public void addLast(Object e); 2、获取功能 public void getFirst() public void getLast(); 3、删除功能 public Object removeFirst(); public Object removeLast();六、Set集合(Set是一个接口)*这个集合的方法和Collection集合中的方法一样1、特点:不包含重复元素,存储顺序和取出顺序不一致。(唯一 无序) HashSet:它不保证set的迭代顺序一致,特别不保证该顺序恒久不变。 注意:虽然Set集合的元素无序,但是,作为集合来说,它肯定有它自己的存储顺序,而你的顺序恰好和它的存储顺序一致,这并不代表有序,你可以多存储一些数据看到效果。 /创建对象 Set set=new HashSet();七、HashSet集合/ 存储字符串并遍历/创建对象HashSet hs = new HashSet();/创建元素并添加元素 hs.add(hello); hs.add(world); hs.add(java); hs.add(world);/遍历元素for(String s:hs)System.out.println(s);打印出的结果:helloworldjava/为什么那个相同的字符串没有出现,只出现了一次呢?通过查看HashSet的add方法的源码,我们知道这个方法的底层依赖于两个方法:hashCode()和equals如果这个类没有重写这两个方法,默认使用的是Object,一般来说不会相同而String类重写了hashCode()和equals()方法,所以它就可以把内容相同的字符串去掉,只留下一个八、LinkedList底层数据有哈希表和链表组成,哈希表保证元素的唯一性,链表保证元素有序(添加和查询的顺序一样)九、TreeSet集合Treeset能够对元素按照某种规则进行排序排序方式有两种:自然排序 比较器排序二、Map集合 Map hashMap(Hashtable) TreeMap LinkedHashMap 一、Map 集合 1、概念Map集合是由键和值两部分组成 2、特点:将键映射到值的对象,一个映射不能包含重复键,每个键最多能映射到一个值。 3、Map和Collection 都是顶层接口 区别:Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的 Collection集合存储元素是单独出现的,Collection的儿子set的元素是唯一的,List是可重复的。 *注意:Map集合的数据结构只针对键有效,跟值无关 Collection集合的数据结构是针对元素有效4、Map集合的功能 、添加功能:V put(K key ,V value);如果键是第一次存储,就直接存储元素,返回null,如果键不是第一次存在,那么就用值把以前的值替换掉,返回以前的值Map map=new HashMap(); /添加元素System.out.println(map:+map.put(文章, 马伊琍);System.out.println(map:+map); /打印的结果map:nullmap:文章=马伊琍Map map=new HashMap(); /添加元素map.put(文章, 马伊琍);System.out.println(map:+map.put(文章, 姚笛);System.out.println(map:+map);打印的结果:map:马伊琍map:文章=姚笛删除功能Void clear() 移除所有的键值元素Map map=new HashMap(); /添加元素map.put(邓超,孙俪); map.put(黄晓明,杨颖);map.put(周杰伦,昆凌);map.put(刘恺威,杨幂); map.clear();System.out.println(clear():+map);v remove(Object key) 根据键删除键值对元素并把值返回System.out.println(remove():+map.remove(邓超);打印结果:remove:孙俪判断功能(不影响集合) boolean containskey(Object key)判断集合是否包含指定键System.out.println(containsKey:+map.containsKey(黄晓明); System.out.println(containsKey:+map.containsKey(黄晓波);打印结果:containsKey:truecontainsKey:falseboolean containsValue(Object value)判断集合是否包含指定值boolean isEmpty();判断集合是否为空System.out.println(isEmpty():+map.isEmpty();获取功能setMap.Entry entrySet() 返回的是键值对对象V get(Object key)根据键返回值System.out.println(get():+map.get(周杰伦); System.out.println(get():+map.get(周杰);打印结果:get():昆凌get():nullSet keySet(); 获取集合中所有键的集合Set set=map.keySet(); for(String key:set) System.out.println(key); 打印结果:周杰伦刘恺威邓超黄晓明Collection value(); 获取集合中所有的值的集合Collection con=map.values(); for(String values:con) System.out.println(values); 长度功能int size();5、现在创建一个Map集合Map map=new HashMap(); /添加元素map.put(邓超,孙俪); map.put(黄晓明,杨颖);map.put(周杰伦,昆凌);map.put(刘恺威,杨幂);/根据键获取值 V get(Object key);System.out.println(get:+map.get(周杰伦);/昆凌 /获取所有的值Collection con=map.values();for(String value:con)System.out.println(value);6、map集合的遍历Map集合相当于夫妻对它的遍历方式有两种,第一种:(掌握)思路:A:获取所有的键B:遍历键的集合,获取得到每一个键C:根据键去找值/获取所有的键Set set=map.keySet();/遍历键的集合,获取得到每一个键for(String key:set)/根据键去找值 String value=map.get(key); System.out.println(key+-+value); 打印的结果: 周杰伦-昆凌刘恺威-杨幂邓超-孙俪黄晓明-杨颖第二种遍历方式(理解) /获取所有键值对对象的集合 SetMap.Entry set=map.entrySet();/返回的是子类对象 for(Map.Entry me:set) /根据键值对对象获取键和值 String key=me.getKey(); String value=me.getValue(); System.out.println(key+-+value); 二、HashMap集合 例子:HashMap 键:Student 要求:如果两个对象的成员变量值相同则为同一个对象 值:string /创建集合对象HashMap hm=new HashMap();/创建学生对象Student s1=new Student(jjj,27);Student s2=new Student(ddd,14);Student s3=new Student(eee,22);hm

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论