集合框架体系结构
集合框架体系结构图解释:
虚点框:代表接口,虚线框:代表抽象接口,实线框:代表实现接口的类
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();
Map<Character,Integer> map=new TreeMap<Character,Integer>();
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);
}
}本文出自 “ming” 博客,请务必保留此出处http://8967938.blog.51cto.com/8957938/1676505
原文:http://8967938.blog.51cto.com/8957938/1676505