巩固基础从Java集合类开始,最系统全面的集合类笔记

作者:挨踢小子 / 公众号:LN-aitixiaozi 发布时间:2019-11-01

1.集合类的由来
2.集合的特点
3.集合框架图
4.Collection的共性方法
5.迭代器的使用
6.有序重复同步问题
7.List
7.1特有常见方法
7.2list取出元素方法
7.3ListIterator介绍
8.LinkedList
9.ArrayList
10.哈希表确定元素是否相同
11.集合框架Collection练习
11.1定义功能去除ArrayList中的重复元素
12.TreeSet中的比较
12.1 方法一 实现 Comparable 接口
12.2 方法二 构造一个比较器 Comparator
12.3比较的原理——二叉树
12.4TreeSet集合练习-字符串长度排序
13.Map集合
13.1.Map遍历
*集合使用选择技巧
**泛型
1.集合类的由来
对象封装特有数据,对象多了,需要存储,如果对象的个数不确定就用集合容器进行存储。2.集合的特点
用于存储对象的容器。 集合的长度是可以改变的。 集合中不可以存储基本数据类型值。3.集合框架图这里写图片描述4.Collection的共性方法说明共性方法添加boolean add(Object obj)boolean addAll(Collection<? extends E> c)删除boolean remove(Object obj)boolean removeAll(Collection coll)void clear()判断集合存在boolean contains(object obj)boolean containsAll(Collection coll)判断非空boolean isEmpty()获取个数int size()取出元素Iterator iterator()迭代器取交集boolean retainAll(Collection coll)集合转数组Object toArray()5.迭代器的使用
1publicstaticvoidmain(){ 2//使用Collection中的iterator()方法 3Collectioncoll=newArrayList(); 4//Iteratorit=coll.iterator(); 5//while(it.hasNext(){System.out.println(it.next());}//it浪费内存,改成for 6 7for(Iteratorit=coll.iterator();it.hasNext();){ 8System.out.println(it.next()); 9}10}6.有序重复同步问题
Collection: |--List: 存取有序 可重复 有索引|--Vector: 可增长的对象数组 同步 效率低 增长100%空间浪费 查询增删都慢|--ArrayList: 可增长的对象数组 不同步 效率高,替代了Vector。增长50%空间浪费 查询快|--LinkedList: 内部是链表数据结构 不同步 增删快 |--set: 不可重复 不同步 set接口中的方法和Collection一致 |--HashSet 内部数据结构是哈希表 无序 不同步 |--LinkedHashSet 存取有序|--TreeSet 有字典排序Map<K,V> 无序 |--Hashtable:内部结构 哈希表 同步 不支持空键空值|--Properties:用来存储键值对型的配置文件的信息。可以IO技术相结合。 |--HashMap:内部结构 哈希表 不同步 支持空键空值|--LinkedHashMap 存取有序 |--TreeMap:内部结构二叉树 不同步7.List7.1特有常见方法
【特有】可以操作角标说明特性方法添加插入void add(index,element)void add(index,Collection)删除Object remove(index)修改Object set(index,element )获取查询Object get(index) int indexOf(object) int lastIndexOf(object)List subList(from,to)包含form不包含to遍历ListIterator listIterator() listIterator(int index)7.2list取出元素方法
1.通过迭代器取出 2.使用get()
1for(intx=0;x<list.size();x++){2System.out.println(list.get(x));3} 7.3ListIterator介绍
ListIterator是Iterator的子接口,因为iterator接口中只有,hasNext() next() remove()三个方法,所以并不能完成在集合操作中,继续操作iterator,否则会出现ConcurrentModificationException异常。 使用方法:
1可以实现在迭代中完成对元素的增删改查,只有list有这个 2ListIteratorit=list.listIterator();//获取列表迭代器对象 3white(it.hasNext()){ 4Objectobj=it.next(); 5if(obj.equals("abc2")){ 6it.add("abc9"); 7//it.set("abc9"); 8} 9}10System.out.println("list:"+list);11
附录ListIterator主要方法说明特性方法添加void add(E e)判断boolean hasNext()boolean hasPrevious()获取Object next()Object previous() int nextIndex()int previousIndex()替换void set(E e)删除void remove()8.LinkedList说明特性方法添加void addFirst()void addLast()jdk1.6后offerFirst()offerLast()获取E removeFirst() 获取删除头,如果链表为空,抛出NoSuchElementException E removeLast() 获取删除尾jdk1.6后E pollFirst(),如果链表为空,抛出NullE pollLast()E getFirst() 获取不删除头,如果链表为空,抛出NoSuchElementExceptionE getLast() 获取不删除尾jdk1.6之后E peekFirst() 获取不删除头,如果链表为空,抛出NullE peekLast()9.ArrayList
引用类型的集合
1ArrayLista1=newArrayList(); 2a1.add(newPerson("lisi1",21)); 3a1.add(newPerson("lisi2",22)); 4 5Iteratorit=a1.iterator(); 6while(it.hasNext()){ 7Personp=(Person)it.next(); 8System.out.println(p.getName()+"--"+p.getAge()); 9}101510.哈希表确定元素是否相同
1.判断的是两个元素的哈希值是否相同。如果如果相同,再判断两个对象的内容是否相同。 2.判断哈希值相同,其实就是对象的hashCode方法。判断内容用的是equals 注意:如果哈希值不同,是不需要判断内容的。11.集合框架Collection练习11.1定义功能去除ArrayList中的重复元素
1publicclassMain{ 2 3publicstaticvoidmain(String[]args){ 4ArrayLista1=newArrayList(); 5a1.add("acb1"); 6a1.add("acb2"); 7a1.add("acb1"); 8 9System.out.println(a1);10a1=getSingleElement(a1);11System.out.println(a1);1213}1415privatestaticArrayListgetSingleElement(ArrayLista1){1617//1.定义一个临时容器18ArrayListtemp=newArrayList();1920//2.迭代a1集合21Iteratorit=a1.iterator();22while(it.hasNext()){23Objectobj=it.next();2425//3.判断被迭代到的元素是否在临时容器中26if(!temp.contains(obj)){27temp.add(obj);28}29}30returntemp;31}32373839
注意: 对于ArrayList来说,去重复自定义对象时,自定义的对象需要和 equals 方法,因为 contains 方法依据的还是equals方法12.TreeSet中的比较
TreeSet判断元素唯一的方法就是根据返回值是否是0,是0,就是元素相同,不存。12.1 方法一 实现 Comparable 接口
此接口强行对实现它的每个类的对象进行整体排序。这种排序称为类的自然排序, 类的compareTo方法称为他的自然比较法。
1PersonimplementsComparable<Person>{ 2... 3<spanclass="hljs-annotation" style="font-size: inherit;color: inherit;line-height: inherit;overflow-wrap: inherit !important;word-break: inherit !important;">@Override 4publicintcompareTo(Personp){ 5 6 7 8inttemp=this.age-p.age; 9returntemp==0?this.name.compareTo(p.name):temp;10}11}12</spanclass="hljs-annotation">12.2 方法二 构造一个比较器 Comparator
如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。 比较器 Comparator 强行对某个对象collection进行整体排序。 方法: int compare(T o1,T o2) boolean equals(Object obj)
1publicclassComparatorByNameimplementsComparator<Person>{ 2 3 4<spanclass="hljs-annotation" style="font-size: inherit;color: inherit;line-height: inherit;overflow-wrap: inherit !important;word-break: inherit !important;">@Override 5publicintcompare(Personp1,Personp2){ 6 7inttemp=p1.getName().compareTo(p2.getName()); 8 9returntemp==0?p1.getAge()-p2.getAge():temp;10}11}</spanclass="hljs-annotation">
使用:
1TreeSetts=newTreeSet(newComparatorByName());12.3比较的原理——二叉树12.4TreeSet集合练习-字符串长度排序
1publicclassComparatorByLengthimplementsComparator{ 2 3 4<spanclass="hljs-annotation" style="font-size: inherit;color: inherit;line-height: inherit;overflow-wrap: inherit !important;word-break: inherit !important;">@Override 5publicintcompare(Objecto1,Objecto2){ 6 7Strings1=(String)o1; 8Strings2=(String)o2; 910inttemp=s1.length()-s2.length();1112returntemp==0?s1.compareTo(s2):temp;1314}15}16</spanclass="hljs-annotation">13.Map<K,V>集合
Map与Collection区别? Map一次添加一对数据,Collection一次添加一个元素 Map的Key不能重复,Value可以重复 常见方法:说明共性方法添加V put(K,V) 返回前一个和key关联的值,如果没有则返回null。存相同键,值会覆盖删除void clear() 清空集合 V remove(Object K) 根据指定的key删除值判断存在boolean containsKey(key)boolean containsValue(value)判断是否有键值对boolean isEmpty()获取V get(key) 通过键拿值 如果无该key,则返回null。当然可以通过返回null,来判断是否包含指定键。int size() 获取键值对的个数Collection values() 获取集合中所有的值不要键键集Set keySet() 返回此映射中所有包含的键的 Set 视图Set<Map.Entry<K,V>> entrySet() 用于遍历13.1.Map<K,V> 遍历
方法一:KeySet() 将键作为对象存储在set中
1publicstaticvoidmain(String[]args){ 2 3HashMap<Integer,String>map=newHashMap<Integer,String>(); 4method(map); 5 6} 7publicstaticvoidmethod(Map<Integer,String>map){ 8map.put(1,"abc1"); 9map.put(2,"abc2");10map.put(5,"abc5");11map.put(7,"abc7");121314Set<Integer>keySet=map.keySet();15Iterator<Integer>it=keySet.iterator();16while(it.hasNext()){17Integerkey=it.next();18Stringvalue=map.get(key);19System.out.println(key+":::"+value);20}21}22这里写图片描述
方法二:entrySet() 该方法将键和值的映射关系作为对象,存储到了Set集合中,而这个映射关系类型就是Map.Entry类型
1publicstaticvoidmain(String[]args){ 2 3HashMap<Integer,String>map=newHashMap<Integer,String>(); 4method(map); 5 6} 7publicstaticvoidmethod(Map<Integer,String>map){ 8map.put(1,"abc1"); 9map.put(2,"abc2");10map.put(5,"abc5");11map.put(7,"abc7");121314Set<Map.Entry<Integer,String>>entrySet=map.entrySet();15Iterator<Map.Entry<Integer,String>>it=entrySet.iterator();16while(it.hasNext()){17Map.Entry<Integer,String>next=it.next();18Integerkey=next.getKey();19Stringvalue=next.getValue();20System.out.println(key+":::"+value);21}22}23这里写图片描述*集合使用选择技巧
集合需要唯一吗?需要:Set 需要制定顺序吗? 需要:TreeSet 不需要:HashSet 想要一个和存储一致顺序:LinkedHashSet不需要:List 需要频繁增删吗? 需要:LinkedList 不需要:ArrayList如何记录每一个容器的结构和所属体系呢?看名字!List |--ArrayList |--LinkedListSet |--HashSet |--TreeSet看到array 就要想到数组,就要想到查询快,有角标。看到link 就要想到链表,就要想到增删快,就要想到 add get remove first last的方法看到hash 就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。看到tree 就要想到二叉树,就要想到要排序,就要想到两个接口`Comparable` `Comparator`而且通常这些常见的集合容器是不同步的。 **泛型
1.jdk1.5后出现的安全机制。 2.将运行时期的问题ClassCastException 转到了编译时期。 3.避免了强制转换的麻烦。 <>:什么时候用?当操作的引用数据类型不确定的时候,就用<>. 4.泛型技术是给编译器使用的技术,用于编译时期,确保了类型的安全。运行时,会去泛型,生成的class文件中是不带泛型的,这个称为泛型的擦除。为什么擦除?为了兼容运行的类加载器。 5.泛型的补偿:在运行时,通过获取元素的类型进行转换动作。不必强制转换类型。
作者:老鬼博客
来源:https://blog.csdn.net/weizhengzhou520/article/details/81806539
关注【挨踢小子】,让我们一起成长
适合分享 | 值得留言

关注挨踢小子微信公众号,获取更多图文精彩内容


其他栏目