前言
? ? ? ? 多年以前自學Java,在本地做了一些筆記。最近幾年流行播客,一方面防止丟失,一方面可以幫助其他小伙伴學習。所以,一直也想寫一些屬于自己的東西,但總是在忙抽不出時間。最近難得的清閑,就把之前本地的筆記給總結到線上來。本Java基礎筆記適合初學者來學習,剛入門者可以把此作為工具書來用。
? ? ? ? 接著上文來寫接下來。
Java基礎筆記匯總----略微進階
-------------------------------------------集合-------------------------------------
26.集合的繼承關系
Collection 接口
|
|
|
|----------List接口(有序的? 可重復的)
|? ? ? ? ? ? |
|? ? ? ? ? ? |------ArrayList類? 底層是數組
|? ? ? ? ? ? |
|? ? ? ? ? ? |------LinkedList類? ? 底層是雙向鏈表
|
|---------Set接口(無序的(存取順序無序)? 不可重復的)
|
|
|-----HashSet類? 可以通過元素的hashCode和equals來完成保證元素唯一性
|
|
|------TreeSet類
27.Collection 和 Collections的區別:(面試題)
(1)Collection是集合的工具類,直接實現類有List和Set
主要方法:add(Object) remove(Object) removeAll(另一個集合)
clear()? contains(Object)? idEmpty()? seze()
集合獨有的代碼方法:
<1>每個集合都可調用Collection的Iterator()方法獲取迭代器(Interator接口的實例)
<2>Interator中的hasNext() 判斷下一個元素是否有元素? 可作為循環的條件
<3>Interator中的next() 返回光標的下一個位置的元素,并且光標向下移動一位
<4>remove()移除光標指向的元素(★)
(2)Collections是一個集合的工具類,可以對集合排序,查找等(參考API)
29.List的總結
(1)元素的存儲是有序的,元素可以重復.因為該集合有索引
(2)List的孩子有ArrayList? LinkedList? Vector
(3)凡是可操作角標的方法都是該體系特有的方法
增:add(index) addAll(index) 刪:remove(index) 改:set(index)
查:get(index) subList(from,to)//獲取部分對象的元素
(4)ListIterator是List集合特有的迭代器,是Iterator的子接口
Interator迭代時只能用迭代器的方法操作集合,但其方法是有限的
因此有了ListInterator,此迭代器迭代式是用集合中的方法操作集合的
ListInterator特有的方法
add()
set()
hasPravious()//判斷前面有沒有元素
previous()//取前一個元素
28.ArrayList與LinkedList的區別:(面試)
(1)ArrayList 底層是數組,在指定位置增加,刪除元素效率低
隨機訪問效率高(用下標訪問)
(2)LinkedList 底層是雙向鏈表,在指定位置增減或者刪除效率高
隨機訪問效率低(用下標訪問每次都是從頭查找)
LinkedList中有一系列xxxFirst()方法,從而可以模擬堆棧,隊列等
(3)二者都是List的孩子
29.ArrayList和Vector的區別:(面試)
(1)ArrayList? 線程不安全? 效率高
(2)Vector是舊版的ArrayList,線程安全,效率低不適用,一般
30.Set總結
(1)Set散列存儲: 元素是無序的(存取順序不一致) 元素不可重復
(2)Set有兩個孩子HashSet和TreeSet
(3)Set的功能和其父類Collection是一致的
31.HastSet總結
(1)散列存儲
(2)通過元素的hashCode和equals來完成保證元素唯一性
先判斷hashCode(),如果hashCode相同,則進一步判斷equals.如果hashCode不同,,直接存儲(★)
(3)因此存入對象必須重寫hashCode()和equals方法
32.TreeSet總結?
?(1)可以對Set集合中的元素進行排序,默認按照字母的自然順序排序,底層是二叉樹,保證元素的唯一性的依據是compareTo方法return 0;?
?(2)TreeSet類實現了Comparable接口,該接口強制讓增加到集合中的對象進行了比較,? ? 需要復寫compareTo方法,才能讓對象按指定需求(如人的年齡大小比較等)? ? 進行排序,并加入集合。?
?(3)第一種方式:傳入數據自帶比較方法(★)? ??
該對象需要實Compareable(T t)接口,并重寫compareTo(T t);方法? ??
?public int compareTo(School school) {
? ? ? ? ? ? if (this.school_id != school.school_id) {?
? ? ? ? ? ? ? ? ? ?return school.school_id - this.school_id;
? ? ? ? ? ?}else if (!this.school_name.equals(school.school_name)) {
? ? ? ? ? ? ? ? ? CollationKey key1 = Collator.getInstance().getCollationKey(this.school_name);
? ? ? ? ? ? ? ? ? CollationKey key2 = Collator.getInstance().getCollationKey(school.school_name);
? ? ? ? ? ? ? ? ? ?return key1.compareTo(key2);
? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?return 0;
? }?
?(4)第二種方法,實例化TreeSet時傳入一個比較器 TreeSetset = new TreeSet(比較器);(★)? ? 比較器有兩種方式:第一是 單獨自定義類實現Comparator接口 并實現compare(object o1,object o2)方法 ? ? ? ? ? ? ? ? ? ? ? ? ? 第二是 以匿名內部類的方式傳入TreeSet? ? new Comparator() {
@Override
public int compare(School s1, School s2) {
? ? ? ? ? if (s1.getSchool_id() != s2.getSchool_id()) {
? ? ? ? ? ? ? ? ? ?return s2.getSchool_id() - s1.getSchool_id();
? ? ? ? ? } else if (!s1.getSchool_name().equals(s2.getSchool_name())) {
? ? ? ? ? ? ? ? ? CollationKey key1 = Collator.getInstance().getCollationKey(s1.getSchool_name());
? ? ? ? ? ? ? ? ? CollationKey key2 = Collator.getInstance().getCollationKey(s2.getSchool_name());
? ? ? ? ? ? ? ? ?return key1.compareTo(key2);
? ? ? ? ?}
? ? ? ? ? return 0;
? }
? });
33.集合與數組的互相轉換??
(1)集合轉數組,用Collection接口中的toArray方法? ?
?<1>轉為Object的數組 : object[] o = list.toArray();? ?
?<2>轉為指定類型的數組 : T t = list .toArray(t);??
(2)數組轉為集合,用Arrays工具類中的asList()方法? ? ?
? ? ? ? ? ? ? String data[] = {"aa","bb"};? ? ??
? ? ? ? ? ? ? Listlist = Arrays.asList(data);
34.CollationKey與Collator的使用:
(1)功能比較漢字比較精確(比String.compareTo()方法精確)
(2)CollationKey key1 = Collator.getInstance().getCollationKey(string1);
CollationKey key2 = Collator.getInstance().getCollationKey(string2);
key1.compareTo(key2);
35.Map的特點:?
?(1)鍵值對,key不允許重復,value可以重復,運行時最多有一個null鍵,可以有無數個null值?
?(2)Map的Key底層是set,? ? HashMap的key的底層是HashSet? ? ? TreeMap的key的底層是TreeSet? ? 由此延伸到 HashMap與TreeMap的比較和排序方法.??
(3)的常用方法:? ? ? ? ? ? ??
?增:put(key,value);? ? ??
?刪:clear()? remove(key)? ? ??
?改,put(key,value);更新key相同的鍵值對? ? ??
?查:keySet()//返回key組成的set集合? 常用于遍歷map(★)? ? ? ? ??
values()//返回所有值組成的Collection集合?
?get(key)//根據鍵拿值?
?entrySet()//返回此映射中包含的映射關系的 Set 視圖。? ? ?
?判斷:ContainsKey(key)? ? ? ? ? ? ContainsValue(value)? ? isEmpty()??
(4)Map的三個子類對比? ??
<1>HashMap:底層是哈希表數據結構。允許使用null鍵null值,該集合是不同步的。JDK1.2,效率高。? ?
?<2>HashTable:底層是哈希表數據結構,不可以存入null鍵null值。該集合是線程同步的。JDK1.0,效率低。一般不用? ??
<3>TreeMap:底層是二叉樹數據結構。線程不同步。可以用于給Map集合中的鍵進行排序。? (5)Map.Entry? ??
?<1>Map.Entry是Map的靜態內部類? ??
?<2>Map.Entry是Map中鍵值對的對象.? ??
?<3>用法:(用于Map的遍歷)? ??
?MapMap=new HashMap();??
?Set> set=map.entrySet();??
?for(Map.Entry> entry:set){
? ? ?sysout(entry.getkey()+"? " +entry.getValue();
}
------------------------------------文件---------------------------------
36.File類的常用方法
(1)new File(String)? new File(uri) //給定地址創建File對象
(2)createNewFile();? ? //創建文件,前提是目錄存在
(3)mkdir()? makdirs()? //創建一層文件夾和創建多長文件夾
(4)exists? ? ? ? ? ? ? //判斷文件或文件夾是否存在
(5)isFile()? ? ? ? ? ? //判斷是否是文件
isDirectory()? ? ? //判斷是否是文件夾
(6)renameTo(File file) //重命名絕對路徑(也可以說是移動/剪切文件)
(7)length()? ? ? ? ? ? //返回文件的大小
(8)getAbsolutePath()? //返回文件的絕對路徑
(9)delete()? ? ? ? ? ? //刪除文件或者空文件夾(自動判斷是否為空)
(10)String[] list()? ? //返回當前目錄下的文件及文件夾的絕對路徑
(11)String[] list(FilenameFilter filter)? //返回過濾器過濾后的文件或者文件夾
(12)File[] listfiles() //與上雷同
(13)File[] listFiles(FilenameFileter filter);
37.流的分類:
(1)按流的流向分:? 輸入流和輸出流
(2)按處理的數據單位:? 字節流和字符流
(3)按功能層次:? 節點流和處理流
節點流:直接能處理數據源的流
處理流:不直接操作數據源,而是在已知的流的基礎上進行功能擴展的流
----------------------------------流-----------------------------------------------
38.流的分類:
(1)按流的流向分:? 輸入流和輸出流
(2)按處理的數據單位:? 字節流和字符流
(3)按功能層次:? 節點流和處理流
節點流:直接能處理數據源的流
處理流:不直接操作數據源,而是在已知的流的基礎上進行功能擴展的流
39.InputStream 字節輸入流? 抽象類 不能實例化
(1)read() 每次讀取一個字節,返回讀到的真實數據
(2)read(byte []b)? 每次讀取最多b.length個字節,返回的是實際讀取的字節數
FileInputStream in = newFileInputStream("路徑");
byte[] b = new byte[1024];
int len= 0;
while((len=in.read(b))!=-1){
syso(new String(b,0,len));//每次從文件中最多讀取1024字節存入b數組中,
//下次讀取后存入b數組,覆蓋之前的數據
//當最后一次讀取的數據不夠1024時,存入數組只能覆蓋前面的一部分數據,后面的仍然存才
//此時參數Len就體現了價值.
}
(3)read(byte[] b,0,len);返回的是實際讀取的字節數
(4)常用子類
ByteArrayInputStream? 內存字節輸入流
FileInputStream? ? ? 文件字節輸入流
ObjectInputStream? ? 對象字節輸入流
40.OutputStream? 字節輸出流? 抽象類? 不能實例化
(1)write(int a)? 寫入一個字節
(2)write(byte b[])每次寫入b.length個字節
(3)write(byte b[],int off,int len) 每次寫入Len個字節
(4)常用子類
ByteArrayOutputStream? 內存字節輸出流
FileOutputStream? ? ? 文件字節輸出流
ObjectOutPutStream? ? 對象字節輸出流
41.Reader? 字符輸入流? 抽象類? 不能實例化
(1)read() 類似于上面? 不同的是 以字符為單位
(2)read(char []b)
(3)read(byte[] b,0.len);
(4)常用子類
BufferedReader? ? 字符輸入處理流
StringReader? ? ? 字符串輸入處理流
InputStreamRead? 轉換流
42.Writer? 字符輸出流? 抽象類? 不能實例化
(1)write(int data);
(2)write(char ch[]);
(3)write(char ch[],0,len);
(4)write(String str);//可以直接輸出字符串
(5)write(String str,int off,int len);
(6)常用子類
BufferedWriter? 字符輸出處理流
StringWriter? ? 字符串輸出處理流
OutputStreamWriter轉換流
43.內存流? ByteArrayOutputStream
ByteArrayInputStream
(1)比字節流和字符流直接操作數據源效率高
44.字節緩沖流? BufferedInputStream
BufferedOutputStream
(1)包裹在字節流外面使用? 以提高效率
45.字符緩沖流? BufferedReader
BufferedWriter
(1)包裹在字符流外面使用 以提高效率
(2)readLine()和WriterLine()是這兩個方法特有的? 可以一次讀寫整行
46.轉化流
(1)InputStreamReader? 字節流--->字符流
以字節流從文件中讀取數據,通過轉化流轉化為字符流輸入程序
(2)OutputStreamWriter? 字符流--->字節流
47.打印流? ? 只能寫,不能讀
(1)PrintStream? 能夠自動刷新緩沖區數組
(2)常用方法:print() println() printf() format()
(3)PrintStream ps = new PrintStream(OutputStream out,booleam autoFlush);設置是否自動刷新
(4)PrintsWriter同上
48.重定向流?
System.setOut(PrintStream ps);把控制臺輸出語句重定向到PrintStream指定的文件
注意:必須和ParintStream(打印流)一起用
49.對象流
(1)ObjectOutputStream? 把一個基本數據類型或者對象保存到某個文件的過程叫做序列化
(2)ObjectInputStream? 把某個文件中的二進制數據重新構造成對象或者基本數據類型的過程稱為反序列化
50.隨機訪問文件流 RandomAccessFile? 即能讀又能寫(★不熟)
(1)可以隨機讀取,或者寫入
(2)直接繼承Object類
(3)android應用 多線程下載,
(4)有文件指針,并且可以設置(seek())
(5)獲得文件指針:getFilePointer()
---------------------------------------多線程-------------------------------
51.創建和啟動多線程的方式(★)
(1)實現Runnable接口
<1>實現Runnable接口,實現run()方法
<2>創建線程對象? MyRunnable runnable = new MyRunnable()
<3>創建Thread對象,接收一個線程對象. Thread thread = new Thread(runnable)
<4>thread.start()啟動線程
(2)繼承Thread類
<1>繼承Thread
<2>重寫run()方法
<3>創建線程對象 MyThread myThread=new MyThread();
<4>啟動新線程 myThread.start();
52.兩種開啟多線程的比較
(1)實現Runnable接口
<1>由于是實現接口,所以還可以繼承和實現其他接口
<2>可以共享數據
(2)繼承Thread類
<1>由于是繼承,所以不能再繼承其他的類
<2>不能共享數據
53.線程中常用的方法
(1)static Thread? currentThread();//獲取當前正在運行的線程對象
(2)getName()
(3)setName()
(4)isAlive() 判斷線程是否處于活躍狀態
(5)getPrority() 獲取線程的優先級 ,取值范圍是1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )
(6)setPrority() 設置線程的優先級
(7)interrupt()? 阻斷線程的sleep() join() wait()狀態,使線程進入可執行狀態
能夠改變interrupted的狀態, false-->true(擦出狀態)--->false
54.線程調度
(1)static sleep(long millis) 使當前線程處于休眠狀態
(2)join()合并兩個線程A線程調用B線程的join() 則A線程阻塞,等待B線程執行完再執行
相當于方法調用.
(3)static yeild() 讓出CPU,給同優先級或者更高優先級的線程先運行,如果CPU空閑則轉為就緒狀態(就讓一下時間很短暫)
56.線程的狀態轉換(生命周期)
57.線程同步? (個人理解:數據同步)
(1)按照順序訪問某個共享資源
(2)優點:數據安全
(3)缺點:效率低
58.線程異步:
(1)多個線程可同時操作資源
(2)缺點:數據不安全
(3)優點:效率高
59實現線程同步的兩種方法
(1)同步方法? 用synchronized關鍵字修飾的方法叫同步方法
(2)同步代碼塊
<1>用synchronized(){}包裹的代碼塊叫同步代碼塊
<2>synchronized(){}的()內傳入的數據被上鎖,稱為監聽對象
<3>synchronized(){}的()內可傳入this,對象,字符串
60.守護線程(★不熟)
(1)A線程中啟動B線程(B為守護線程),則當A線程結束時,B線程也隨之結束
(2)用setDaemon(true)設置守護線程
(3)設置守護線程必須在啟動前
(4)守護線程的作業:程序收尾,關閉資源
61.線程間的通信
(1)Object提供了三個用于線程通信的方法
(2)wait()讓線程處于等待狀態
(3)notify()喚醒任意一個正在等待的線程
(4)notifyAll() 喚醒所有正在等待狀態的線程
(5)用于生產者消費者模式
62.生產者消費者模式
(1)共享數據的不一致性/臨界資源的保護
(2)描述:
<1>有一定大小的容器類用于存儲產品,并提供生產方法和消費方法
生產方法:控制生產者在(庫存<容量)時生產(notify()),否則休眠(wait())
消費方法:控制消費者在(庫存>0)時消費(notify()),否則休眠(wait())
<2>生產者線程類,調用容器的生產方法
<3>消費者線程類,調用容器的消費方法
(3)容器類的關鍵代碼:
int? count=100;
public synchronized void sell() {
? ? ?if (count > 0 && count <= 100) {
? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ?notifyAll();
? ? ? ? ? ? ? ? ? ?Thread.sleep(1000);
? ? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ?System.out.println(Thread.currentThread().getName() + "出售了第"
? ? ? ? ? ?+ count + "張車票");
? ? ? ? ? ?count--;
? ? ?} else {
? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "票已賣完");
? ? ? ? ? ? ? ? ? ? ? wait();
? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? }
? ? ?}
?}
public synchronized void returnT() {
? ? ? ? ? ?if (count < 100) {
? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? notifyAll();
? ? ? ? ? ? ? ? ? ? ? ?Thread.sleep(1000);
? ? ? ? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ?// TODO Auto-generated catch block
? ? ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? count++;
? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + "退回了第"
? ? ? ? ? ? ? ? + count + "張車票");
? ? ? ? ? ?} else {
? ? ? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ? ? ?System.out.println(Thread.currentThread().getName() + "票還沒有賣出");
? ? ? ? ? ? ? ? ? ? ? ? ?wait();
? ? ? ? ? ? ? ? ? ?} catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? ? ? // TODO Auto-generated catch block
? ? ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? ? ? ? }
? ? ? ? ? ?}
?}
------------------------------------------------TCP和UDP--------------------------------------------
63.基于TCP協議的網絡編程
(1)客戶端:
<1>創建Socket對象并指定IP地址和端口號(0-65535)
Socket socket = new Socket("10.9.152.168","8080");
<2>打開Socket相關的輸入輸出流
intputStream = socket.getinput();
outputStream = socket.getoutput();
<3>讀取操作
inputStream.read();
outputStream.write();
<4>關閉流? 關閉Socket
inputStream.close();
outputStream.close();
socket.close();
(2)服務端:
<1>創建ServerSocket對象,并指定監聽的端口
ServerSocket serverSocket? = new ServerSocket(8080);
<2>使用accept()方法監聽客戶端的連接,此方法一直阻塞,當有客戶端與其連接時返回Socket對象
Server socket = serverSocket.accept();
<3>打開Socket相關的輸入輸出流
inputStream = socket.getinput();
outputStream? = socket.getoutput();
<4>讀寫操作
inputStream.read();
outputStream.write();
<5>關閉流 關閉Socket
inputStream.close();
outputStream.close();
socket.close();
64.常見錯誤:
(1)java.net BindException:Address already in use? 端口占用
(2)java.net.ConnectException:Connection refused:connect 服務端沒有啟動
(3)socket isclosed;socket或者socket相關的流關閉,還調用Socket對象的方法
65.UDP傳輸的相關知識
(1)DatagramSocket? 此類表示用發送和接收數據包的套接字
其中void send(DatagramPacket p)方法用于接收數據包
void receive(DatagramPacket p)方法用于接收數據包
(2)DataGramPacket? 數據包 用來實現無連接包投遞服務
根據數據包的信息從一臺計算機到另一臺計算機中
一次次包中需要封裝一個地址(IntAddress)
(3)InetAddress? ? IP地址類其中與一些靜態方法用于f封裝IP對象
getByAllName(String host) 給定主機名獲取IP對象即(InetAddress實例)
getByAddress(byte[] addr) 給定原始IP獲取InetAddress對象
getByName(String host)在給定主機名的情況下獲取InetAddress對象
66.UDP傳輸的步驟:
發送端:
(1)用DatagramSocket創建UDP服務
DatagramSocket ds = new DatagramSocket();//可傳入端口號,也可不傳入
(2)封裝InetAddress對象
InetAddress address = InetAddress.getByName("192.168.1.3");
(3)準備要發送的數據,并封裝成數據包
byte[] buf = "字符串".getBytes();
DatagrmPacket dp = new DatagramPacket(buf,buf,length,address,8080);
(4)用DatagramSocket的send方法發送數據包
ds.send(dp);
ds.close();
服務端:
(1)用DatagramSocket創建UDP服務 并監聽端口
DatagramSocket ds= new DatagramSocket();//必須指定端口
(2)定義數據包用于存儲接收的數據包
byte[] buf=new byte[1024]//數組的大小是估計值
DatagramPacket dp = new DatagramPacket(buf,buf.length);
(3)通過DatagramSocket的receive的方法接收數據包并存入dp中
ds.receive(dp);
(4)通過DatagramPacket中的方法解析數據包
String data = new String(dp.getData(),0,dp.getLength);
(5)最后關閉資源
ds.close();
------------------------------------sqlite/sql-----------------------------------
67.sqlite3常用命令
(1)sqlite3 數據庫名稱(有則打開,無則創建)
.open? 數據庫名稱(有則打開,無則創建);
(2).database 顯示數據庫的列表
(3).table 或者.tables顯示當前數據庫中所有的表
68.常用SQL語句
(1)create table 表名(字段名? 數據類型,字段名 數據類型...);------創建表
(2)drop table? 表名? -------刪除該表
(2)insert? into? 表名 values(按字段順序的所有字段信息);
insert? into(要插入的字段) 表名? values(要查入的字段信息,跟前面的順序對應)----插入一條記錄
(3)select * from 表名;----查詢該表的所有信息
(4)select * from 表名 where? (控制條件)? ----按條件查找
(5)select * from 表名 where? like '%單詞%' ----模糊查找
%代表0個或多個字符
_代表一個字符
(6)select * from 表名 where id=2 and name="jack"? and表示與
select * from 表名 where id=1 or? name="jack"? or表示或
(7)聚合函數
select count(*) from 表名 ---查詢所有記錄的條數(即行數)
select max(字段) from 表名---查詢某個字段的最大值
select min(字段) from 表名---查詢某個字段的最小值
select avg(字段) from 表名---查詢某個字段的平均值
(8)排序查詢
select * form 表名 order by 字段? -----按照升序排序 (默認asc)
select * form 表名 order by 字段 desc------按照降序排序
(9)update 表名 set 字段=新值,字段=新值? where (條件)? ----修改指定條件的記錄的指定字段
(10)delete from 表名----刪除所有數據
(11)delete from 表名 where (條件) ----刪除指定數據
(12)住鍵:primary key
自增長:autoincrement? 該字段必須是Integer類型
用法舉例:crate table test(id integer primary key autoincrement,name string);
-----------------------------------反射-----------------------------------
69.反射
(1)類可以new出對象,但類本身也是一個對象
當類被加載后jvm會為這個類創建一個Class對象
(2)獲得類的class對象的三種方法:
<1>使用Class類的forName("類的權限定名")靜態方法(常用此方式降低耦合度)
例如:Class.forName("org.lang.String");? //加載類并返回該類的Class對象
<2>使用某個類的class屬性來獲得該類的Class對象
例如:Class clazz = Person.class
<3>調用對象的getClass()方法,該方法是Object中的一個方法
例如:Person person = new Person();
? ? ? ? Class clazz = person.getClass();
(3)獲得某個類的class對象后? 可以獲取該類中的各種信息,即使私有的也可以獲得? ?
?<1>獲取所有構造器? ? ? ??
Class中有一系列獲取類中構造器的方法? 返回一個Connstructor 例如:ConstructorgetConstructor(Class... parameterTypes) 根據指定參數類型列表返回指定的構造器? ? ? Constructor[] getConstructors() 返回所有公共構造器的數組? ? ? ConstructorgetDeclaredConstructor(Class... parameterTypes)//對應上面的該方法返回的是所有的? 包括私有的
Constructor[] getDeclaredConstructors()
Construction類有一系列獲得該構造方法信息的方法
并且有newInstance()方法來new出指定類的實例(重點)
<2>獲取指定類中的方法
Method getMethod(String name, Class... parameterTypes) //根據參數類型列表返回方法的對象
Method[] getMethods() //返回公共方法的數據
Method getDeclaredMethod(String name, Class... parameterTypes)
Method[] getDeclaredMethods()
Method類中有一系列方法來獲取指定類中方法的信息
<3>獲取指定類中的屬性
Field getDeclaredField(String name) //根據屬性名返回File對象
Field[] getDeclaredFields() //返回
Field getDeclaredField(String name)
Field[] getDeclaredFields()
Filed類有一系列方法 來獲取該屬性的信息
getName()? ? ? ? ? ? //返回此 Field 對象表示的字段的名稱。
get(Object object)
getXXX(Object object)? //返回指定對象上的該Field屬性的值
如果底層Field是靜態屬性,則忽略object參數
set(Object object)
setXxx(Object object, Xxx value)? //給指定對象上的該Field屬性賦值
如果底層Field是靜態屬性,則忽略object參數
setAccessible(boolean boolean)? //Field從AccessibleObject中繼承的方法,將此對象的 accessible 標志設置為指示的布爾值。
值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。
值為 false 則指示反射的對象應該實施 Java 語言訪問檢查。
簡單來說,set(Object object)之前必須將此方法設置為true
<4>獲取Class對象中的成員類(內部類)和成員接口(內部接口)
Class[] getClasses()? ? ? ? //返回一個包含某些 Class 對象的數組,
這些對象表示屬于此 Class 對象所表示的類的成員的所有公共類和接口。
Class[] getDeclaredClasses()? // 返回 Class 對象的一個數組,
這些對象反映聲明為此 Class 對象所表示的類的成員的所有類和接口。
-----------------------------------JDBC-----------------------------------
70.JDBC總結? 以sqlite為例(需要導第三方jar包)
通用步驟:
(1)加載數據庫驅動
Class.forName("org.sqlite.JDBC");? //固定格式
(2)獲得與指定數據庫的連接? 通過DriverManager類連接
Connection connection = DriverManager.getConnection("jdbc:sqlite://D://db//mydb.db");
(3)獲取SQL基本語句對象Statement
Statement statement = connection.creatStatement();
(4)調用Statement中的一系列方法來操作數據庫
ResultSet? resultSet = statement.executeQuery("select * from Student");
(5)關閉連接
connection.close();
(6)Statement類的介紹:用于執行靜態SQL語句并返回它所生成的對象
ResultSet executeQuery("")? //通常執行查詢語句? 返回結果集
int executeUpdate("")//通常執行更新語句 插入語句 和 刪除語句 或者不返回任何信息的SQL語句
返回行計數(即更新行數),什么都不返回的SQL語句返回0
(7)ResultSet類的介紹:表示數據庫結果集的數據表(即表的對象)(★不熟)
光標初始位置在第一行的前面
next()將光標從當前位置向前移動一行
------------------------------------HTTP----------------------------------
71.HTTP協議總結
(1)HTTP協議的概述
HTTP協議用于定義客戶端與web服務器通迅的格式。
HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議的一個應用層協議
HTTP使用請求-響應的方式進行傳輸,一個請求對應一個響應,并
且請求只能是由客戶端發起的。
HTTP協議的版本:HTTP/1.0、HTTP/1.1,其中1.0一次請求發起一次連接,響應過后連接自動斷開。1.1里每次請求
(2)HTTP協議請求的格式:
請求行(Request-Line)例如:GET/imagees/logo.gifHTTP/1.1,表示從/images目錄下請求logo,gif文件
請求頭? ? ? ? ? ? ? 例如:Accept_Language:e(很多請求頭);
空行? ? ? ? ? ? ? ? 必須的,服務通過這個空行來區別請求頭和請求體
請求體? ? ? ? ? ? ? 有時候也叫消息體,是可選的,GET請求時無請求體,Post請求有
實例:
REquest_Line:GET /books/java.html HTTP/1.1? //請求行? 請求方式請求資源名? 協議名
其中GET方式在請求資源的URL后跟“?參數名=參數值&參數名=。。。”方式傳遞參數,傳輸的數據內容最大為1K
其中POST方式在請求實體中傳輸數據
除了用Form表單明確用method指定用post方式提交數據以外,其他的方式都是GET提交方式
Accept:text/html,image/*告訴服務器客戶端可以接受的數據類型 */*表示什么類型都可以
Accept-Encoding:gzip,deflate 支持的壓縮格式.
Accept-Language:zh-cn 當前客戶端支持的語言
Connection:Keep-Alive 客戶端支持的鏈接方式,當請求完成后保持一段時間默認為3000ms
Cookie:JSESSIONID=AF6FB5136BCCfdkljfafj
Host:localhost:8080? 請求的地址和端口號
User-Agent:mazilla/4.0(fsajfsalkfjdsafsk)? 與瀏覽器和OS相關的信息。大家看到有些網站會顯示用戶的系統版本和瀏覽器版本信息,這都是通過獲取User-Agent頭信息而來的;
請求體:
(3)HTTP協議相應的格式:
HTTP/1.1 200 OK? //狀態行? HTTP版本號 狀態嗎 原因敘述
常見狀態碼:200:請求處理成功? 302請求重定向? 304 307服務器通知瀏覽器使用緩存
404 資源找不到
500 服務器端代碼錯誤
若干響應頭:
Location:http://www.it315.org/index.jsp 配合302實現請求重定向
Server:apache tomcat 服務器的基本信息
Conten-Encoding:gzip 服務器發送數據時使用的壓縮格式
Content-length:80 發送數據的大小
Content-Language:zh-cn 發送的數據使用的語言環境
Content-Type:text/html;charset=GB2312 當前所發送的數據的基本信息
Last-Modified:Tue,11 jul 2000? 緩存相關的頭
Refresh: 1;url=http://www.it315.org 通知瀏覽器進行定時刷新,此值可以是一個數字指定多長時間以后刷新當前頁面,這個數字之后也可以接一個分號后跟一個URL地址指定多長時間后刷新到哪個URL
Content-Disposition: attachment;filename=aaa.zip 與下載相關的頭
Transfer-Encoding: chunked 傳輸類型,如果是此值是一個chunked說明當前的數據是一塊一塊傳輸的
Set-Cookie:SS=Q0=5Lb_nQ; path=/search 和cookie相關的頭,后面課程單講
ETag: W/"83794-1208174400000" 和緩存機制相關的頭
Expires: -1 指定資源緩存的時間,如果取值為0或-1瀏覽就不緩存資源
Cache-Control: no-cache? 緩存相關的頭,如果為no-cache則通知瀏覽器不緩存
Pragma: no-cache? 緩存相關的頭,如果為no-cache則不緩存
以上三個頭都是用來控制緩存的,是因為歷史原因造成的,不同的瀏覽器認識不同的頭,我們通常三個一起使用保證通用性。
Connection: close/Keep-Alive? 是否保持連接
Date: Tue, 11 Jul 2000 18:23:51 GMT 當前時間
相應體
72.URL? 統一資源定位符 是指向互聯網"資源"的指針
由protocol(協議名稱) host(主機名) Port(主機端口號) File(主機上的文件) 構成
(1)常用的構造方法:? URL(String spec)
URL(String protocol,String host,int Port,String File)
(2)常用方法:一系列get方法? 獲得 協議名 主機名 端口號 文件名稱等
getprotocol() getHost() getPort() ......
openConnection()返回一個URlConnection對象 它表示到Url所引用的遠程對象的連接
HttpURLConnection方式請求網絡的主要步驟
73.HTTP請求網絡的兩種方式(GET? POST)
(1)GET:
<1>get主要是從服務器上獲取數據
<2>get請求參數能在地址欄顯示
<3>get傳送的數據量較小,不能大于2kb
<4>get安全性非常低,但效率高
(2)POST:
<1>Post主要是向服務器傳送數據
<2>POST是通過Http Post機制,將表單內各個字段與其內容放置在HTML內一起傳送到ACTION屬性所指的URL地址,地址欄不顯示
<3>Post傳送的數據較大
<4>Post安全性高,但效率低
74.HttpURLConnection請求網絡通用步驟:?
?android6(API 23)大量使用此方式請求網絡
API標準步驟:
(1)通過在 URL 上調用 openConnection 方法創建連接對象。
(2)處理設置參數和一般請求屬性。
(3)使用 connect 方法建立到遠程對象的實際連接。
(4)程對象變為可用。遠程對象的頭字段和內容變為可訪問。
(1)創建URL對象
URL url = new ("地址");//當GET請求時需要帶參數
(2)通過url上的openConnection方法創建HttpUrlConnection對象
HttpUrlConnection? httpUrlConnection = (HttpURlConnection)url.openConnection();
(3)設置請求參數
httpurlConnection.setRequestMethod("GET/POST");//GET/POST必須大寫
httpurlConnection.setDoinput(ture);//默認為true
(4)使用connect方法建立到遠程對象的實際連接 底層TCP連接
httpUrlConnection.connect();
(5)獲得響應碼,并判斷,響應嗎為200時請求成功
int code httpurlconnection.getResponseCode();
(6)獲取對象的輸入/輸出流,進行傳遞數據
InputStream? inputstream = httpurlconnection.getInputStream();
//Post請求時需要用輸出流? 必須調用httpUrlConnection.setDoOutput(true);(默認是false)
OutputStream outputStream = httpurlconnection.getOutputStream();
75.HttpClient請求網絡:android6之后需要導入jar包
(1)創建HttpClient對象? ? HttpClient httpClient=new DefaultHttpClient();? //HttpClient為抽象類 需要new其子類??
?(2)創建請求方式? 并指定地址? HttpGET/HttpPost? ? HttpGET? httpget = new HttpGet("地址");//包含參數? ? HttpPost httpPost = new HttpPost("地址");//不包含參數??
(3)通過httpget/HttpPost設置請求參數 ? ??
(4)如果為HttpPost請求? 需要封裝請求數據? ? Listlist= new ArrayList();
list.add(new BasicNameValuePair("屬性","值");
list.add(new BasicNameValuePair("屬性","值");
....
HttpEntity? requestEntity = new? UrlEncodeFormEntity(list,"編碼格式");//將請求數據封裝到HttpEntity
httppost.setEntity(requestEntity);//將封裝好的請求數據設置到httppost中
(5)執行請求,返回響應對象HttpResponse
HttpResponse response=httpClient.excute();
(6)獲取響應碼 并判斷
int code=response.getStatusLine().getStatusCode();
(7)獲得服務端和客戶端傳遞的載體對象
HttpEntity entity = response.getEntity();
(8)通過entity獲得輸入流
InputStream? inputStream = entity.getContent();
(9)EntityUtils提供了一系列獲取數據的工具
<1>獲取字符串信息
String string = EntityUtils.toString(entity);
<2>獲取圖片類型的
byte[] b = EntityUtils.toByteArray(entity);
-----------------------------------------XML解析--------------------------------------
76.SAX解析
(1)繼承DefaultHandler類重寫startElement(),endElement(),characters()等方法編寫自己的解析邏輯
public MyHandler extends DefaultHandler{
String? nowTag="";
public void startElement(String uri,String localName,String qName,Attributes attributes)
throws SAXException{
//解析到開始標簽時觸發次方法,
//qName--該標簽的名字
//Attributes本標簽的屬性對象,相當于一個鍵值對組成的數組
可以根據下標獲得鍵名和值? 可以根據鍵名獲得值? 還以獲取屬性的總數
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
//解析到結束標簽時觸發該方法
}
public void characters(char[] ch, int start, int length)
throws SAXException {
//解析到文本內容時觸發次方法
//注意空白內容和換行等垃圾字符
}
}
(2)用SAXParserFactory中的靜態方法創建拿到解析工廠類(單例模式)
SAXParserFactory factory = SAXParserFactory.newInstance();
(3)通過解析工廠對象創建解析器對象
SAXParser parser = factory.new SAXParser();
(4)調用解析器的parser()為解析器關聯要解析的對象和handler對象,同時進行解析
MyHandler handler = new MyHandler();
parser.parse("weather.xml"或inputStream,handler);
77.pull解析
(1)用XmlPullParserFactory中的靜態方法創建解析工廠(單例模式)
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
(2)通過解析工廠對象創建解析器對象
XmlPullParser parser = factory.newPullParser();
(3)調用解析器的setinput方法為解析器關聯目標流
parser.setInput(字符流);
(4)循環用parser.getEventType()獲取節點標識碼,判斷節點標識碼來解析
int code = parser.getEventType();
while(code!=XmlParser.END_DOCUMENT){
String string = parser.getName();//獲取本節點的名字
switch(code){
case XmlPullParser.START_TAG:
.....
parser.nextText();//獲取下一個節點的文本信息
.....
parser.getAttributeCount();//獲取本節點的屬性個數
parser.getAttributeName(index);//根據屬性下標獲取屬性名
parser.getAttributeValue(index);//同上
break;
case XmlPullParser.END_TAG:
break;
case XmlPullParser.START_TAG:
break;
}
code = parser.next();//獲取下一個節點的標識碼(容易遺漏)
}
-------------------------------------json解析----------------------------------
78.json的數據格式:
{name:chx,age:22,sex:男}-----大括號對應一個對象,鍵值對中間用冒號隔開
[{name:chx,age:22,sex:男},{name:chx2,age:23,sex:男}]-------中括號對應數組,里面可包含若個對大括號
79.JSON解析
(1){}對應JSONObject類
[]對應JSONArray類
(2)JSONObject類的用法:
<1>new JSONObject("{JSON字符串}")---JSON字符串最外層必須是{}
<2>Object get(String key)? //根據key得到value
<3>Object opt(String key)? //同上
<4>xxx? getXXX(String key) //根據key得到指定數據類型的value
<5>put(String key,Object o);//向json字符串中添加一個key-value對
<6>getJSONObject(String key)/optJSONObject(String key)? //根據key得到JSONObject對象
<7>getJSONArray(String key)/optJSONObject(String key)? //根據key得到JSONOArray對象
(3)JSONArray類的用法:
<1>---<7>同JSONObject雷同
<8>length();//獲得JSONArray中的JSONObject的個數
<9>get/opt/put 增加了可以根據下標操作對象的方法
80.GSON解析??
(1)GSON是谷歌公司封裝的一套json解析的工作集,其中了反射機制??
(2)toJSON(Object)? //將具體的對象轉為json字符串??
(3)fromJson(字符串/流,json中對應的JavaBean)//第二個參數必須有并且要一一對應??
(4)當包含集合時需要借助TypeToken類----抽象類? ? ??
? ? ? ? ?TypeToken> typeToken = new TypeToken() {};
? ? ? ? ? typeToken.getType();
81.FastJSON解析
(1)阿里巴巴封裝的一套json解析的工具集,使用了反射機制
(2)主要類是JSON類--相當于一個工具類 其中有一系列parsexxx方法和一系列toxxx方法
(3)JSON.toJSONString(javaBean);//將java對象轉換為json字符串 即使傳入的是對象的集合
(4)JSON.parseObject(jsonString/流,Class);//將字符串轉換為具體的對象,也可直接轉為對象的集合,但第二個參數必須傳入類型
(5)JSON.parseArray//同JSON.parseObject雷同
82.json解析的一般規律
(1)一般服務端響應的json數據,第一層大部分為json對象,
包含的內容格式:{result:"success",totalPage:190,curPage:1,datas:[{},{},{}] }
(2)GSON/FastJSON 優點:速度快,代碼少.可忽略JavaBean中沒有的屬性
缺點:JavaBean中的屬性與json字符串的鍵必須一致
JavaBean必須有無參構造方法和get,set方
(3)JSON 優點:可繼續無規律的數據
完全根據json字符串解析 不受javaBean的約束
缺點:代碼繁瑣