额外收获1冒泡排序口诀:两两相比小靠前外出循环n-1内层循环n-1-i集合框架和泛型1.1集合概述数组存储多个同类型数据的缺陷:(1)数组长度固定不变,不能很好适应元素数量动态变化的情况。(2)可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数。(3)数组采用在内存中分配连续空间的存储方式,根据元素信息查找时效率低,需要多次比较。Java集合框架图Java的集合类主要有Map接口和Collection接口派生而来。类或接口描述Colle可以存储一组不唯一、无序的对象ctionList可以存储一组不唯一、有序的对象ArrayList可以存储一组不唯一同一数据类型、有序的对象。在内存中分配连续的空间,插入、删除等操作频繁时性能低下。LinkedList可以存储一组不唯一、有序的对象。插入、删除元素时效率比较高,但是查找效率很低。Set可以存储一组唯一、无序的对象HashSet可以存储一组唯一、无序的对象。HashSet类是非线程安全的。Iterator专门实现集合的遍历Map存储一组成对的键(key)-值(value)对象HashMap查询指定元素效率高1.2List接口Collection接口是最基本的集合接口,可以存储一组不唯一、无序的对象。List接口继承自Collection接口,是有序集合。List可以存储一组不唯一、有序的对象。List接口重用的实现类有ArrayList和LinkedList。1.2.1使用ArrayList类动态存储数据ArrayList集合类和数组采用相同的存储方式,在内存中分配连续的空间,但是它不同与数组,ArrayList集合中可以添加任何类型的数据,并且添加的数据都将转换成Object类型,而在数组中只能添加同一数据类型的数据。例:ArrayListlist=newArrayList();Studentstu=newStudent();list.add(null);list.add(stu);ArrayList类的常用方法方法说明booleanadd(Objecte)在列表的末尾顺序添加元素,其实索引位置从0开始voidadd(intindex,Objecto)在指定的索引位置添加元素,索引位置必须介于0和列表中元素个数之间intsize()返回列表中元素的个数Objectget(intindex)返回指定索引位置处的元素,取出的元素是Object类型,使用前需要进行强制类型转换voidset(intindex,Objectobj)将index索引位置的元素替换为obj元素booleancontains(Objecto)判断列表中是否存在指定元素intindexOf(Objectobj)返回元素在集合中(首次)出现的索引booleanremove(Objecto)从列表中删除元素Objectremove(intindex)从列表中删除指定位置元素,起始索引位置从0开始ArrayListlist=newArrayList();//创建ArrayList对象//添加数据list.add(张三丰);list.add(郭靖);list.add(杨过);//判断集合中是否包含“李莫愁”booleanflag=list.contains(李莫愁);if(flag){System.out.println(李莫愁在集合中存在!);}else{System.out.println(李莫愁在集合中不存在!);}//把索引为0的数据移除System.out.println(移除前索引为0的数据是:+(String)list.get(0));list.remove(0);System.out.println(移除后索引为0的数据是:+(String)list.get(0));//把索引为1的元素替换为其他元素System.out.println(替换前索引为1的数据是:+(String)list.get(1));list.set(1,黄蓉);System.out.println(替换后索引为1的数据是:+(String)list.get(1));//遍历集合,输出集合中的元素System.out.println(集合中的元素:);for(inti=0;ilist.size();i++){Stringname=(String)list.get(i);System.out.println(name);}//输出某个元素所在的索引位置,若集合中没有该元素,输出结果为-1System.out.println(小龙女在集合中的索引位置:+list.indexOf(小龙女));System.out.println(黄蓉在集合中的索引位置:+list.indexOf(黄蓉));//清空集合list中的数据list.clear();//判断集合中是否包含数据for(Objectobj:list){Stringname=(String)obj;System.out.println(name);}if(list.isEmpty()){System.out.println(集合list中不包含数据!);}else{System.out.println(集合list中包含数据!);}输出结果:李莫愁在集合中不存在!移除前索引为0的数据是:张三丰移除后索引为0的数据是:郭靖替换前索引为1的数据是:杨过替换后索引为1的数据是:黄蓉集合中的元素:郭靖黄蓉小龙女在集合中的索引位置:-1黄蓉在集合中的索引位置:1集合list中不包含数据!ArrayList因为可以使用索引来直接获取元素,所以其优点是遍历元素和随机访问元素的效率比较高。但是由于ArrayList采用了和数组相同的存储方式,在内存中分配连续的空间,在添加和删除非尾部元素时会导致后面所有元素的移动,这就造成ArrayList对插入、删除等操作频繁时性能低下。所以数据操作(指插入、删除)频繁时,最好使用LinkedList存储数据。1.2.2使用LinkedList类动态存储数据LinkedList类是List接口的链接列表实现。它支持实现所有List接口可选的列表的操作,并且允许元素值是任何数据,包括null。LinkedList采用链表存储方式,优点在于插入、删除元素时效率比较高,但是LinkedList的查找效率很低。它除了包括ArrayList类所包含的方法外,还提供了其特有的一些方法:方法说明voidaddFirst(Object将给定元素插入当前集合首部obj)voidaddLast(Objectobj)将给定元素插入当前集合尾部ObjectgetFirst()获得当前集合的第一个元素ObjectgetLast()获得当前集合的最后一个元素ObjectremoveFirst()移除并返回当前集合的第一个元素ObjectremoveLast()移除并返回当前集合的最后一个元素注意点:Listlist=newLinkedList();LinkedListll=newLinkedList();list.addFirst(s);//此时,会发生编译错误ll.addFirst(s);1.3Set接口1.3.1Set接口概述Set接口描述的是一种比较简单的集合,集合中的对象并不按特定的方式排序,并且不能保存重复的对象,也就是说Set接口可以存储一组唯一、无序的对象。Set接口的实现类有HashSet。1.3.2使用HashSet类动态存储数据假如现在需要在很多数据中查找某个数据,如果使用ArrayList,在不知道数据的索引,且需要全部遍历的情况下,效率一样很低下。为此Java集合框架提供了一个查找效率高的集合类HashSet。HashSet集合的特点如下:(1)集合内的元素是无序排列的。(2)HashSet类是非线程安全的。(3)允许集合元素值为null。HashSet类的常用方法:方法说明booleanadd(Objecto)如果此Set中尚未包含指定元素,则添加指定元素voidclear()从此Set中移除所有元素intsize()返回此Set中的元素的数量(Set的容量)booleanisEmpty()如果此Set不包含任何元素,则返回trueboolean如果指定元素存在与此Set中,则将其移除remove(Objecto)HashSet类不存在get()方法,所以Set接口无法使用普通for循环遍历。1.4Iterator接口1.4.1Iterator接口概述Iterator接口表示对集合进行迭代的迭代器。此接口主要有两个方法:(1)hasNext():判断是否存在下一个可访问的元素,如果仍有元素可以迭代,则返回true。(2)next():返回要访问的下一个元素。凡是有Collection接口派生而来的接口或者类,都实现了iterate()方法,此方法返回一个Iterator对象。1.4.2使用Iterator遍历集合示例:ArrayListlist=newArrayList();list.add(张三);list.add(李四);list.add(王五);list.add(2,杰伦);System.out.println(使用Iterator遍历,分别是:);Iteratorit=list.iterator();//获取集合迭代器while(it.hasNext()){Stringname=(String)it.next();System.out.println(name);}1.5Map接口1.5.1Map接口概述Map接口存储一组成对的键(key)-值(value)对象,提供key到value的映射,通过key来检索。Map接口中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。Map接口常用方法:方法说明Objectput(Objectkey,Objectvalue)将相关联的一个key与一个value放入该集合,如果此Map接口已经包含了key对应的value,则旧值将被替换Objectremove(Objectkey)从当前集合中移除与指定key相关的映射,并返回该key关联的旧value。如果key没有任何关联,则返回nullObjectget(Objectkey)获得与key相关的value。如果该key不关联任何非null值,则返回nullbooleancontainsKey(Objectkey)判断集合中是否存在keybooleancontainsValue(Objectvalue)判断集合中是否存在valuebooleanisEmpty()判断集合中是否存在元素voidclear()清除集合中所有元素intsize()返回集合中元素的数量SetkeySet()获取所有key的集合Collectionvalues()获取所有value的集合1.6使用Collections类操作集合Collections类是Java提供的一个集合操作工具类,它包含了大量的静态方法,用于实现对集合元素的排序、查找和替换操作。1.6.1对集合元素排序与查找在Java中,如果想实现一个类的对象之间比较大小,那么这个类就要实现Comparable接口。此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法,此方法用于比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定对象,则分别返回负整数、零和正整数。compareTo()方法的定义语法:intcompareTo(Objectobj);实现此接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序。示例://物品类实现Comparable接口publicclassGoodsimplementsComparable{privateStringname;privatedoubleprice;publicStringgetNam