日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基础知识巩固四(问题部分)

發布時間:2024/6/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础知识巩固四(问题部分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、關于java多態

多態的存在有三個前提:

  • 要有繼承關系
  • 子類要重寫父類的方法
  • 父類引用指向子類對,
  • 二、觀察Set中的add源碼(擴容)

    調試了一下,發現set底層接觸到了hashmap,hashmap的擴容方法resize(),每次擴容,都是原來大小的兩倍,里頭具體的代碼沒去深究,知道有這么個事兒。

    定義初始容量大小(table數組的大小,缺省值為16),定義負載因子(缺省值為0.75)的形式

    ?

    三、for-each循環set

    集合類可以用for-each形式輸出整個集合,也可以用Iterator.

    for-each注意點:

  • 要使用for-each語法,必須是數組,或者該類必須實現Iterable接口才可以
  • foreach循環的內部實現也是依靠Iterator進行實現的
  • for(T t : Iterable) { .... }

    如果查看編譯后的字節碼,會發現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可以一次性獲得這兩個值

    其中的主要方法有:

  • entrySet():返回一個包含圖中條目的規則集,也就是獲得了Map所有的Key與value的集合。Set<Map.Entry<K,V>>
  • keySet():返回包含圖中鍵值的一個規則集,也就是獲得key的集合。Set<K>
  • values():返回包含圖中值的集合。Collection<V>
  • 代碼部分:

    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有四種構造方法

  • 無參數構造方法PriorityQueue():創建一個初始容量為11的默認優先隊列
  • PriorityQueue(initialCapacity:int):創建一個帶指定容量的默認優先隊列
  • PriorityQueue(c:Collection<? extends E>):創建一個帶指定集合的優先隊列
  • PriorityQueue(initialCapacity:int,comparator:Comparator<? super E>):創建一個帶指定初始容量和比較器的優先隊列
  • 今天主要嘗試了后兩種,第三種的代碼如下:

    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

  • Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由于線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。
  • 當Vector或ArrayList中的元素超過它的初始大小時,Vector會將它的容量翻倍,而ArrayList只增加50%的大小,這樣,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

    總結

    以上是生活随笔為你收集整理的基础知识巩固四(问题部分)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。