JAVA--浅谈集合
2016-04-22 22:15
579 查看
写在前面:
请多多指正。
集合类概述
参考文献
/article/8712427.html
java集合类图
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
(PS:本段属于转载)
以下为楼主自己总结的集合类的继承关系图(Ps:集合类下方为常用方法)
Collection接口
Collection接口是层次结构中的根接口,构成Collection的单位为元素。Collection接口通常不能直接使用(可以向继承自它的集合添加元素),但它提供了添加元素、删除元素、管理数据的方法,这对于继承自它的List集合和Set集合是通用的。
代码实例:
List集合
List集合包括了List接口以及List接口的所有实现类,List集合中的元素允许重复,各元素的顺序就是对象插入的顺序,类似于数组,同样可以进行随机访问集合中的元素(不同的是由于实例的方法不同会有不同的效率)。
两种实现方法:
1.ArrayList
以可变数组的方式保存所有的元素,包括null,可以根据索引位置对集合进行快速的随机访问,但是进行插入对象和删除对象的时候速度较慢。
2. LinkedList
采用链表的结构保存对象,随机访问的时候由于链表的结构实现导致效率较低,但是在插入对象和删除对象的时候效率很高。
实现示例:
具体实例:
Set集合
Set集合构造方法内含约束条件,不能传入重复的Collection对象值,在进行操作的时候也必须谨慎,若不小心修改某一元素导致与其他某一元素重复,将会引发一些问题。
Set接口的实现方法有两种:
1.HashSet
由哈希表支持,并不能保证该顺序恒久不变。此类允许使用null元素
2.TreeSet
不仅实现了Set接口,还实现了java.util.SortedSet接口,因此TreeSet类中在遍历集合时按照自然顺序递增排序,也可以按照指定的选择器递增排序。
Ps:存入TreeSet集合的Set集合必须实现Commparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序,如果该对象小于、等于或者大于指定对象,则分别返回负整数、0、正整数(可以修改返回,实现递减哦)。
代码实例:
Map集合
Map接口提供了将key映射到值的对象,一个映射不能包含重复的key,每个key最多只能映射一个值,Map接口中实现了集合的常用方法,在文章首部进行了总结,此处不再列举。
Map接口的两种试下方法:
1.HashMap
基于哈希表的实现方法,此实现提供所有的可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性,HashMap通过哈希表对其内部的映射关系进行快速查找,此类不影响映射的顺序,特别是它不保证该顺序恒久不变。使用此实现进行Map集合添加和删除映射关系效率更高。
2.TreeMap
不仅实现了Map接口,还实现了java.util.SortedMap接口,因此,集合中的映射关系有一定的顺序,但在添加、删除和定位映射关系的时候,TreeMap类较之于HashMap类性能稍差,由于TreeMap类实现的Map集合中的映射关系是按照键对象按照一定的顺序排列的,因此不允许键对象是null
可以通过HashMap创建Map集合,需要顺序输出的时候,创建一个完成相同映射关系的TreeMap类实例。
代码实例:
请多多指正。
集合类概述
参考文献
/article/8712427.html
java集合类图
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
(PS:本段属于转载)
以下为楼主自己总结的集合类的继承关系图(Ps:集合类下方为常用方法)
Collection接口
Collection接口是层次结构中的根接口,构成Collection的单位为元素。Collection接口通常不能直接使用(可以向继承自它的集合添加元素),但它提供了添加元素、删除元素、管理数据的方法,这对于继承自它的List集合和Set集合是通用的。
代码实例:
/** * */ package test集合; import java.util.*; /** * @author 寒 * */ public class Muster { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 Collection<String > list = new ArrayList<>(); //实例集合类元素 list.add("a"); //向集合中添加元素 list.add("b"); list.add("c"); list.add("d"); Iterator<String> it = list.iterator(); //创建迭代器 while(it.hasNext()){ String str = (String )it.next(); System.out.println(str); } List<String > list2 = new ArrayList<>(); list2.addAll(list); int i = (int)(Math.random() * (list2.size() - 1)); System.out.println("随机读取集合中的元素:" + list2.get(i)); for(int j = 0 ;j < list2.size() ; j ++){ System.out.println(list2.get(j)); } } }
List集合
List集合包括了List接口以及List接口的所有实现类,List集合中的元素允许重复,各元素的顺序就是对象插入的顺序,类似于数组,同样可以进行随机访问集合中的元素(不同的是由于实例的方法不同会有不同的效率)。
两种实现方法:
1.ArrayList
以可变数组的方式保存所有的元素,包括null,可以根据索引位置对集合进行快速的随机访问,但是进行插入对象和删除对象的时候速度较慢。
2. LinkedList
采用链表的结构保存对象,随机访问的时候由于链表的结构实现导致效率较低,但是在插入对象和删除对象的时候效率很高。
实现示例:
List<E> list = new ArrayList<>(); List<E> list = new LinkedList<>();
具体实例:
/** * */ package test集合; import java.util.*; /** * @author 寒 * */ public class Muster { /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 Collection<String > list = new ArrayList<>(); //实例集合类元素 list.add("a"); //向集合中添加元素 list.add("c"); list.add("c"); list.add("d"); Iterator<String> it = list.iterator(); //创建迭代器 while(it.hasNext()){ String str = (String )it.next(); System.out.println(str); } List<String > list2 = new ArrayList<>(); list2.addAll(list); int i = (int)(Math.random() * (list2.size() - 1)); System.out.println("随机读取集合中的元素:" + list2.get(i)); for(int j = 0 ;j < list2.size() ; j ++){ System.out.println(list2.get(j)); } } }
Set集合
Set集合构造方法内含约束条件,不能传入重复的Collection对象值,在进行操作的时候也必须谨慎,若不小心修改某一元素导致与其他某一元素重复,将会引发一些问题。
Set接口的实现方法有两种:
1.HashSet
由哈希表支持,并不能保证该顺序恒久不变。此类允许使用null元素
2.TreeSet
不仅实现了Set接口,还实现了java.util.SortedSet接口,因此TreeSet类中在遍历集合时按照自然顺序递增排序,也可以按照指定的选择器递增排序。
Ps:存入TreeSet集合的Set集合必须实现Commparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序,如果该对象小于、等于或者大于指定对象,则分别返回负整数、0、正整数(可以修改返回,实现递减哦)。
代码实例:
/** * */ package test集合; import java.util.Iterator; import java.util.TreeSet; /** * @author 寒 * */ public class TestTreeSet implements Comparable<Object>{ String name; long id; public TestTreeSet(String name , long id ){ this.id = id; this.name = name; } /* (非 Javadoc) * @see java.lang.Comparable#compareTo(java.lang.Object) */ @Override public int compareTo(Object o) { // TODO 自动生成的方法存根 TestTreeSet tree = (TestTreeSet) o; int result = id > tree.id ? 1:(id == tree.id ?0:-1);// 实现比较方法 return result; } public long getId(){ return id; } public String getName(){ return name; } /** * @param args */ public static void main(String[] args) { // TODO 自动生成的方法存根 TestTreeSet t1 = new TestTreeSet("a" , 25); TestTreeSet t2 = new TestTreeSet("b" , 26); TestTreeSet t3 = new TestTreeSet("c" , 30); TestTreeSet t4 = new TestTreeSet("d" , 10); TestTreeSet t5 = new TestTreeSet("e" , 5); TestTreeSet t6 = new TestTreeSet("f" , 1); TreeSet<TestTreeSet> list = new TreeSet<>(); list.add(t1); list.add(t2); list.add(t4); list.add(t3); list.add(t5); list.add(t6); Iterator <TestTreeSet> it= list.iterator(); System.out.println("显示TreeSet的所有元素:"); while(it.hasNext()){ TestTreeSet one = (TestTreeSet) it.next(); System.out.println(one.getId() + " " + one.getName()); } it = list.headSet(t4).iterator(); while(it.hasNext()){ TestTreeSet one = (TestTreeSet) it.next(); System.out.println(one.getId() + " " + one.getName()); } TestTreeSet t8 = list.first(); System.out.println(t8.getId() + " " + t8.getName()); it = list.tailSet(t5).iterator(); while(it.hasNext()){ TestTreeSet one = (TestTreeSet) it.next(); System.out.println(one.getId() + " " + one.getName()); } } }
Map集合
Map接口提供了将key映射到值的对象,一个映射不能包含重复的key,每个key最多只能映射一个值,Map接口中实现了集合的常用方法,在文章首部进行了总结,此处不再列举。
Map接口的两种试下方法:
1.HashMap
基于哈希表的实现方法,此实现提供所有的可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性,HashMap通过哈希表对其内部的映射关系进行快速查找,此类不影响映射的顺序,特别是它不保证该顺序恒久不变。使用此实现进行Map集合添加和删除映射关系效率更高。
2.TreeMap
不仅实现了Map接口,还实现了java.util.SortedMap接口,因此,集合中的映射关系有一定的顺序,但在添加、删除和定位映射关系的时候,TreeMap类较之于HashMap类性能稍差,由于TreeMap类实现的Map集合中的映射关系是按照键对象按照一定的顺序排列的,因此不允许键对象是null
可以通过HashMap创建Map集合,需要顺序输出的时候,创建一个完成相同映射关系的TreeMap类实例。
代码实例:
/** * */ package test集合; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * @author 寒 * */ public class TestMap { public static void main(String []args){ Map<String,String> map = new HashMap<>(); map.put("01", "李同学"); map.put("03", "魏同学"); map.put("02", "李同学"); Set<String >set = map.keySet(); Iterator <String >it = set.iterator(); System.out.println("Key集合中的元素:"); while(it.hasNext()){ System.out.println(it.next()); } Collection <String > coll = map.values(); it = coll.iterator(); System.out.println("values集合中的元素:"); while(it.hasNext()){ System.out.println(it.next()); } TreeMap <String ,String> tree = new TreeMap<>(); tree.putAll(map); Iterator<String> iter = tree.keySet().iterator(); System.out.println("TreeMap 类实现的Map集合,键对象升序:"); while(iter.hasNext()){ String it1 = (String )iter.next(); String name = (String )tree.get(it1); System.out.println(it1 + " " + name); } } }
相关文章推荐
- 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题
- java使double保留两位小数的方法
- 好难的spring错误
- 解决 java.lang.IllegalThreadStateException: Thread already started. 错误
- java基础(15)-- 浅析I/O模型
- Java线程中run和start方法的区别
- JAVA动态规划(五)--01背包问题及装箱问题
- Java IO学习
- JAVA动态规划(四)--根据给定0和1的个数,求字典序排在第K位的数【微软笔试题】
- LeetCode208 Implement Trie (Prefix Tree) Java
- java线程模型 线程池
- java毕向东听课笔记22(集合框架-List集合共性方法)
- JDK历史版本下载
- 第一节 Spring的环境搭建
- Java遍历容器注意问题
- 一些个人笔记(java第一季)
- JDK的动态代理
- (28)SpringBoot启动时的Banner设置【从零开始学Spring Boot】
- SSH中的exception is java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
- jdk中设计模式的实现