Java 基礎 -- 泛型、集合、IO、反射

来源:http://www.cnblogs.com/bgzyy/archive/2017/10/30/7752095.html
-Advertisement-
Play Games

1. 對於泛型類而言,你若沒有指明其類型,預設為Object; 2. 在繼承泛型類以及介面的時候可以指明泛型的類型,也可以不指明; 3. 泛型也資料庫中的應用: 寫一個 DAO 類對資料庫中的數據進行增刪改查其類型聲明為 <T> 。每張表對應一個類,對應每一張表實現一個類繼承該 DAO 類並指明 D ...


計劃把 Java 基礎的有些部分再次看一遍,鞏固一下,下麵以及以後就會分享自己再次學習的一點筆記!不是有關標題的所有知識點,只是自己覺得模糊的一些知識點。

1.  對於泛型類而言,你若沒有指明其類型,預設為Object;

2.  在繼承泛型類以及介面的時候可以指明泛型的類型,也可以不指明;

3.   泛型也資料庫中的應用:

      寫一個 DAO 類對資料庫中的數據進行增刪改查其類型聲明為 <T> 。每張表對應一個類,對應每一張表實現一個類繼承該 DAO 類並指明 DAO 泛型為該數據表對應的類,再實現一個與該表匹配的 DAO 操作類,這樣就不必在每一個數據表的操作實現類中去實現增刪改查的基本方法。例如(實際應用中大概就是這思想,下麵的舉例並不完整):

 1 //數據表對應的類
 2 public class Customer{
 3     private int id;
 4     private String name;
 5     ...
 6 }
 7 
 8 //所有數據表的操作類都要實現的 DAO 基類
 9 public class DAO<T> {
10     //
11     public void add(T t) {
12 13 14 }
15 
16 public T get(int index) {
17     //
18     return null;
19 }
20 
21 public void delete() {
22     //
23 24 }
25 
26 public List<T> getForList(int index) {
27     //
28     return null;
29 }
30 
31 //數據表操作對應的實現類
32 public class CustomerDao extends DAO<Customer> {
33                 
34 }
35 
36 //測試類
37 public class Test {
38     public static void mian(String[] args) {
39     CustomerDao cus = new CustomerDao;
40     Cus.add(new Customer);
41     }
42 }
View Code

 

4.   靜態方法中不可以使用泛型(static)

      因為static 聲明的方法或者類以及變數都是在類初始化的時候初始化,而泛型是在運行的時候才回去初始化的,所以就出現了問題(後出現的調用了先出現的)。

public T t;
    //Error
    public static void show() {
        System.out.println(t);
}
View Code

 

5.  通配符

      可以讀取聲明為通配符的集合,但不可往裡寫入元素(讀的時候可以把元素都認為是 Object,但寫的時候其聲明為 ?,不是 Object,也就是說寫什麼類型都是錯的,但可以存 null),例如

Public void testList() {
    List<String> strList = new ArrayList<>();
    strList.add(“Hello”);
    strList.add(“World”);

    //correct
    List<?> list = strList;
    
    //error
    list.add(“hi”);
    list.add(123);
    //correct
    list.add(null);
}
View Code

 

6.  集合Map 的遍歷

package com.java.map.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class MapEntry {

    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "a");
        map.put(2, "b");
        map.put(3, "c");
        map.put(4, "d");
        map.put(5, "e");
        // 得到 map 所有鍵的集合
        Set<Integer> keys = map.keySet();

        for (Integer key : map.keySet()) {
            System.out.println(map.get(key));
        }

        // 利用迭代器 遍歷
        Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();

        while (it.hasNext()) {
            Map.Entry<Integer, String> entry = it.next();
            System.out.println(entry.getKey() + " -> " + entry.getValue());
        }

        // 第三種
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            System.out.println(entry.getValue());
        }

        // 遍歷所有的 value 值
        Collection<String> values = map.values();

        for (String val : values) {
            System.out.println(val + ">>-");
        }

        Iterator<String> i = values.iterator();
        while (i.hasNext()) {
            System.out.println(i.next() + "-->");
        }

        List<String> lists = new ArrayList<>();
        lists.add("1");
        lists.add("2");
        lists.add("3");
        lists.add("4");

        Iterator<String> it2 = lists.iterator();

        while (it2.hasNext()) {
            System.out.println(it2.next());
        }
        
        Collections.reverse(lists);
        Iterator<String> it3 = lists.iterator();
//        Comparator comparator = new 
        
        
        while (it3.hasNext()) {
            System.out.println(it3.next() + "<->");
        }
    }
}
View Code

 

7.  利用反射獲取方法名和屬性名,利用反射還可以獲取構造器等其他信息

package com.java.reflct.test;

//實體類
public class Person {

    private String id;
    
    private String name;
    
