java中集合API
集合API一、简述二、Collection1.List1.ArrayList2. LinkedList2 Set三、Map1.HashMap2. TreeMap三、Iterator接口Collections工具类1.对集合元素进行排序2.基于Comparator自定义方法(内部类)进行排序一、简述Collection最基础的集合接口所有具体集合类都直接或间接实现了这个接口Map以键值对方式存储Iterator迭代器常用语遍历集合中的元素二、Collection常见方法add(E e): 将元素添加到集合中如果集合不支持添加操作则抛出UnsupportedOperationException异常。clear()清空操作contains(Object o): 是否包含指定元素有则返回true/无 falseisEmpty(): 是否为空iterator():返回一个迭代器用于遍历元素remove(Object o):从集合中移除指定元素size(): 返回集合元素个数toArray():将集合中元素转换为数组1.List有序性List保持元素的插入顺序。可重复性List允许同一个元素出现多次。索引访问提供了基于索引(可以理解为下标)的方法来访问和修改列表中的元素。1.ArrayList数组列表既有数组的特性又有列表的特性能够动态调整列表大小访问元素非常快单插入和删除操作较慢尤其是列表中间进行这些操作原因是需要移动元素importjava.util.ArrayList;publicclassArrayListDemo01{publicstaticvoidmain(String[]args){ArrayListStringzqstarnewArrayList();//添加zqstar.add(内马尔);zqstar.add(德布劳内);zqstar.add(萨拉赫);if(zqstar.contains(内马尔)){System.out.println(内马尔 is in the list.);}// 获取并打印指定索引处的元素StringsecondZqStarzqstar.get(1);System.out.println(Second zqstar is: secondZqStar);// 替换指定位置的元素zqstar.set(2,博格巴);System.out.println(List after replacement: zqstar);// 删除指定位置的元素zqstar.remove(1);System.out.println(List after deletion: zqstar);// 清空列表zqstar.clear();System.out.println(List is empty now? zqstar.isEmpty());}}手搓简易版ArrayListpackagecom.example.test.api;importjava.util.Arrays;publicclassMyArrayList{/*存储数据*/privateObject[]data;privateintsize;/*用于记录有效元素的个数*/publicMyArrayList(){this.datanewObject[16];}publicMyArrayList(intcapacity){this.datanewObject[capacity];}//向size位置添加新的元素publicvoidadd(Objectelement){//判断是否需要扩容if(sizedata.length){dataArrays.copyOf(data,2*data.length);}//存储data[size]element;size;}//删除publicbooleanremove(Objectobj){if(size0)returnfalse;//遍历找元素booleanflagfalse;for(inti0;isize;i){if(data[i].equals(obj)){//从i1开始将后面的元素往前移动一位(删除下标为i的元素)System.arraycopy(data,i1,data,i,size-i-1);flagtrue;break;}}if(!flag)returnfalse;data[--size]null;size--;returntrue;}publicintsize(){returnsize;}OverridepublicStringtoString(){StringBuildersbnewStringBuilder([);for(inti0;isize;i){sb.append(data[i]).append(,);}sb.deleteCharAt(sb.lastIndexOf(,));sb.append(]);returnsb.toString();}}2. LinkedList实现了List接口底层是双向链表优点插入或删除元素的性能较好适合频繁进行首尾插入和删除操作的场景。缺点读取元素时需要从头或尾开始遍历链表性能较差不适合需要随机访问元素的场景。packageapi;importjava.util.ArrayList;importjava.util.LinkedList;publicclassLinkedListTests{publicstaticvoidmain(String[]args){LinkedListIntegerlistnewLinkedList();list.add(100);list.add(200);//在头部添加list.addFirst(500);//在尾部添加list.addLast(600);System.out.println(list);//移除头部元素,返回值为被移除的元素Integerfirstlist.removeFirst();//移除尾部元素,返回值为被移除的元素Integerlastlist.removeLast();System.out.println(firstfirst;lastlast);System.out.println(list);System.out.println(list.contains(Integer.valueOf(200)));}}2 SetHashSet实现了Set接口不允许元素重复无序添加、查询和删除等操作都具有较高的效率packageapi;importjava.util.Collection;importjava.util.HashSet;importjava.util.Set;publicclassHashSetTests{publicstaticvoidmain(String[]args){Collectionc1newHashSet();c1.add(one);c1.add(one);//不会添加重复元素c1.add(two);System.out.println(c1.size());System.out.println(c1);SetIntegerc2newHashSet();c2.add(100);c2.add(100);c2.add(200);c2.add(200);System.out.println(c2);c2.remove(200);System.out.println(c2);}}三、Map键值对方式存储1.HashMap底层数据结构是散列桶数组、链表、红黑树数组用于存储桶桶里装着一个链表或红黑树。java8之后链表为了解决哈希冲突链表长度大于8之后会转换为红黑树红黑树的节点小于6时会转换为链表。取8为临界值是因为可以更好的平衡时间和空间复杂度。**特点**无序键和值都允许为null非同步不是线程安全的put方法插入键值对get 方法获取指定键对应的值remove 删除指定键的值遍历//键值对的方式for(Map.EntryString,Integerentry:hashMap.entrySet()){System.out.println(键: entry.getKey(), 值: entry.getValue());}//键找值的方式//所有key取出来存到一个Set集合中SetStringkeySetmap.keySet();//迭代器遍历IteratorMap.EntryString,IntegeriteratorentrySet.iterator();While(iterator.hasNext()){Map.EntryString,Integerentryiterator.next();Stringkeyentry.getKey();Integervalueentry.getValue();System.out.println(key,value);}2. TreeMap底层是红黑树**特点**数据有序比HashMap多实现了NavigableMap接口非同步三、Iterator接口常见方法hasNext 判断是否还有下一个元素boolean类型next获取当前指针指向的元素调用移动指针CollectioncnewArrayList();c.add(100);c.add(200);c.add(Hello kugou);Iteratoriteratorc.iterator();while(iterator.hasNext()){Objectobjiterator.next();;System.out.println(obj);}Collections工具类1.对集合元素进行排序ListIntegerListArrays.asList(array);数组转换为ListCollections.sort(list);System.out.println(list);//实现Comparable接口packageapi;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;classStudentimplementsComparableStudent{privateStringname;privateintscore;publicStudent(Stringname,intscore){this.namename;this.scorescore;}OverridepublicStringtoString(){returnStudent{namename\, scorescore};}/** * 当我们使用Collections的sort方法进行排序时, * 底层会调用待排序对象内部的compareTo方法 * param o the object to be compared. * return 0表示等于,负数小于,正数表示大于 */OverridepublicintcompareTo(Studento){returnthis.score-o.score;}}/** * 通过Collections对多个学生按成绩进行排序. */publicclassCollectionSortDemo02{publicstaticvoidmain(String[]args){ListStudentlistnewArrayList();list.add(newStudent(Tony,91));list.add(newStudent(Mike,90));list.add(newStudent(Jack,97));Collections.sort(list);System.out.println(list);}})2.基于Comparator自定义方法(内部类)进行排序packageapi;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;/**电影对象类型*/classFilm{privateStringname;privateintscore;publicFilm(Stringname,intscore){this.namename;this.scorescore;}publicintgetScore(){returnscore;}OverridepublicStringtoString(){returnFilm{namename\, scorescore};}}publicclassCollectionSortDemo03{publicstaticvoidmain(String[]args){Filmf1newFilm(马尔扎哈,90);Filmf2newFilm(阿斯特拉,87);Filmf3newFilm(魔童哪吒,93);ListFilmlistnewArrayListFilm();list.add(f1);list.add(f2);list.add(f3);Collections.sort(list,newComparatorFilm(){Overridepublicintcompare(Filmo1,Filmo2){returno1.getScore()-o2.getScore();}});System.out.println(list);}}