五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

基于《java2實用教程》的java知識點復習整理【第十二章——第十五章】

2023-05-24 11:11 作者:歡喜y1  | 我要投稿

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ù)。


    基于《java2實用教程》的java知識點復習整理【第十二章——第十五章】的評論 (共 條)

    分享到微博請遵守國家法律
    大安市| 克什克腾旗| 汽车| 永川市| 栾川县| 宿迁市| 施秉县| 梁山县| 宜昌市| 拜城县| 洞头县| 沈丘县| 淮北市| 汝阳县| 巴青县| 新安县| 容城县| 元谋县| 昌宁县| 东阳市| 武宁县| 通州市| 靖江市| 乐山市| 涟源市| 滦平县| 柯坪县| 迁安市| 台前县| 高雄县| 德安县| 临江市| 常宁市| 阿合奇县| 舞阳县| 玛纳斯县| 轮台县| 大丰市| 长治县| 新泰市| 丰县|