    public int phone;
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getId() {
        return id;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setPhone(int phone) {
        this.phone = phone;
    }
    
    public int getPhone() {
        return phone;
    }
    
    private void print() {
        System.out.println("your id is " + id + ", your name is " + name + ", your phone is " + phone + "!");
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", phone=" + phone + "]";
    }
}

package com.java.reflct.test;
//測試類

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestReflect {

    public static void main(String[] args) {
        try {
//            通過 Class.forName("全類名"); 獲取 Class,還以利用  對象名.getClass()  類名.class(); 獲取Class
            Class cla = Class.forName("com.java.reflct.test.Person");
            Class cla2 = Person.class;
            
//            獲取所有的 變數,返回數組,包括私有變數
            Field[] fields = cla2.getDeclaredFields();
//            遍歷變數數組
            for (Field fie : fields) {
                System.out.println(fie+"-..-");
            }
            
//            獲取所有的方法,返回數組,包括私有方法
            Method[] methods = cla.getDeclaredMethods();
            
            for (Method met : methods) {
                System.out.println(met);
            }
            
            try {
//                獲取單個私有屬性
                Field field = cla.getDeclaredField("id");
//                打破封裝
                field.setAccessible(true);
                System.out.println(field + "<<>>");
            } catch (NoSuchFieldException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            Method method = null;
            
            try {
//                獲取單個私有方法
                method = cla.getDeclaredMethod("print");
//                打破封裝
                method.setAccessible(true);
                System.out.println(method + ">><<");
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            try {
//                通過cla.newInstance(); 獲取類的對象
                Person person = (Person) cla.newInstance();
                person.setId("1");
                person.setName("yinyin");
                person.setPhone(110);
                
                System.out.println(person + "__>>__");
                try {
//                    執行 person 對象的中 method 所對應的方法
                    method.invoke(person);
                } catch (IllegalArgumentException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (InstantiationException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IllegalAccessException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            
            
        } catch(ClassNotFoundException e) {
            System.out.println("There is no class " + e);
        }
    }
}
View Code

 

8.  Comparator  類的使用(利用  Comparator  實現集合的自定義排序)

      註意區分 Collections (集合的處理類)和 Collection (集合基類)

package com.java.collection.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

/*
 * Collections 是 Collection 的操作類
 */

public class CollectionComparator {
    
    public static void main(String[] args) {
        
        Comparator<Customer> com = new Comparator<Customer>(){

            @Override
            public int compare(Customer o1, Customer o2) {
//                將 id 的比較值放入參數中,使得 id 相等時有其他的處理方法
                int i = o1.getId().compareTo(o2.getId());
                
//                當 Id 相等的時候比較名字的順序
                if (i == 0) {
//                    給 return 添加一個 - 號可以實現 “從大到小”
                    return o1.getName().compareTo(o2.getName());
                }
//                                    Id 不相等時返回其值        
                                   return i;
            }
        };
        
        List<Customer> lists = new ArrayList<>();
        lists.add(new Customer("yinyin", "110", 1001));
        lists.add(new Customer("zhao", "10086", 1002));
        lists.add(new Customer("ls", "10010", 1001));;
        
        Collections.sort(lists, com);
        
//        利用匿名類實現自定義排序
        /*
        Collections.sort(lists, new Comparator<Customer>(){

            @Override
            public int compare(Customer o1, Customer o2) {
//                將 id 的比較值放入參數中,避免 id 相等沒有其值
                int i = o1.getId().compareTo(o2.getId());
                
//                當 Id 相等的時候比較名字的順序
                if (i == 0) {
                    return o1.getName().compareTo(o2.getName());
                }
                return i;
            }
        });
        */
 //利用迭代器遍歷集合
        Iterator<Customer> it = lists.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
        
    }
}
View Code

 

9.  IO

      讀取目標文本文件的位元組數

package com.java.io.file.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class MyIoTest {

    public static void main(String[] args) {
        
//        在 IO 中出現的異常最好都使用 try-catch 包裹起來,不要 throw,因為這樣可以保證流的關閉在任何時候都可以正常執行
        InputStream fileStream = null;
        int count = 0;
        try {
            fileStream = new FileInputStream(new File("hello.txt"));
//            讀取文件的下一個位元組
            while (fileStream.read() != -1) {
                count++;
            }
//            列印目標文件的位元組數
            System.out.println(count);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fileStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
View Code

 

      實現文件的複製(InputStream 、OutputStream 和 Reader 、Writer)。文本文件的操作使用 Reader Writer(字元流) 去實現,效率高。但是不可以去操作媒體文件;媒體文件使用 InputStream OutputStream 去實現,也可以對文本文件進行操作,但是沒有字元流高效。

package com.java.io.file.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyFile {

    public static void main(String[] args) {
//        設置一次從目標文件中讀取多少位元組
        byte[] buffer = new byte[1024];

        int len = 0;
        File file = new File("C:/Users/lenovo/Desktop/123.wmv");
        InputStream fileInput = null;
        OutputStream fileOut = null;

        try {
            fileInput = new FileInputStream(file);
            fileOut = new FileOutputStream(new File("C:/Users/lenovo/Desktop/trave2.wmv"));

//            len 的作用是防止讀取文件時最後一次其長度不夠讀取被置為零,read() 返回讀入緩衝區的位元組總數
            while ((len = fileInput.read(buffer)) != -1) {
                fileOut.write(buffer, 0, len);
            }
            System.out.println("SUCC");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fileOut.close();
                fileInput.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}





//利用 Reader Writer 實現
package com.java.io.file.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class ReaderWriter {

    public static void main(String[] args) {
        File file = new File("hello.txt");
        int len = 0;
        Reader fileReader = null;
        Writer fileWriter = null;
        char[] ch = new char[125];
        
        try {
            fileReader = new FileReader(file);
            fileWriter = new FileWriter(new File("world.txt"));
            
            while((len = fileReader.read(ch)) != -1) {
                fileWriter.write(ch, 0, len);
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                fileWriter.close();
                fileReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
View Code

 

10.  利用緩衝流實現文件的複製操作,效率更高

package com.java.io.file.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TestBufferedCopy {
// 使用緩衝流實現文件的複製
    public static void main(String[] args)  {
        
        int len = 0;
        byte[] buffer = new byte[2048];
        
        File file = new File("C:/Users/lenovo/Desktop/123.rmvb");
        InputStream inputFile = null;
        OutputStream outputFile = null;

        BufferedInputStream bufferedInput = null;
        BufferedOutputStream bufferedOutput = null;
        
        try {
            inputFile = new FileInputStream(file);
            outputFile = new FileOutputStream("C:/Users/lenovo/Desktop/456.rmvb");
            
            bufferedInput = new BufferedInputStream(inputFile);
            bufferedOutput = new BufferedOutputStream(outputFile);
            
            while((len = bufferedInput.read(buffer)) != -1) {
                bufferedOutput.write(buffer, 0, len);
            }
            
            System.out.println("SUCC");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
//                只需關閉複製文件用到的就可以,即最後兩個
                bufferedOutput.close();
                bufferedInput.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
View Code

 

上面的代碼總結啥的都是自己平常練習過程中的代碼和心得,對於知識點講解覆蓋的並不全面,還望諒解。初來乍到不知道該如何去寫!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有了SpringMVC和Mabatis的整合後,一個初步WEB框架就形成了,但是完整的SSM框架還需要Spring的支持! 目前為止,我們所添加的配置文件有核心配置文件web.xml,springmvc的配置文件spring-servlet.xml以及Mabatis的配置文件mybatis-conf ...
  • 前言 今天在掘金看到一篇關於講解的Spring框架的文章,文章提到了牛客網的面試題。於是乎我就下載了牛客網app,發現面試題目很豐富。我就挑了java方面的面試題做了一下。10個題目為一組面試題,做完後,我發現了自己錯了好多,大多數都是基礎題。俗話說:基礎的深度決定未來的高度。我感覺自己必須要做一個 ...
  • 公司自己塔建的半自動化代碼生成項目 用法: 把csv文件放到src/resources/csv下,運行GenMain.java,生成的代碼在target/output下。 對GenMain.java進行適當的修改,可以控制生成的代碼有哪些,Pojo,Dao,Srv,ISrv,Action,PageJ ...
  • yii2在使用的時候,訪問控制器的時候,如果控制器的名稱是駝峰命名法,那訪問的url中要改成橫線的形式。例如: 最近在做某渠道的直連的時候,他們提供的文檔上明確指出介面的形式: 剛開始以為YII2中肯定有這樣的設置,然後就去google了下,發現都說不行,自己去看了下,果然,框架裡面直接是寫死的:( ...
  • 主頁面代碼 處理頁面代碼 ...
  • 1、實現介面的抽象類——適配器 即用了介面,又用了抽象類,關鍵是Window win=new MyWindow(); MyWindow子類並沒有直接實現Window介面,而是通過中間的抽象類建立了橋梁 2、代理公司的方法——功能更強大的包裝類 自己要錢的能力太弱小,通過強大的代理來完成要錢,包裝類 ...
  • 本節內容 - C參數複製,返回值 - Go參數複製,返回值 - 優化模式對參數傳遞的影響 ...
  • Social Net ZOJ - 3649 題意: 反正原題題意我是看不懂... 參考:http://www.cnblogs.com/names-yc/p/4922867.html 給出一幅圖,求最大生成樹,輸出邊權之和,併在這棵樹上進行查詢操作:給出兩個結點編號x和y,求從x到y的路徑上,由每個結 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...