基于《java2實用教程》的java知識點復習整理【第十二章——第十五章】
public class Student {
? ? public static void main(String[] args) {
? ? ? ? new Thread(new TalkSend(7777,"localhost",9999)).start();
? ? ? ? new Thread(new TalkReceive(8888,"老師")).start();
? ? }
}
第十二章——java多線程機制
一、知識結(jié)構框架


二、知識點詳解
(一)相關基礎概念
1、進程與線程
程序:程序是一段靜態(tài)的代碼
進程:進程是程序(一段代碼)的一次動態(tài)執(zhí)行過程
線程:線程是更小的執(zhí)行單位,是進程執(zhí)行過程中其中的執(zhí)行線索
2、主線程與多線程
主線程:即main線程,當JVM加載代碼發(fā)現(xiàn)main方法后,會啟動一個線程,該線程為主線程
多線程:如果在main方法中創(chuàng)建了其他線程,則JVM就會在主線程和其他線程之間輪流切換,保證每個線程都有機會使用CPU資源,即使main方法執(zhí)行完最后的語句,但JVM會等待所有線程結(jié)束后才結(jié)束程序
3、線程的狀態(tài)與生命周期
線程狀態(tài):
新建狀態(tài): New 當Thread類或其子類的對象被聲明并創(chuàng)建時,新生的線程對象處于新建狀態(tài)
運行狀態(tài):Runnable 當線程調(diào)用start()方法后并且JVM將CPU使用權切換至該線程時
中斷狀態(tài): Timed_Waiting sleep(),wait()方法可將線程主動置于中斷狀態(tài);當該線程無CPU使用權,或者執(zhí)行出錯時自動進入中斷狀態(tài)
死亡狀態(tài):Terminated run()執(zhí)行或強制結(jié)束時
(二)線程的創(chuàng)建以及常用方法
線程的創(chuàng)建:
1、使用Thread子類
//創(chuàng)建線程方式一:繼承Thread類,重寫run()方法,調(diào)用start開啟線程
public class Threadtest extends Thread {
? ? //run方法線程體
? ? @Override
? ? public void run() {
? ? ? ? for (int i1 = 0; i1 < 2000; i1++) {
? ? ? ? ? ? System.out.println("===="+i1);
? ? ? ? }
? ? }
? ? public static void main(String[] args) {
? ? ? ? //main主線程
? ? ? ? //創(chuàng)建一個線程對象
? ? ? ? Threadtest threadtest = new Threadtest();
? ? ? ? //調(diào)用start()方法開啟線程
? ? ? ? threadtest.start();
? ? ? ? for (int i = 0; i < 2000; i++) {
? ? ? ? ? ? System.out.println("+++" + i);
? ? ? ? }
? ? }
}
2、使用Thread類(實現(xiàn)Runnable接口)
//創(chuàng)建線程方式二:實現(xiàn)runnable接口,重寫run方法,執(zhí)行線程需要丟入runnable接口實現(xiàn)類
public class Threadtest? implements Runnable{
? ? //run方法線程體
? ? @Override
? ? public void run() {
? ? ? ? for (int i1 = 0; i1 < 2000; i1++) {
? ? ? ? ? ? System.out.println("===="+i1);
? ? ? ? }
? ? }
? ? public static void main(String[] args) {
? ? ? ? //創(chuàng)建runnable接口實現(xiàn)類對象
? ? ? ? Threadtest threadtest = new Threadtest();
? ? ? ? //創(chuàng)建一個線程對象,通過對象(代理)開啟線程
? ? ? ? new Thread(threadtest).start();
? ? ? ? //等同于 new Thread(threadtest).start()
? ? ? ? for (int i = 0; i < 2000; i++) {
? ? ? ? ? ? System.out.println("+++" + i);
? ? ? ? }
? ? }
}
目標對象與線程的關系
1、完全解耦:在實現(xiàn)Runnable接口的類中不創(chuàng)建線程,在main方法中竄創(chuàng)建,這目標對象與線程不是組合關系,類中不包含對線程對象的引用。即創(chuàng)建目標對象的類不包含線程對象,在引用時重新創(chuàng)建線程對象。
2、弱耦合:目標對象可以組合線程,讓線程做為自己的成員。即創(chuàng)建目標對象的類組合線程對象。
線程常用方法:
1、start():進入排隊狀態(tài)
2、run():使用CPU資源時執(zhí)行該方法體
3、sleep():休眠
4、isAlive():是否死亡
5、currentThread():返回當前運行線程
6、interrupt():結(jié)束休眠
(三)線程的相關操作:同步、協(xié)調(diào)同步、聯(lián)合
線程同步
1、線程同步機制:當一個線程A使用synchronized方法時,其他線程想使用這個synchronized方法就必須等待,直到線程A使用完該synchronized方法。
2、線程同步:當若干個線程都需要使用一個synchronzed修飾的方法時,多個線程調(diào)用該方法時必須遵守同步機制。
協(xié)調(diào)同步的線程
當出現(xiàn)某個線程占用該synchronized方法而不能結(jié)束時,應當做出一定協(xié)調(diào)
1、使用wait()方法將不能結(jié)束的線程進入中斷狀態(tài),讓出CPU使用權
2、在協(xié)調(diào)后,使用notify(一個線程繼續(xù)),、或者notifyAll(所有線程,先中斷先繼續(xù))讓未執(zhí)行的方法體從中斷處繼續(xù)執(zhí)行
線程聯(lián)合(插隊)
在線程A執(zhí)行時,聯(lián)合B。則A立刻中斷執(zhí)行,一直等到它聯(lián)合的線程B執(zhí)行完畢,A再重新排隊等待CPU資源,才恢復執(zhí)行。
public class Threadtest implements Runnable {
? ? @Override
? ? public void run() {
? ? ? ? for (int i = 0; i < 100; i++) {
? ? ? ? ? ? System.out.println(i + "號不要臉插隊");
? ? ? ? }
? ? }
? ? public static void main(String[] args) {
? ? ? ? //線程啟動
? ? ? ? Thread thread = new Thread(new Threadtest());
? ? ? ? thread.start();
? ? ? ? //主線程
? ? ? ? for (int i = 0; i < 100; i++) {
? ? ? ? ? ? if(i==50){
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? thread.join();
? ? ? ? ? ? ? ? } catch (InterruptedException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println(i + "號同學排隊");
? ? ? ? }
? ? }
}
(四)守護線程
1、threadx.setDaemon(true);該方法將線程設置為守護線程,守護線程再所有用戶線程執(zhí)行結(jié)束時立刻結(jié)束運行,無論其代碼是否執(zhí)行完畢。
public class Threadtest {
? ? public static void main(String[] args) {
? ? ? ? Thread thread1 = new Thread(new LORD());
? ? ? ? Thread thread2 = new Thread(new P());
? ? ? ? thread1.setDaemon(true);//默認是false,表示為用戶線程,true為守護線程
? ? ? ? thread1.start();
? ? ? ? thread2.start();
? ? }
}
class LORD implements Runnable{
? ? @Override
? ? public void run() {
? ? ? ? while(true) {
? ? ? ? ? ? System.out.println("LORD在看著你");
? ? ? ? }
? ? }
}
class P implements Runnable{
? ? @Override
? ? public void run() {
? ? ? ? for (int i = 0; i < 36500; i++) {
? ? ? ? ? ? System.out.println("你不知道");
? ? ? ? }
? ? ? ? System.out.println("============你去看他了==========");
? ? }
}
(五)Gui線程
當java程序包含GUI時,JVM會開辟更多線程,其中有兩個線程比較重要AWT-EventQuecue和AWT-Windows,其分別處理事件和負責繪制窗口到桌面。
可以在事件中加入線程或者切換線程來達到程序目的。即在AWT-EventQuecue中啟動其它線程或者使其它線程中斷。
三、題庫考查知識點整理
1、線程調(diào)用start()方法可以使一個線程成為可運行的,但是它不一定立即開始運行。
2、線程新建后,可以調(diào)用run方法進入排隊狀態(tài)。
3、run()方法是Runnable接口中的方法。
4、一個進程可以產(chǎn)生多線程。
5、wait()方法、notify()及notifyAll()方法在java.lang.Object中。
6、線程不調(diào)用start方法,JVM就不會把它當作一個線程來對待(JVM管理的線程隊列有這個線程)。
7、線程處于“新建”狀態(tài)時(在調(diào)用start方法之前),線程調(diào)用isAlive()方法返回的值是false。
8、一個線程A調(diào)用synchronized方法期間,其他線程不可以能成功調(diào)用這個synchronized方法。
9、一個線程A調(diào)用synchronized方法期間,執(zhí)行sleep方法進入中斷后,其他線程也不能成功調(diào)用這個synchronized方法。
10、新建狀態(tài)的線程調(diào)用isAlive()方法返回的值是false。
11、currentThread()方法是Thread類中的static方法,該方法返回當前正在使用CPU資源的線程.
12、wait()、notify()和notifyAll()都是Object類中的final方法,被所有的類繼承、且不允許重寫的方法。
13、一個因執(zhí)行wait方法進入中斷狀態(tài)的線程,需要其他線程執(zhí)行notify()或notifyAll()通知它結(jié)束中斷狀態(tài)。
14、一個線程在執(zhí)行同步方法時,如果執(zhí)行wait()方法,使本線程進入中斷,就允許其它線程使用這個同步方法。
15、javax.swing.Timer類稱為計時器線程,計時器的監(jiān)視器必須是組件類的子類的實例,否則計時器無法啟動。
16、線程在執(zhí)行完run()方法之前,如果再次讓線程執(zhí)行start方法,就會發(fā)生ILLegalThreadStateException 異常。
第十三章——Java網(wǎng)絡編程
一、知識結(jié)構框架

二、知識點詳解
URL類
描述:URL類用來封裝一個具體資源的引用,可以通過其對象來獲取URL中的資源,一個URL對象通常包含三個基本信息:協(xié)議、地址、資源。協(xié)議例如Http,地址為有效IP或域名,資源則是所獲取的文件。
構造方法:URL(String protocol,String host,String file) throws MalformedURLException;
常用方法:openStream():可調(diào)用該方法,建立一個InputStream的對象,該輸入流指向URL對象所包含的資源,通過該輸入流可以將服務器上的資源信息讀到客戶端。
資源讀取案例:類似爬蟲
import java.io.InputStream;
import java.net.URL;
public class Urldemo {
? ? public static void main(String[] args) {
? ? ? ? try {
? ? ? ? ? ? URL url = new URL("http://www.baidu.com");
? ? ? ? ? ? InputStream in = url.openStream();
? ? ? ? ? ? byte []b = new byte[1024];
? ? ? ? ? ? int n = -1;
? ? ? ? ? ? while ((n = in.read(b))!=-1){
? ? ? ? ? ? ? ? String str = new String(b,0,n);
? ? ? ? ? ? ? ? System.out.println(str);
? ? ? ? ? ? }
? ? ? ? }catch (Exception e){
? ? ? ? ? ? System.out.println(e);
? ? ? ? }
? ? }
}
InetAddress類
**描述:**可以用InetAddress類獲取域名或IP地址
方法:
//獲取域名和IP地址
InetAddress address = InetAdderss.getByName("www.baidu.com");
//獲取域名
InetAddress address = InetAdderss.getHostName("www.baidu.com");
//獲取IP地址
InetAddress address = InetAdderss.getHostAddress("www.baidu.com");
套接字
描述:Socket稱為套接字,要通過互聯(lián)網(wǎng)進行通信,至少需要一對套接字,一個運行于客戶機端,稱之為ClientSocket,另一個運行于服務器端,稱之為serverSocket。
根據(jù)連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監(jiān)聽,客戶端請求,連接確認。

建立連接以后, 還需使用socket.getOutputStream()/getInputStream()方法建立DataInputStream,DataOutputStream對象,形成一個信息流通的通道。 再out.writeUTF(“xxx”)方法向流傳出信息,通過String s = in.readUTF()方法寫入傳入的信息。
服務器
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
? ? public static void main(String[] args) {
? ? ? ? ServerSocket serverSocket = null;
? ? ? ? Socket socket =null;
? ? ? ? DataInputStream in = null;
? ? ? ? DataOutputStream out = null;
? ? ? ? boolean flag = true;
? ? ? ? try {
? ? ? ? ? ? //建立與客戶端的連接
? ? ? ? ? ? serverSocket = new ServerSocket(6666);
? ? ? ? ? ? socket = serverSocket.accept();//服務器監(jiān)聽消息
? ? ? ? ? ? //建立輸入流與輸出流
? ? ? ? ? ? out = new DataOutputStream(socket.getOutputStream());
? ? ? ? ? ? in = new DataInputStream(socket.getInputStream());
? ? ? ? ? ? //處理信息
? ? ? ? ? ? while (flag){
? ? ? ? ? ? ? ? String s = in.readUTF();
? ? ? ? ? ? ? ? System.out.println("服務器收到的回復" + s);
? ? ? ? ? ? ? ? Scanner scanner = new Scanner(System.in);
? ? ? ? ? ? ? ? if (scanner.next() == "bye"){
? ? ? ? ? ? ? ? ? ? flag = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? out.writeUTF(scanner.next());
? ? ? ? ? ? }
? ? ? ? }catch (Exception e){
? ? ? ? ? ? System.out.println("客戶端已經(jīng)斷開");
? ? ? ? }
? ? }
}
客戶端
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
? ? public static void main(String[] args) {
? ? ? ? Socket socket;
? ? ? ? DataInputStream in = null;
? ? ? ? DataOutputStream out = null;
? ? ? ? boolean flag = true;
? ? ? ? try{
? ? ? ? ? ? //創(chuàng)建Socket連接
? ? ? ? ? ? socket = new Socket("127.0.0.1",6666);
? ? ? ? ? ? //建立輸入流與輸出流
? ? ? ? ? ? in = new DataInputStream(socket.getInputStream());
? ? ? ? ? ? out = new DataOutputStream(socket.getOutputStream());
? ? ? ? ? ? //處理信息
? ? ? ? ? ? while (flag){
? ? ? ? ? ? ? ? Scanner scanner = new Scanner(System.in);
? ? ? ? ? ? ? ? if(scanner.next() == "bye"){
? ? ? ? ? ? ? ? ? ? flag = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? out.writeUTF(scanner.next());
? ? ? ? ? ? ? ? String s = in.readUTF();
? ? ? ? ? ? ? ? System.out.println("客戶端收到的回復:" + s);
? ? ? ? ? ? }
? ? ? ? }catch (Exception e){
? ? ? ? ? ? System.out.println("客戶端已經(jīng)斷開");
? ? ? ? }
? ? }
}
UDP數(shù)據(jù)報
描述:基于UDP的通信基本模式為:將數(shù)據(jù)打包,稱為數(shù)據(jù)包,將數(shù)據(jù)包發(fā)送到目的地;接收數(shù)據(jù)包,查看其內(nèi)容。
與TCP協(xié)議不同的是,基于UDP的信息傳遞更快,但是用戶無法知道數(shù)據(jù)是否正確到達,或者接收的順序是否可靠,即UDP不及TCP可靠,但是比其快。
流程:每一個數(shù)據(jù)包的發(fā)送與接收,只需要發(fā)送端的數(shù)據(jù)包(DatagramPacket)的端口號與接受端(DatagramSocket)地址相同
在發(fā)送方:
需要設置DatagramPacket()創(chuàng)建一個對象稱為數(shù)據(jù)包,該對象負責打包和寫郵編(發(fā)送的目標端口號)
DatagramPacket(byte data[],int length,InetAddtress address,int port)
然后再使用DatagramSocket()創(chuàng)建一個對象,該對象負責發(fā)送數(shù)據(jù)包,可以為該對象設置端口號也可以不設置
該類的對象使用socket,調(diào)用send(packet)方法,進行數(shù)據(jù)包的發(fā)送
在接收方:
使用DatagramSocket()創(chuàng)建一個對象,該對象負責接收數(shù)據(jù)包,因為要收到已經(jīng)設立好目標端口號的數(shù)據(jù)包,所以該處設立的端口號要與數(shù)據(jù)包的端口號一致
DatagramPacket packet = new DatagramPacket(container, 0, container.length);創(chuàng)建該類的對象,用于接收數(shù)據(jù)包再使用socket對象調(diào)用receive(packet),來接收數(shù)據(jù)包
發(fā)送線程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TalkSend implements Runnable {
? ? DatagramSocket socket = null;
? ? BufferedReader reader = null;
? ? InputStreamReader in = null;
? ? private int fromPort;
? ? private String toIP;
? ? private int toPort;
? ? public TalkSend(int fromPort, String toIP, int toPort) {
? ? ? ? this.fromPort = fromPort;
? ? ? ? this.toIP = toIP;
? ? ? ? this.toPort = toPort;
? ? ? ? try {
? ? ? ? ? ? //建立發(fā)送端口號,用于識別不用于發(fā)送
? ? ? ? ? ? socket = new DatagramSocket(fromPort);
? ? ? ? ? ? //設立輸入流
? ? ? ? ? ? in = new InputStreamReader(System.in);
? ? ? ? ? ? reader = new BufferedReader(in);
? ? ? ? } catch (SocketException e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? @Override
? ? public void run() {
? ? ? ? //數(shù)據(jù)準備
? ? ? ? while (true) {
? ? ? ? ? ? String data = null;
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? data = reader.readLine();
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? byte[] bytes = data.getBytes();
? ? ? ? ? ? //數(shù)據(jù)打包,并設置發(fā)送端口地址,此處與設立接收方的地址相同
? ? ? ? ? ? DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, new InetSocketAddress(this.toIP,toPort));
? ? ? ? ? ? //發(fā)送數(shù)據(jù)包
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? socket.send(packet);
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
接收線程
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class TalkReceive implements Runnable{
? ? DatagramSocket socket = null;
? ? private int port;
? ? private String msgFrom;
? ? public TalkReceive(int port,String msgFrom) {
? ? ? ? this.port = port;
? ? ? ? this.msgFrom = msgFrom;
? ? ? ? try {
? ? ? ? ? ? //設立接收數(shù)據(jù)包的地址
? ? ? ? ? ? socket = new DatagramSocket(port);
? ? ? ? }catch (SocketException e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? @Override
? ? public void run() {
? ? ? ? try {
? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? //準備接收數(shù)據(jù)包
? ? ? ? ? ? ? ? byte[] container = new byte[1024];
? ? ? ? ? ? ? ? DatagramPacket packet = new DatagramPacket(container, 0, container.length);
? ? ? ? ? ? ? ? //接收數(shù)據(jù)包
? ? ? ? ? ? ? ? socket.receive(packet);
? ? ? ? ? ? ? ? byte[] data = packet.getData();
? ? ? ? ? ? ? ? String datas = new String(data, 0, data.length);
? ? ? ? ? ? ? ? System.out.println(msgFrom + ":" +datas);
? ? ? ? ? ? ? ? if (datas.equals("bye")) {
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }catch (Exception e){
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? ? ? socket.close();
? ? }
}
學生端
public class Student {
? ? public static void main(String[] args) {
? ? ? ? new Thread(new TalkSend(7777,"localhost",9999)).start();
? ? ? ? new Thread(new TalkReceive(8888,"老師")).start();
? ? }
}
老師端
public class Techer {
? ? public static void main(String[] args) {
? ? ? ? new Thread(new TalkSend(5555,"localhost",8888)).start();
? ? ? ? new Thread(new TalkReceive(9999,"學生")).start();
? ? }
}
三、題庫考查知識點整理
1、java.net包中的URL類的實例,即對象封裝著著一個具體的資源。
2、URL類創(chuàng)建對象需要捕獲MalformedURLException異常 。
3、URL是Uniform Resource Locator的縮寫。
4、一個URL對象通常包含最基本的三部分信息:協(xié)議、地址、資源。
5、URL類創(chuàng)建對象需要捕獲MalformedURLException異常 。
6、URL對象調(diào)用InputStream openStream() 方法可以返回一個輸入流,該輸入流指向URL對象所包含的資源。
7、端口號是一個16位的0~65535之間的整數(shù)。
8、
Socket的構造方法Socket()創(chuàng)建一個未連接的套接字。
套接字再調(diào)用
public void connect(SocketAddress endpoint) throws IOException
請求和參數(shù)SocketAddress指定的服務器端的套接字建立連接。
9、客戶端的程序使用Socket類建立負責連接到服務器的套接字對象。
10、客戶端的程序使用Socket類建立負責連接到服務器的套接字對象。
11、服務器使用ServerSocket對象將客戶端的套接字對象和服務器端的一個套接字對象連接起來,從而達到連接的目的。
12、服務器端的ServerSocket對象調(diào)用方法accept()返回一個和客戶的套接字相連接的套接字對象。
第十四章——圖形、圖像與音頻
一、知識結(jié)構框架

二、知識點詳解
圖形
1、程序框架

三、題庫考查知識點整理
1、Line2D.Double:負責創(chuàng)建“直線”對象
2、RoundRectangle2D.Double:負責創(chuàng)建“圓角矩形”對象
3、Rectangle2D.Double:負責創(chuàng)建“矩形”對象
4、RoundRectangle2D.Double:負責創(chuàng)建“橢圓”對象
5、Arc2D.Double:負責創(chuàng)建“圓弧”對象
6、public void paint(Graphics g)方法是java.awt.Component類提供的方法。
7、Graphicd2D是Graphics的一個子類。
8、Line2D是java.awt.geom包中的類。
9、java.awt.geom包中的的Rectangle2D的靜態(tài)內(nèi)部類Double可以創(chuàng)建Rectangle2D對象。
10、new Rectangle2D.Double(0,0,100,50)創(chuàng)建了一個左上角坐標是(0,0),寬和高分別是100和50的Rectangle2D矩形對象。
11、AudioClip和Applet類屬于java.applet包中的類。
12、Graphics2D對象調(diào)用drawString(String s, int x, int y)方法從參數(shù)x、y指定的坐標位置處,從左向右繪制參數(shù)s指定的字符串s。
13、new Ellipse2D.Double (10,5,100,50 )創(chuàng)建了一個左上角坐標是(10,5),寬和高分別是100和50的Ellipse2D橢圓對象。
第十五章——Java泛型與集合框架
一、知識結(jié)構框架

二、知識點詳解
###1、泛型
編寫的代碼可以被不同類型的對象所重用,主要目的是可以建立具有類型安全的集合框架。
1.1?泛型類
具有泛型變量的類,在類名后用代表引用類型,如ArrayList,HashMap,HashSet
//ArrayList部分源碼
public class ArrayList<E> extends AbstractList<E>
? ? implements List<E>,RandomAccess,Cloneable,java.io.Serializable{
? ??
? ? public E get(int index){}
}
1.1.1 設計泛型類
public class Interval<T>{
? ?private T lower;
? ?public getLower(){
? ? ? ?return lower;
? ?}}
1.1.2 調(diào)用泛型類
Interval<Integer> v = new Interval<Integer>();Interval<Integer> v = new Interval<>();//后面的可以省略
1.2 泛型方法
具有泛型參數(shù)的方法,可以在普通類或泛型類中,定義的泛型在修飾符后,返回類型前
1.2.1 設計泛型方法
public class ArrayUtil{ ? ?public static<T> T getMiddle(T... a){ ? ? ? ?return a; ? ?}
1.2.1 調(diào)用泛型方法
ArrayUtil arr = new ArrayUtil();String s = a.<String>getMiddle("a","b","c")
1.3 泛型接口
與泛型類相似,在類名后加,實現(xiàn)接口時,指定類型
1.3.1 設計泛型接口
public interface Calculator<T>{ ? ?public T add(T operand1,Toperand2);}
1.3.2 實現(xiàn)泛型接口
public class IntegerCalculator implements Calculator<Integer>{
? ? public Integer add(Integer operand1,Integer Toperand2){
? ? ? ? return operand1 + operand2;
}? ? ?
IntegerCalculator a = new IntegerCalculator();
Calulator<Integer> c = new IntegerCalculator();//用泛型接口聲明對象時
2、集合框架
框架集合


2.1 List
2.1.1 ArrayList實現(xiàn)了長度可變的數(shù)組
對象創(chuàng)建:List list = new ArrayList();
方法:與List方法相同

使用例子:
public class Demo {
public static void main(String[] args) {
//1、創(chuàng)建4個學生對象
Student stu1 = new Student("Tom", 10);
Student stu2 = new Student("Aimee", 11);
Student stu3 = new Student("George", 11);
Student stu4 = new Student("Angelia", 13);
//2、創(chuàng)建ArrayList集合對象并把4個學生放入其中
List list = new ArrayList();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(2,stu4);//添加stu4到指定的位置
//3、輸出集合中學生的總數(shù)
System.out.println("總共有學生"+list.size()+"個。");
//4、通過遍歷集合顯示所有學生的信息
for (int i = 0; i < list.size(); i++) {
Student student=(Student)list.get(i);
System.out.println(student.getName()+"\t"+student.getAge());
}
}
}
2.1.2LinkedList采用鏈表存儲方式
對象創(chuàng)建:LinkedList mylist = new LinkedList();
方法:在List方法上新增

例子:
//對象創(chuàng)建
LinkedList<String> mylist = new LinkedList<String>();
//常用操作
mylist.add("h");
mylist.add("o");
mylist.add("w");
mylist.remove(1);
mylist.get(1);
mylist.getFirst();
mylist.getLAst();
mylist.removeFirst();
mylist.removeLAst();
int n = mylist.size();
int index = mylist.indexOf("o");
int index = mylist.lastindexOf("o");
//遍歷
Iterator<String> iter = mylist.iterator;
while(iter.hasNext()){
? ? System.out.println(iter.next);
}
2.2 Map
對象創(chuàng)建:Map countries = new?HashMap();

使用例子:
public class Test4 {
public static void main(String[] args) {
Map countries = new HashMap();
countries.put("CN", "中華人民共和國");
countries.put("RU", "俄羅斯聯(lián)邦");
countries.put("FR", "法蘭西共和國");
countries.put("US", "美利堅合眾國");
String country = (String) countries.get("CN");
System.out.println("CN對應的國家是:" + country);
System.out.println("Map中共有"+countries.size()+"組數(shù)據(jù)");
countries.remove("FR");
? ? ? ? ? ? ? System.out.println("Map中包含F(xiàn)R的key嗎?" +?
countries.containsKey("FR"));
System.out.println( countries.keySet() ) ;
System.out.println( countries.values() );
System.out.println( countries );
}
}
三、題庫考查知識點整理
1、LinkedList、Stack、ArrayList實現(xiàn)了List接口。
2、removeLast()是LinkedList有,但ArrayList類沒有的方法。
3、ArrayList的public void add(int index,E element)方法的執(zhí)行效率低于LinkedList的效率。
4、ArrayList的public E get(int index)方法的執(zhí)行效率效率高于LinkedList的效率。
5、ArrayList的public E remove(int index)方法的執(zhí)行效率低于LinkedList的效率。
6、ArrayList的public E get(int index)方法的執(zhí)行效率效率高于LinkedList的效率。
7、LinkedList類不是線程安全的,即提供的添加,刪除操作都不是同步(synchronized)的。
8、LinkedList類不是線程安全的,即提供的添加,刪除操作都不是同步(synchronized)的。
9、Vector類是線程安全的,即提供的添加,刪除操作都是同步(synchronized)的。
10、Stack類是線程安全的,即提供的壓棧,彈棧操作都是同步(synchronized)的。
11、HashMap<K,V>對象不是采用順序表這種數(shù)據(jù)結(jié)構存儲數(shù)據(jù)的。HashMap<K,V>對象采用散列表這種數(shù)據(jù)結(jié)構存儲數(shù)據(jù)。