Welcome to Yumao′s Blog.
Hello JavaSE Day04
, 2012年03月14日 , Java Language , 评论 在〈Hello JavaSE Day04〉中留言功能已關閉 ,

Java SE1 Day04

====================

1 集合補遺
2 內部類

1 集合補遺
  1) 集合複製, 默認的複製規則是淺表(淺層)複製
   A clone() 方法

   B 使用複製構造器!
   Map map = new HashMap();
   Map map2 = new HashMap(map);

   List list1 = new ArrayList();
   List list2 = new LinkedList(list1);
  2) 同步化(線程安全的)
   List list = new ArrayList();
   //synchronizedList 可以將非線程安全的list包裝為線程安全的
   list = Collections.synchronizedList(list);
   轉換以後就相當於 Vector
   HashMap map = new HashMap();
   //synchronizedMap 可以將非線程安全的map包裝為線程安全的
   map = Collections.synchronizedMap(map);

 3) 數組與集合的轉換
  a 數組轉List(只讀的)
     String[] names = {"A","B","C"};
     List list = Arrays.asList(names);//只讀list
     list = new ArrayList(list);//複製為全功能List
     Set set = new HashSet(list);//複製為Set集合
  b 集合轉數組
     Object[] ary1 = list.toArray();//集合轉Object[]
     String[] ary2 = (String[])
     	list.toArray(new String[]{});//集合轉制定類型數組

 4) Collection 與 Collections
   Collection 抽象的集合概念,
   Collections 集合靜態工具類, 包含集合的工具方法
      (sort, 打亂(洗牌)等)

 5) Map的迭代, Map 是 [Key:Value] 組成的集合
  A 對key:value 進行迭代
    map.entrySet();
  B 對Key進行迭代
    map.keySet();
  C 對Value進行迭代
    map.values();
  案例: 統計每個字符出現的次數

2 內部類- 定義在類的內部 的類, 根據位置分為4類
  1) 靜態內部類:使用static修飾,聲明在類體中.
  靜態內部類中可以訪問外部類的靜態成員。

  2) 成員內部類: 聲明在類體中,不使用static,具有類的成員特徵
   也就是,必須有類的實例才能創建內部類實例。內部類實例
   可以訪問共享外部類的成員變量。很常用。
   如:鏈表的節點就可以定義為內部類
  3) 局部內部類:把類聲明在方法中,就是局部內部類,作用域
   類似局部變量。很少見。
  4) 匿名內部類,匿名類:非常常見,可以寫在任何地方,就像一般的語句。
    語法更象是創建對象:
    	Date d = new Date(){};
    匿名類是對原類的一個繼承,同時創建了實例,{} 就是繼承
    以後的類體。類體中可使用所有類的語法。
    匿名類不能寫構造器。
    匿名類可以從抽象類或者接口繼承,必須提供抽象方法的實現。
  5) 任何內部類都編譯成獨立的class文件
  6) 最大的作用:封裝!封裝內部概念:
    情侶間的土豆和菜市場的土豆是不一樣的

  Java API 中 集合的迭代器實現, 鏈表節點類型,
   散列表的散列桶(鏈表)  二叉樹的節點類型等
   都是使用內部類實現!

  7) 通過實例簡單理解記憶語法.在今後的案例中靈活練習內部類

預習: Java Date, Java 異常, Java IO

重要演示代码:

package Day14;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class CharCounterDemo
{
	public static void main(String[] args)
	{
		String str="Teemo,Fizz,Jax,Eee,Annie,Sona,Galio,WuKong,Kog";				//建立字符串
		Map map=countAll(str);									//按照coutALL方法进行字符串拆分转存为Map
		System.out.println(map);													//输出map  以供参考
		Collection values=map.values();									//map.values()=>[2, 1, 1, 1, 5, 1, 3, 4, 5, 1, 1, 8, 1, 2, 3, 1, 1, 1, 1, 2, 1]
		int total=0;																//定义计数器
		Iterator ite=values.iterator();									//迭代values=>ite
		while(ite.hasNext())														//判断是否还有元素  有的话执行循环
		{
			Integer n=ite.next();													//提取出下一个元素  类型为int   此句也可写作int n=ite.next();
			total+=n;																							//将所有的value想加  储存在total中  此句可以写作total=total+n;
		}
		System.out.println(total);													//输出total  也就是输出所有的字符串出现的次数
		Set keys=map.keySet();											//此步和下步就是为了转换成list型  以便采用Conllections的sort方法进行排序
		ArrayList list=new ArrayList(keys);
		Collections.sort(list);														//按照默认表进行排序
		for(Iterator i=list.iterator();i.hasNext();)						//迭代输出部分  for 从第一个元素开始  结束为没有下个元素
		{
			Character ch=i.next();													//同上理  Character也可以直接写做char使用
			int n=map.get(ch);														//n储存的的就是ch(Key)所对应的value值
			System.out.print(ch);													//输出ch(Key)
			System.out.println("t"+n);												//输出n(Value)
		}
		System.out.println();														//输出一行回车以便下面的迭代试验
		Set> entries = map.entrySet();					//因为需要调用表进行排序  所以引入Entry
		List> entList =
				new ArrayList>(entries);					//同理  为了调用sort而转换为list
		Collections.sort(entList, new ByValue());  									//按照ByValue表进行排序
		for (Iterator> i= entList.iterator()
				;i.hasNext();) 														//迭代输出部分  for 从第一个元素开始  结束为没有下个元素
		{
		    Entry entry = i.next();								//定义一个Entry  来记录下一个元素
		    Character ch = entry.getKey();											//调出entry元素的Key  储存在ch内
		    Integer n = entry.getValue();											//调出entry元素的Value  储存在n内
			System.out.print(ch);													//输出ch(Key)
			System.out.println("t"+n);												//输出n(value)
		}
	}
	public static Map countAll(String str)						//方法coutAll  主要作用是将字符串分解成K和V存入map
	{
		HashMap map=
				new HashMap();									//建立一个散列表
		for(int i=0;i>						//ByValue表  实现按表声明排序
{
	public int compare(
			Entry a1,Entry a2)				//方法compare  进行元素的比较
	{
		return a1.getValue()-a2.getValue();											//按照Value的大小进行返回
	}
}

/*关于Map.Entry
 你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦
 使用Map.Entry类,你可以得到在同一时间得到所有的信息
标准的Map访问方法如下:
Set keys = map.keySet( );
if(keys != null)
{
	Iterator iterator = keys.iterator( );
	while(iterator.hasNext( ))
	{
		Object key = iterator.next( );
		Object value = map.get(key);
		<代码串>;
	}
}
然后,这个方法有一个问题
从Map中取得关键字之后
我们必须每次重复返回到Map中取得相对的值
这是很繁琐和费时的。
幸运的是,这里有一个更加简单的途径
Map类提供了一个称为entrySet()的方法
这个方法返回一个Map.Entry实例化后的对象集
接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法
因此,上面的代码可以被组织得更符合逻辑
举例如下
Set entries = map.entrySet( );
if(entries != null)
{
	Iterator iterator = entries.iterator( );
	while(iterator.hasNext( ))
	{
		Map.Entry entry =iterator.next( );
		Object key = entry.getKey( );
		Object value = entry.getValue();
		<代码串>;
	}
}
尽管增加了一行代码,我们却省略了许多对Map不必要的“get”调用
同时,提供给开发人员一个同时保持了关键字和其对应的值的类
Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值
 */

Code Package

课堂提纲教案

评论已关闭