2.在定義常量的時候C語言中定義為const而JAVA中為final
3.在JAVA聲明成員變量的時候,使用static來定義。
4.在JAVA中的boolean類型只包括true和false,但是在C中非0為true,0為false
5.在JAVA中byte、short、int、long其存儲空間分別為1、2、4、8個字節,而在C中其char、short、int、long其存儲空間分別為1、2、4、4個字節。其中這裡的long為int long。C語言中有unsign類型,而Java中沒有。
6.long類型在Java中必須在賦值後面使用L表示,否則會出錯。或者會成為int類型,但是int類型的長度會比long少。C語言中沒有此規則。
7.JAVA中數據類型按容量大小(表示的數的大小)排序,不是按所占內存大小排序。
8.int類型數據可以直接賦值給byte類型變量。byte類型變量是直接將int類型數據直接砍掉到他所需要的長度,而將double類型的數據不可以直接賦值給float類型數據,因為小數點的限制。
9.邏輯與& 邏輯或| (都必須計算兩端的值) 短路與&& 短路或||可以不計算第二個值
10.switch後面的判斷值應該為int類型,在Java中可以是char,byte,short類型,因為其可以自動轉動為int類型數據。
第二章題
1.輸出1-10的階乘之和
2.輸出100以內奇數這和
3使用while和do-while循環輸出1-9
4.輸出1-100以內5個可以被3整除的數
5輸出101-200 內的質數
第三章 面向對象
注:面向對象思維:1那些個類那些個對象2這些類和對象有什麼屬性和方法3類和類之間具備什麼樣的關系。合適的方法應該出現在合適的類裡面。
對象和類的關系:類可以看成一類對象的模板,對象可以看成該類的一個具體實例。
類(對象)之間的關系
關聯關系:一個類的方法的參數是另一個類的對象。 關系不是很緊密(最弱)
繼承關系:XX是一種XX,可以考慮用繼承關系封裝。(在做設計的時候很有可能會生成一種生成樹,但是也有可能從多個不同的類繼承。C++存在多重繼承(如果父類裡面存在重名的成員變量,處理起來會非常麻煩),但是JAVA存在繼承多個接口)。強
聚合關系:整體和部分的關系(XX是XX的一部分呢)。細分之下還可以分為聚集(身兼數職)和組合(密不可分)的關系。強
實現關系:當子類繼承父類的方法時,並由子類來實現其具體方法,這叫實現。
多態關系:
static關鍵字:
static方法是不可以直接訪問非靜態變量和方法 。
對象可以看成屬性(成員變量)和方法的封裝體。
Java和C的區別:
C是面向過程的編程,它的屬性和方法是分開的,不是聚合在一起的,而Java是面向對象的,對象將屬性和方法封裝到一起,然後復用,即Java復用性(方法和屬性)更強,而面向過程復用的是方法。除了可復用性,還有可擴展性和維護和替換比面向過程更加方便。
JAVA語法
引用:除了基本類型(4類8種)之外的變量類型都稱之為引用類型,初始值為null。
重載:方法名一樣,參數類型或者參數個數不一樣,但是返回值類型不一樣不構成重載。
static方法裡面不可訪問非static成員,且static和其他引用應該放在data segment區
打包:在dos環境下將class文件進行打包時,輸入jar -cvf test.jar *.*即可完成。此時將其拷貝給其他人後,其他人可使用,打包記得在需要打包文件的父目錄進行。
訪問修飾符:private default(只可以被同一個包內部的類訪問) protected public(在C ++中是friend)
修飾符 類內部 同一個包 子類 任何地方
private YES
default YES YES
protected YES YES YES
public YES YES YES YES
繼承:
一個孩子只能有一個爸爸(extends),但是他可以有繼承(implement)多個接口(interface)。總起來說孩子比父親的范圍大。
super繼承父類的方法。
繼承中的構造方法:
子類構造過程中必須調用其基類的構造方法。super.父類構造方法,this.子類其他構造方法。如果調用super,必須寫在子類構造方法的第一行。
如果子類沒有顯示調用父類的構造方法,則程序會自動調用其父類的無參數的構造方法,然後再執行子方法。如果子類沒有顯示調用父類的構造方法,而父類沒有無參數的構造方法則編譯會出錯。
重寫:就是與繼承的方法的方法名稱、參數列表、返回類型必須一致,且其訪問權限應該大於或者等於 其繼承的方法。
哈希編碼:獨一無二的代表了一個對象,並且可以通過哈希編碼找到那個對象所在的位置。map<鍵,值>。
equals:object對象的equals方法定義是當兩個變量指的是同一個對象的時候和==是一樣的使用。當比較兩個不同對象但是在其他方面一樣時,可以重寫equals方法來實現。
對象轉型(可以向上轉型也可以向下轉型和數值類型相似):
例如上轉型:Animal a=new Cat();a.enjoy(); 下轉型:Animal a = new Cat(); Cat c = (Cat)a; c.enjoy();
instanceof後面加類名,從而來判斷該引用變量所指向的對象是不是屬於該類或者該類的子類。
注:父類引用指向子類對象,其看到的只是子類繼承父類的方法和變量,不可以訪問其子類對象新增加的內容。可以在代碼中產生可擴展性。
多態(擴展性達到極致)
使用多態的三個條件:1.要有繼承 2要有重寫3父類引用指向子類對象
動態綁定:實際中new的誰就調用誰。是指執行期間而非編譯期間判斷所引用對象的實際類型,根據其實際中調用的誰就調用其相應的方法。new的是誰就調用誰的方法。
final:final的變量的值不能改變,final的方法不能被重寫,final的類不能被繼承
抽象類:要由子類來實現抽象方法。接口也是一種特殊的抽象類(裡面的方法都是抽象方法,成員變量都是static final類型)
第四章 異常處理
打印異常出現信息位置:e.printStackTrace()跟蹤異常事件發生時執行堆棧的內容。getMessage()只是打印異常信息。
throwable包括Error、Exception。Error是系統錯誤,Exception是可以處理的異常。Exception下又有RuntimeException是可以逮也可以不逮,剩余的錯誤必須逮。但是程序中如果throws出的錯誤需要逮。
在方法名後使用throws+異常,方法內部是throw+異常
finally 無論捕到或者沒捕到異常均執行其裡面的語句,從而一般進行資源的清除工作。
第五章 數組
在C中必須指定數組的范圍,即大小,且其值放在棧空間上,而Java是不能指定數組大小的,其值放在堆
空間上。
每個數組都有一個屬性length表長度,用.length。
System.exit(0|-1);-1為非正常退出,0是正常退出。
在這裡涉及到Java排序的算法問題。快速排序、冒泡排序、希爾排序、堆排序、選擇排序。
排序:
選擇排序:將數組裡的值按選擇排序方法:將數組裡的值從小到大排序,將第一個數值與後面的數值做比較,當找到最小的值後進行位置交換,然後進行下一輪的循環,直到結束。
修改使選擇排序的效率更高:每次循環都找到未排好序列的最小值,然後進行交換。(重新做一遍)
冒泡排法:從後往前,從下往上
作業:整形的冒泡排序,date的選擇排序 數三退一500人,最後的那個人是原來的第幾個位置
雙向回環鏈表
搜索:往往是建立在已經排好序的基礎之上。
二分法查找
二維數組:在JAVA中不能在靜態初始化的時候定義幾維美維幾個數組,由JAVA自動分配,自動定義。
在數組arrayCopy中,如果更改拷貝過後的數組中的值,則被拷貝的數組的值也將改變。
常用類:
String、StringBuffer區別:可以在StringBuffer後面直接添加字符串。
String類表示不可變的字符序列。
StringBuffer代表可變的字符序列。
例:
String s1="Hello";
String s2="World";
//s1+=s2;//HelloWorld內存分析:在data seg區一塊內存是Hello,還有一塊內存是World在執行第三句話的時候是將上面兩個變量的值拷貝到另一塊內存區間,然後再將s1指向這塊內存區。
StringBuffer的append方法。添加。reverse逆序
Math類的round四捨五入是long類型
File類.io.
路徑分隔符separator 在windows反斜槓,Linux正斜槓,或者都是用/正斜槓。long類型來存儲上次修改時間。
遞歸:關鍵是找到方法,找參數和返回值。
枚舉:某些類型必須取某些值之一。enum
第7章容器(重點)集合
容器:裝其他各種各樣的對象。
一個圖一個類,三個知識點六個接口
圖:容器之圖。util
<interface>
Collection(集合。對外提供方法)
<interface> <interface> <interface>
Set(沒有順序
並且不可以重復) List (有順序且可以重復equals) Map
HashSet LinkedList ArrayList HashMap
容器類對象在調用remove、contains等方法時需要比較對象是否相等,這回涉及到對象類型的equals方法和hashCode方法以實現自定義的對象相等規則。
注:相等的對象應該具有相等的hash codes。hash code非常適合做索引。
類:java.util.Collections提供了一些靜態方法實現了基於List容器的一些常用算法(比如排序,二分查找等算法)。
知識點:增強的for循環,泛型,自動打包/解包
接口:Collection 、Iterator、 Set、 List、 Comparable、 Map
Iterator做遍歷使用,每一個實現Collection接口的容器類都有一個iterator方法用以返回一個實現Iterator接口的對象。Iterator對象成為迭代器,用以方便的實現對容器內元素的遍歷操作。統一地遍歷了collection
iterator對象的remove方法是在迭代過程中刪除元素的唯一的安全方法。也就是說iterator的remove方法只能由它自己看到,其他的都不可以。
增強的for循環for(int i:array)
缺點:數組(不能方便的訪問下標值),集合(與使用Iterator相比,不能方便的刪除集合中的內容)。
Set無順序,不重復。
retain交集
List 有順序可重復
容器中的元素都對應一個整數型的序號記載其在容器中的位置,可以根據序號存取容器中的元素。
List容器中的元素都對應一個整數型的序號記載其在容器中的位置,可根據序號存取容器中的元素,和array差不多,但是List可以更改其大小。
Array讀快改慢 Linked該快讀慢 Hash兩者之間
arrayList使用數組作為底層的存儲空間,對外提供List的接口。
LinkedList以鏈表作為底層存儲空間,對外提供List的接口
Object set (int index,object element)將舊值返回。
Map用來存儲鍵值對(紅黑樹)
當比較多個元素時可用hashcode來比較,效率比較高。也就是重寫equals方法必須重寫hashcode方法
put方法將原來的value返回
自動打包(自動將基礎類型轉換為對象)與解包(自動將對象轉換為基礎類型)
泛型其實就是你要在裡面裝的東西和<>中的類型一樣即可,在打印使用時不需要使用強制轉換。
只要類後面跟著<>的則可以使用泛型,否則不可以使用。
在定義集合的時候同時定義集合中對象的類型,可以在Collection時指定同時也在Iterator指定時,從而增加程序的可讀性和穩定性。
第八章IO流(一個字符兩個字節)
按數據方向:輸入流(字節流:InputStream;字符流:Reader),輸出流(字節流:OutputStream,字符流:Writer)。
按處理數據單位:字節流 ,字符流
按功能:節點流(直接將管道查到數據源處,可以從一個特定的數據源(節點)讀寫數據(如:文件,內存)),處理流(套層的管道,也就是說通過對數據的處理為程序提供更為強大的讀寫功能)。
在讀入數據的時候記得關閉,在寫數據的時候記得flush經緩沖區的數據全部寫出到目的地,然後再關閉
經實驗驗證必須在外面定義一個整形變量,並將讀出的數據存放到那個變量中,然後再寫入,此時寫入的文件將與讀出的文件中是一樣的順序。
處理流:
1.緩沖流:帶緩沖區的。套接在相應的節點流之上,對讀寫的數據提供了緩沖的功能,提高了讀寫的效率,同時增加了一些新的方法。Buffer
2.轉換流:就是將字節流直接轉換成字符流進行輸入或者輸出,其中有一個readline方法可以讀或者寫一行,從而增加其速度。InputStreamReader
3.數據流
DataInputStream套接在InputStream類型的節點流上。它提供了可以存取與機器無關的JAVA原始類型數據(如:int,double等)的方法。其構造方法DataInputStream(InputStream in)
先寫的先讀,先進先出,隊列。
4.print流(只有輸出流,沒有輸入流,打印)
PrintWriter和PrintReader都屬於輸出流,分別針對字符和字節,不會拋出異常。其用於多種數據類型的輸出,且有自動flush功能。
5.Object流
serializable接口,指序列化,標記性接口,不需要實現其方法。
ObjectOutputStream
transient透明的修飾的成員變量,在序列化的時候不考慮,也就是在硬盤上寫的時候是其默認值。
externalizable接口是serializable的子接口。可以使用其方法自己控制讀或者寫。
第9章線程
線程:一個程序裡的不同執行路徑。
進程:靜態的概念。class文件,.exe文件就是一個進程。進程的執行指的是進程裡面的主方法開始運行
可以通過創建Thread對象來創建線程,使用run方法來完成去操作,使用start()方法來啟動一個線程。
線程啟動必須調用Thread類的start()方法
創建新線程的兩種方法:
1.實現Runnable接口。
2.定義一個Thread的子類並重寫其run方法
開啟線程的時候盡量從接口處繼承。
線程的狀態轉換
阻塞狀態
| | (向上)
阻塞解除 導致阻塞的事件
|(向下) |
創建——>start()——>就緒狀態<——>調度<——>運行狀態——>終止
sleep:Thread的靜態方法(拋異常)。使用標志來結束子線程的調用。
jion:合並線程,將子線程執行完了再繼續原來的線程。
yield()讓出CPU,當前線程進入就緒隊列等待調度。
線程優先級的范圍是從1-10,默認值是5
線程同步
synchronized(this){}或者public synchronized void add(String name){}是執行這個方法過程中鎖住當前對象
解決死鎖的方法之一:降低同步的粒度,即鎖住當前整個對象,而不用鎖定裡面的子對象。
注:一個線程訪問一個帶有鎖的方法,鎖定了當前對象,另一個線程不可以執行這個對象中該加有鎖的方法;但是可以訪問這個對象中沒有加鎖的方法。
程序中訪問數據庫中的某一個資源時,一般在“改的方法”上加鎖;而在讀的方法上不加鎖
第十章 網絡編程 技術+管理+溝通
網絡編程的一本好書《TCP/IP詳解》
TCP:專門設計用於在不可靠的因特網上提供可靠的、端到端的字節流通信的協議,是一種面向連接的協議。TCP連接是字節流而非報文流。(TCP三次握手)
UDP:向應用程序提供了一種發送封裝的原始IP數據報的方法,並且發送時無需建立連接,是一種不可靠的連接。
Socket 用來實現client----server連接 java.net
兩個JAVA應用程序通過一個雙向的網絡通信連接實現數據交換,這個雙向鏈路的一端稱為一個Socket.
java.net包中定義的兩個類Socket和ServerSocket(TCP服務端的連接),分別用來實現雙向連接的client和server端。其是實現TCP的,只有TCP有C-S之分,UDP沒有。
建立連接時所需的尋址信息為遠程計算機的IP地址和端口號(65536個端口號,也就是65536個應用程序,用來區分同一個機器上的不同應用程序,自己用1024以上)
端口號可分UDP和TCP
使用eclipse測試時,需要使用兩個eclipse來測試,如果是用dos那就需要開兩個窗口,先開服務端再開客戶端。
UDP傳遞信息快,但是不可靠,TCP傳遞信息慢,但是可靠
UDP byteArrayOutputStream
十一章 GUI編程(數據庫、HTML 、CSS、java script、JSP、servelet、J2EE、spring、structs、hibernet、EJB)
AWT(Abstract Window Toolkit)用於JAVA application 的GUI(Graphics User Interface圖形用戶界面)編程
Java圖形比較舊的開發包,Javax.swing這個是比較新的窗口開發包(重要圖片的AWT組)