JAVA集合试题库

  • 格式:doc
  • 大小:455.00 KB
  • 文档页数:26

集合一、第一模块:知识点讲解图解集合1、集合的由来:我们学的语言是面向对象的语言,为了方便对多个对象进行操作,我们就必须把对象存储。

而要存储多个对象,就不能是一个基本变量,而应该是一个容器类型的变量。

这样就引入了集合。

*以前接触过得容器:数组、StringBuffer 等由于StringBuffer 的结果是一串字符,不一定能满足我们的要求,所以我们只能选择数组,这就是对象数组。

而对象数组不能适应变化的需求,因为数组的长度是固定。

2、数组和集合的区别① 长度区别集合的长度可变数组长度不可变② 内容区别集合可以存储不同类型的元素数组存储的是同一种类型的元素③ 元素的数据类型问题数组可以存储基本数据类型也可以存储引用数据类型集合只能存储引用类型Java 提供了不同的集合类,这多个集合的数据结构不同*数据结构:数据的存储方式Java 提供的多种集合类,他们的数据结构不同,但是,他们肯定有共性的内容(存储、获取、判断等)。

通过不断的向上提取,我们就能够得到一个集合的继承体系结构图。

把上面这段话转化为图形的形式: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:falsec1[hello, java, world]c2[a, c, world]boolean isEmpty() 判断是否是空④获取Iterator<E> 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:[world]c2:[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;x<objs.length;x++){System.out.println(objs[x]);}//但是要想得到个字符串的长度,则需要向下转型String s=(String)objs[x];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()的返回值是<E>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、集合的使用步骤①创建集合对象②创建元素对象③把元素添加到集合④遍历集合<1>通过集合对象获取迭代器对象<2>通过迭代器对象的hasNext()方法判断是否还有下一个元素<3>通过迭代器对象的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():java[hello, world, javaee]2、List集合的遍历//创建对象List list=new ArrayList();list.add("hello");list.add("world");list.add("java");//遍历for(int x=0;x<list.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--------------javaworldhello4、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);②原因迭代器是依赖于集合,而集合的改变迭代器不知道③解决方案<1>迭代器遍历,迭代器修改(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]<2>集合遍历,集合修改(size(),get())元素添加在集合的末尾List list=new ArrayList();list.add("hello");list.add("world");list.add("java");for(int i=0;i<list.size();i++){String s=(String)list.get(i);if("world".equals(s)){list.add("javaee");}}System.out.print("list"+list);打印结果:list[hello, world, java, javaee]三、1、ArrayList集合(List的子类)由于ArrayList是list的子类,所以多种方法都是从基类上继承下来的。