Welcome to Yumao′s Blog.
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里面的值
*/