集合框架体系结构
集合框架体系结构图解释:
虚点框:代表接口,虚线框:代表抽象接口,实线框:代表实现接口的类
Collection和collections的区别:
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线
程安全化等操作。Map常用子类
Hashtable:哈希表,是同步的,不允许null键和null值
HashMap:哈希表,是不同步的,允许null键和null值
TreeMap:二叉树,不同步,可以对Map集合中的键进行排序
Collection接口常用子类Set和List:
Set:不记录元素的保存顺序,且不允许有重复数据
List:记录元素的保存顺序,且允许有重复数据。
ArrayList,Vector, LinkedList的存储性能和特性
ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元 素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差, 而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
ArrayList:利用数组实现,解决了数组中定长到变长,类型多样化的问题。
Iterator:迭代器接口 方法:hasNext() 判断迭代器中是否有值,next() 取某一个值并将指针移动到下一个单
总结:
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。取ArrayList中的值:
public static void test1(){ ArrayList aList=new ArrayList(); aList.add(5); aList.add(2); aList.add(0); aList.add("我"); aList.add('a'); //for循环取值 for (int i = 0; i < aList.size(); i++) { Object obj=aList.get(i); System.out.println(obj); } //iterator迭代器取值 Iterator it=aList.iterator(); while(it.hasNext()){ Object obj=it.next(); } //迭代器加for循环取值 for (Iterator iterator = aList.iterator(); iterator.hasNext();) { Object object =iterator.next(); } }
10.取Map集合中的键值对:Key键用Set集合存储,value用collection集合存储,键值对用Set集合存储
public static void putElements(){ hashMap.put("huang", "ming"); hashMap.put("chao", "sheng"); hashMap.put("shi", "tian"); int size=hashMap.size(); System.out.println("size="+size); } //key set集合 public static void getKey(){ Set keyset=hashMap.keySet(); Iterator it=keyset.iterator(); while(it.hasNext()){ Object key=it.next(); System.out.println("keys="+key); } } //value collection接口 public static void getValues(){ Collection coll=hashMap.values(); Iterator it=coll.iterator(); for (Iterator iterator = coll.iterator(); iterator.hasNext();) { Object value = iterator.next(); System.out.println("values="+value); } } //key-value entrySet集合 public static void getKV(){ //方式一 增强for循环获取 for(Object obj:hashMap.entrySet()){ Entry entry=(Entry) obj; Object key=entry.getKey(); Object value=entry.getValue(); System.out.println("key="+key+";value="+value); } //方式二 通过Key获取Value for(Object obj:hashMap.keySet()){ Object key=obj; Object value=hashMap.get(obj); System.out.println("key="+key+";value="+value); } //方式三 通过内部类Entry获取key和value Set entrySet=hashMap.entrySet(); Iterator it=entrySet.iterator(); while(it.hasNext()){ Entry entry=(Entry) it.next(); Object key=entry.getKey(); Object value=entry.getValue(); System.out.println("key="+key+";value="+value); } }
11.Stack类:
//出栈进栈 public static void test(){ Stack stack=new Stack(); stack.add("apple"); stack.add("banana"); stack.add(123); stack.add(new Date()); Iterator it=stack.iterator(); while(it.hasNext()){ Object obj=it.next(); System.out.println(obj); } //peek方法是取值,不会改变栈的大小 Object peekObj=stack.peek(); System.out.println("peekObj:"+peekObj); System.out.println("peek after:"+stack.size()); //pop方法将最后一个值弹出,栈的大小改变 Object popObj=stack.pop(); System.out.println("popObj:"+popObj); System.out.println("pop after:"+stack.size()); }
12.统计输入的语句中每个字符的个数:
public static void countChar(){ Scanner sc=new Scanner(System.in); System.out.println("请输入需统计的语句:"); String s=sc.next(); try { //先用GBK将字符解码,然后用UTF-8将字符串加码。 s = new String(s.getBytes("GBK"), "utf-8"); System.out.println(s); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } char[] c=s.toCharArray(); Mapmap=new TreeMap (); for (int i = 0; i < c.length; i++) { if(!(map.containsKey(c[i]))){ map.put(c[i], 1); }else{ map.put(c[i], map.get(c[i])+1); } } for(Object obj:map.entrySet()){ Entry entry=(Entry) obj; Object key=entry.getKey(); Object value=entry.getValue(); System.out.println(key+"="+value); } }