基础知识巩固四(问题部分)
一、關于java多態
多態的存在有三個前提:
二、觀察Set中的add源碼(擴容)
調試了一下,發現set底層接觸到了hashmap,hashmap的擴容方法resize(),每次擴容,都是原來大小的兩倍,里頭具體的代碼沒去深究,知道有這么個事兒。
定義初始容量大小(table數組的大小,缺省值為16),定義負載因子(缺省值為0.75)的形式
?
三、for-each循環set
集合類可以用for-each形式輸出整個集合,也可以用Iterator.
for-each注意點:
如果查看編譯后的字節碼,會發現foreach最終被編譯器轉為對iterator.next()的調用,這些jdk給隱藏起來了
注意:
- foreach循環只適用于實現了Iterable<T>接口的對象。由于所有內置Collection類都實現了java.util.Collection接口,已經繼承了Iterable,所以為了解決上述問題,可以選擇簡單地讓CustomCollection實現Collection接口或者繼承AbstractCollection
四、比較器實現一個Comparator
在idea中代碼如下:
1 public class Test<T> { 2 3 public static void main(String[] args){ 4 System.out.println("It's for String"); 5 CompareBoth<String> sg = new CompareBoth<String>(); 6 System.out.println(sg.compare("asd", "asd")); 7 System.out.println(sg.compare("a", "d")); 8 System.out.println("It's for Integer"); 9 CompareBoth<Integer> in = new CompareBoth<Integer>(); 10 System.out.println(in.compare(1,2)); 11 System.out.println(in.compare(1,1)); 12 System.out.println(in.compare(2,1)); 13 } 14 15 private static class CompareBoth<T> implements Comparator<T>{ 16 17 public int compare(T o1, T o2) { 18 if (o1 instanceof String){ 19 if(o1.equals(o2))return 0; 20 } 21 if (o1 instanceof Integer){ 22 if (((Integer) o1).intValue()==((Integer)o2).intValue())return 0;//int a = A.valueOf()可以將Integer的A轉換成int23 if ((Integer)o1>(Integer) o2)return 1; 24 } 25 return -1; 26 } 27 } 28 }?五、線性表概念
首先補充一個概念,集合分為:1、規則集(Set) 2、線性表(List)3、隊列(queue)
線性表:線性表主要由順序表示或鏈式表示。
- ArrayList是通過數組實現的順序存儲線性表
- LinkedList是通過鏈表實現的鏈式存儲線性表。
六、Entry
Entry是Map中用來保存一個鍵值對的,而Map實際上就是多個Entry的集合,Entry是Map實現類的內部類。
Entry是為了輸出的方便,一般情況下,要輸出Map中的key 和 value 是先得到key的集合,然后再迭代(循環)由每個key得到每個value,而Entry可以一次性獲得這兩個值
其中的主要方法有:
代碼部分:
1 public class Test { 2 public static void main(String[] args){ 3 Map<String,Integer> map = new HashMap<>(); 4 map.put("小明",1); 5 map.put("小麗",2); 6 map.put("小張",3); 7 Set<Map.Entry<String,Integer>> entry = map.entrySet(); 8 Iterator<Map.Entry<String,Integer>> it = entry.iterator(); 9 while(it.hasNext()){ 10 Map.Entry<String,Integer> e= it.next();System.out.println("name:"+e.getKey()+";value:"+e.getValue()); 11 } 12 //獲取鍵值來獲取Value 13 Set<String> names = map.keySet(); 14 Iterator itName = names.iterator(); 15 while(itName.hasNext()){ 16 String v = (String) itName.next(); 17 System.out.println("name:"+v+";value:"+map.get(v)); 18 } 19 //直接獲取values值的集合 20 Collection<Integer> values = map.values(); 21 Iterator itValue = values.iterator(); 22 while(itValue.hasNext()){ 23 System.out.println(itValue.next()); 24 } 25 } 26 }
注意點:
entrySet和KeySet方法返回的都是一個Set的集合
values()返回的是一個Collection的集合
Iterator<Map.Entry<String,Integer>> it = entry.iterator();必須指定迭代器的泛型,不然會出現如下的提示
Incompatible types.
Required:java.util.Map.Entry<java.lang.String,java.lang.Integer>
Found:java.lang.Object>
這個情況可以使用強制類型轉換,不過最好還是在前面迭代器就定義好泛型。
?參考鏈接:http://kingdelee.iteye.com/blog/1580463
?
七、去除正則表達式中的空格
\s表示的是空格,那么可以這樣寫
1 public class Test<T> { 2 public static void main(String[] args){ 3 String regex = "\\s+"; 4 String str = " asd asd asdas asd asd sad "; 5 str = str.trim();//去掉開頭結尾空格 6 String str1 = str.replaceAll(regex," ");//將字符串中多個空格轉為一個空格 7 String str2 = str.replaceAll(regex,"");//將字符串中空格刪除 8 System.out.println(str1); 9 System.out.println(str2); 10 } 11 }八、優先隊列PriorityQueue
優先隊列是不同于先進先出隊列的另一種隊列。每次從隊列中取出的是具有最高優先權的元素。PriorityQueue是從JDK1.5開始提供的新的數據結構接口。
如果不提供Comparator的話,優先隊列中元素默認按自然順序排列,也就是數字默認是小的在隊列頭,字符串則按字典序排列。
如果想實現按照自己的意愿進行優先級排列的隊列的話,需要實現Comparator接口。
PriorityQueue有四種構造方法
今天主要嘗試了后兩種,第三種的代碼如下:
1 public class Test { 2 public static void main(String[] args){ 3 Queue<Fruit> queue = new PriorityQueue<>(new Fruit()); 4 queue.offer(new Fruit("小明",0)); 5 queue.offer(new Fruit("小美",3)); 6 queue.offer(new Fruit("小智",2)); 7 queue.offer(new Fruit("小麗",1)); 8 for (Fruit f:queue){ 9 System.out.println(f.getName()); 10 } 11 } 12 13 private static class Fruit implements Comparator<Fruit>{ 14 private String name; 15 private int priority; 16 public Fruit(){} 17 public Fruit(String name,int priority){ 18 this.name = name; 19 this.priority = priority; 20 } 21 22 23 public String getName() { 24 return name; 25 } 26 27 public int getPriority() { 28 return priority; 29 } 30 31 public int compare(Fruit o1, Fruit o2) { 32 int first = o1.getPriority(); 33 int last = o2.getPriority(); 34 if (first>last){ 35 return 1; 36 }else if (first==last){ 37 return 0; 38 }else { 39 return -1; 40 } 41 } 42 43 } 44 }第四種代碼是使用匿名內部類自定義一個比較器然后放到priorityQueue中:
1 Comparator<Fruit> comparator = new Comparator<Fruit>(){ 2 public int compare(Fruit o1, Fruit o2) { 3 int numbera = o1.getPopulation(); 4 int numberb = o2.getPopulation(); 5 if(numberb > numbera) 6 { 7 return 1; 8 } 9 else if(numberb<numbera) 10 { 11 return -1; 12 } 13 else 14 { 15 return 0; 16 } 17 } Queue<Fruit> priorityQueue = new PriorityQueue<Fruit>(11,comparator);參考鏈接:http://blog.csdn.net/hiphopmattshi/article/details/7334487
?九、關于Vector
1. Vector & ArrayList
2. Hashtable & HashMap
- Hashtable和HashMap它們的性能方面的比較類似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
代碼部分:
1 public class Test { 2 public static void main(String[] args){ 3 Vector vector = new Vector(); 4 long begin = System.currentTimeMillis(); 5 for (int i = 0;i<100000;i++) 6 vector.add(i); 7 System.out.println("Vector花費的時間"); 8 System.out.println(System.currentTimeMillis()-begin); 9 List list = new ArrayList(); 10 long lbegin = System.currentTimeMillis(); 11 for (int i = 0;i<100000;i++) 12 list.add(i); 13 System.out.println("ArrayList花費的時間"); 14 System.out.println(System.currentTimeMillis()-lbegin); 15 } 16 }?
轉載于:https://www.cnblogs.com/shigeng/p/8537881.html
總結
以上是生活随笔為你收集整理的基础知识巩固四(问题部分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVa 208 - Firetruck
- 下一篇: 项目开发的注意