日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

复习Java的精华总结

發(fā)布時(shí)間:2023/12/13 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复习Java的精华总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

小白和老手都應(yīng)該看看的總結(jié)

輸入

java.util.Scanner 是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的輸入。

下面是創(chuàng)建 Scanner 對象的基本語法:

Scanner s = new Scanner(System.in);

使用方法如下:

//對應(yīng)類型用對應(yīng)的方法接收 String stringx=s.next(); String stringy=s.nextLine();int intx=s.nextInt(); long longx=s.nextLong(); short shortx=s.nextShort();float floatx=s.nextFloat(); double doublex=s.nextDouble();BigInteger bigInteger=s.nextBigInteger(); BigDecimal bigDecimal=s.nextBigDecimal();

注意:

1、next和nextLine的區(qū)別:next讀取到空格停止,nextLine讀取到回車停止,讀取到空格不會(huì)停止。

2、nextInt不要和nextLine混用,如果nextLine在nextInt后面使用,會(huì)有吸收掉了本行的換行符而并沒有接收到下一行數(shù)據(jù)的問題

輸出

System是java.lang里面的一個(gè)類

out是System的靜態(tài)數(shù)據(jù)成員,而且這個(gè)成員是java.io.PrintStream類的引用

println()和print()就是java.io.PrintStream類里的方法.

被關(guān)鍵字static修飾的成員可以直接通過"類名.成員名"來引用,無需創(chuàng)建類的實(shí)例。所以System.out是調(diào)用了System類的靜態(tài)數(shù)據(jù)成員out。?

第一種:

System.out.println();?

是最常用的輸出語句,它會(huì)把括號(hào)里的內(nèi)容轉(zhuǎn)換成字符串輸出到控制臺(tái),并且結(jié)尾換行。

1)輸出的是一個(gè)基本數(shù)據(jù)類型,會(huì)自動(dòng)轉(zhuǎn)換成字符串,

2)輸出的是一個(gè)對象,會(huì)自動(dòng)調(diào)用對象的toString()方法

第二種:

System.out.print();?

和第一種一樣,只是結(jié)尾不換行。

第三種:

System.out.printf();

這個(gè)方法延續(xù)了C語言的輸出方式,通過格式化文本和參數(shù)列表輸出比如:

?

八種基本類型

基本數(shù)據(jù)類型的變量是存儲(chǔ)在棧內(nèi)存中,而引用類型變量存儲(chǔ)在棧內(nèi)存中,保存的是實(shí)際對象在堆內(nèi)存中的地址。

注意:有兩個(gè)大數(shù)類:BigInteger,BigDecimal分別是整數(shù)和小數(shù)

自動(dòng)裝箱: java自動(dòng)將原始類型轉(zhuǎn)化為引用類型的過程,編譯器調(diào)用valueOf方法將原始類型轉(zhuǎn)化為對象類型。

自動(dòng)拆箱: java自動(dòng)將引用類型轉(zhuǎn)化為原始類型的過程,編譯器調(diào)用intValue(),doubleValue()這類方法將對象轉(zhuǎn)換成原始類型值

例子:

Integer a = 3; //自動(dòng)裝箱 int b = a; //自動(dòng)拆箱

條件分支

1)if語句中必須是一個(gè)布爾值,而不能是其他類型,這是java特殊的地方,比如判斷x是否為null不能寫if(!x)而要寫if(x==null)

2)switch 語句中的變量類型可以是: byte、short、int 、char。

從 Java SE 7 開始,switch 支持字符串 String 類型了

Switch語句和if else語句的區(qū)別

switch case會(huì)生成一個(gè)跳轉(zhuǎn)表來指示實(shí)際的case分支的地址,而if...else是需要遍歷條件分支直到命中條件

1)if-else語句更適合于對區(qū)間(范圍)的判斷,而switch語句更適合于對離散值的判斷

2)所有的switch都可以用if-else語句替換(if-else對每個(gè)離散值分別做判斷即可)

但是不是所有的if-else都可以用switch替換(因?yàn)閰^(qū)間里值的個(gè)數(shù)是無限的)

3)當(dāng)分支較多時(shí),用switch的效率是很高的。因?yàn)閟witch是確定了選擇值之后直接跳轉(zhuǎn)到那個(gè)特定的分支

switch...case占用較多的空間,因?yàn)樗商?#xff0c;特別是當(dāng)case常量分布范圍很大但實(shí)際有效值又比較少,空間利用率很低。

?

循環(huán)流程

for( 初始化; 終止條件; 更新?) {

}

---------------------------------------------------------------

for(類型 變量名:數(shù)組或集合){

}//注意舉例:

for(int i:arr){

i=1;

}//arr數(shù)組內(nèi)的值不會(huì)被改變

---------------------------------------------------------------

while(進(jìn)入循環(huán)條件){

}

---------------------------------------------------------------

do{

}while(條件)

---------------------------------------------------------------

數(shù)組

靜態(tài)初始化

正確示例:

int ids[]或int[]?ids={ 1,2,3,4,5,6,7,8};

錯(cuò)誤示例:

int num2[3] = {1,2,3};?// 編譯錯(cuò)誤,不能在[ ]中指定數(shù)組長度

int[] num3;System.out.println(num3.length);?// 編譯錯(cuò)誤,未初始化不能使用

動(dòng)態(tài)初始化

正確示例:

int series[ ]= new int[4];

二維數(shù)組:

int arr[ ] [ ] = { {1,2},{3,4},{5,6}};

long[ ][ ] arr?= new long[5][5];

arrays類:

java.util.Arrays類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的

常用方法:

–copyOf? ???????????實(shí)現(xiàn)數(shù)組的復(fù)制? ? ? ? ? ? ? ? ? ? ? ? ? ? ???copyOf(int[] a,int newlength);

–fill? ???????????????????實(shí)現(xiàn)數(shù)組元素的初始化? ? ? ? ? ? ? ? ? ???fill(int[] a,int val);

–sort? ?????????????????實(shí)現(xiàn)數(shù)組的排序? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??sort(int[] a);

–binarySearch??? 實(shí)現(xiàn)排序后的數(shù)組元素查找? ? ? ? ? ???binarySearch(int[] a,int key);

面向?qū)ο蟮娜蠛诵奶匦?/strong>

封裝

保證了程序和數(shù)據(jù)不受外部干擾,不被誤用。封裝的目的在于保護(hù)信息,使用它的主要優(yōu)點(diǎn)如下。

  • 保護(hù)信息(阻止外部隨意訪問內(nèi)部代碼和數(shù)據(jù))
  • 隱藏細(xì)節(jié)(一些不需要程序員修改和使用的信息,用戶只需要知道怎么用就可以,不需要知道內(nèi)部如何運(yùn)行)
  • 有利于松耦合,提高系統(tǒng)的獨(dú)立性。(當(dāng)一個(gè)系統(tǒng)的實(shí)現(xiàn)方式發(fā)生變化時(shí),只要它的接口不變,就不會(huì)影響其他系統(tǒng)的使用)
  • 提高軟件的復(fù)用率,降低成本

繼承

繼承可以使得子類具有父類的各種屬性和方法,而不需要再次編寫相同的代碼,缺點(diǎn):提高了類之間的耦合性

繼承的語法:修飾符 class 子類名 extends 父類名

1)子類擁有父類非private的屬性,方法,子類可以擁有自己的屬性和方法,即子類可以對父類進(jìn)行擴(kuò)展。子類可以用自己的方式實(shí)現(xiàn)父類的方法(重寫)。

2)Java的繼承是一個(gè)子類只能繼承一個(gè)父類,但是可以多重繼承:例如A類繼承B類,B類繼承C類,這是java繼承區(qū)別于C++繼承的一個(gè)特性。

多態(tài)

?在面向?qū)ο罄碚撝?#xff0c;多態(tài)性的定義是:同一操作作用于不同的類的對象,將產(chǎn)生不同的執(zhí)行結(jié)果

比如動(dòng)物類可以指向的貓或狗,他們的“叫”方法就是不一樣的,“喵喵”和“汪汪”

好處:多態(tài)除了代碼的復(fù)用性外,還可以降低耦合、可替換性、可擴(kuò)充性

多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型和向下轉(zhuǎn)型兩種
向上轉(zhuǎn)型:多態(tài)本身就是向上轉(zhuǎn)型過的過程
父類類型 變量名=new 子類類型();? ? ? 比如:Set<Integer> set=new HashSet<Integer>();

向下轉(zhuǎn)型:一個(gè)子類對象可以使用強(qiáng)制類型轉(zhuǎn)換,將父類引用類型轉(zhuǎn)為子類引用各類型
子類類型 變量名=(子類類型)?父類類型的變量;

開發(fā)中實(shí)現(xiàn)多態(tài)?

接口實(shí)現(xiàn)、抽象類、繼承父類進(jìn)行方法重寫、同一個(gè)類中進(jìn)行方法重載。

關(guān)鍵字?

final 關(guān)鍵字:聲明類可以把類定義為不能繼承的,比如String

super關(guān)鍵字:用于引用父類中的屬性和方法,super.屬性、super.方法()

this關(guān)鍵字:用于引用本類中的屬性和方法,this.屬性、this.方法()

權(quán)限關(guān)鍵字

?

抽象類

在繼承關(guān)系中,有時(shí)基類本身生成對象是不合情理的。

例如,動(dòng)物作為一個(gè)基類可以派生出貓、狗等子類,但動(dòng)物類本身生成對象明顯不合常理。

abstract修飾的類稱為抽象類。抽象類的特點(diǎn):

不能實(shí)例化對象、類中可以定義抽象方法、抽象類中可以沒有抽象方法

?abstract修飾的方法稱為抽象方法,抽象方法只有聲明沒有實(shí)現(xiàn),即沒有方法體。包含抽象方法的類本身必須被聲明為抽象的。

abstract class Animal { private String color ; public abstract void shout(); }

??派生類繼承抽象類必須實(shí)現(xiàn)抽象類中所有的抽象方法,否則派生類也必須定義為抽象類。

接口

Java中的接口是一系列方法的聲明,可以看做是特殊的抽象類,包含常量和方法的聲明,而沒有變量和方法的實(shí)現(xiàn)。

接口的意義:

?彌補(bǔ)Java中單繼承機(jī)制的不足。

?接口只有方法的定義沒有方法的實(shí)現(xiàn),即都是抽象方法,這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。

接口的定義語法:

interface 接口名稱 {常量抽象方法}

類可以通過實(shí)現(xiàn)接口的方式來具有接口中定義的功能,基本語法:

–class 類名 implements 接口名 {

–}

–一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口;

–一個(gè)接口可以被多個(gè)無關(guān)的類實(shí)現(xiàn);

–一個(gè)類實(shí)現(xiàn)接口必須實(shí)現(xiàn)接口中所有的抽象方法,否則必須定義為抽象類。

接口繼承:

Java中接口可以繼承接口,與類的繼承概念一致,

會(huì)繼承父接口中定義的所有方法和屬性。

一個(gè)接口可以同時(shí)繼承多個(gè)接口。

接口和抽象類對比

?

參數(shù)抽象類接口
默認(rèn)的方法實(shí)現(xiàn)可以有默認(rèn)的方法實(shí)現(xiàn)接口完全是抽象的。不存在方法的實(shí)現(xiàn)
實(shí)現(xiàn)子類使用extends關(guān)鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實(shí)現(xiàn)。子類使用關(guān)鍵字implements來實(shí)現(xiàn)接口。它需要提供接口中所有聲明的方法的實(shí)現(xiàn)
構(gòu)造器抽象類可以有構(gòu)造器接口不能有構(gòu)造器
main方法抽象方法可以有main方法并且我們可以運(yùn)行它接口沒有main方法,因此我們不能運(yùn)行它。
多繼承抽象方法可以繼承一個(gè)類和實(shí)現(xiàn)多個(gè)接口接口只可以繼承一個(gè)或多個(gè)其它接口
速度它比接口速度要快接口稍微慢,因?yàn)樾枰ふ以陬愔袑?shí)現(xiàn)的方法。
添加新方法如果你往抽象類中添加新的方法,你可以給它提供默認(rèn)的實(shí)現(xiàn)。因此你不需要改變你現(xiàn)在的代碼。如果你往接口中添加方法,那么你必須改變實(shí)現(xiàn)該接口的類。

?

異常

Java5個(gè)異常

ArrayIndexOutOfBoundsExceptions:數(shù)組下標(biāo)越界

NullPointerException:訪問null的對象的方法或?qū)傩詴r(shí)

ClassCastException:類型轉(zhuǎn)換失敗時(shí)

ConcurrentModificationException:并發(fā)修改異常

ArithmeticException:除零異常

處理異常:

try catch :

try catch:自己處理異常 try {可能出現(xiàn)異常的代碼 } catch(異常類名A e){如果出現(xiàn)了異常類A類型的異常,那么執(zhí)行該代碼 } ...(catch可以有多個(gè)) finally {最終肯定必須要執(zhí)行的代碼(例如釋放資源的代碼) }

注意:finally不一定執(zhí)行:前面代碼遇到如:System.exit(0);? ?return 0;,就不會(huì)執(zhí)行接下來的語句,包括finally。

拋出:

一個(gè)方法不處理它產(chǎn)生的異常,而是沿著調(diào)用層次向上傳遞,由調(diào)用它的方法來處理這些異常,叫拋出異常。

throws:使用throws關(guān)鍵字,用來方法可能拋出異常的聲明。

例如:public void doA(int a) throws Exception1,Exception3{......}

throw:使用throws關(guān)鍵字,用來拋出異常

語法:throw (異常對象);

如:throw new ArithmeticException();

?

注意事項(xiàng):

?避免過大的try塊,不要把不會(huì)出現(xiàn)異常的代碼放到try塊里面,盡量保持一個(gè)try塊對應(yīng)一個(gè)或多個(gè)異常。

?細(xì)化異常的類型,不要不管什么類型的異常都寫成Excetpion。

?不要把自己能處理的異常拋給別人。

?

自定義異常

?如果JDK提供的異常類型不能滿足需求的時(shí)候,程序員可以自定義一些異常類來描述自身程序中的異常信息。

?程序員自定義異常必須是Throwable的直接或間接子類。

?在程序中獲得異常信息一般會(huì)調(diào)用異常對象的getMessage,printStackTrace,toString方法,所以自定義異常一般會(huì)重寫以上三個(gè)方法。

public class SpecialException extends Exception {@Overridepublic String getMessage() {return "message";}@Overridepublic void printStackTrace() {System.out.println(message);}@Overridepublic String toString() {return "message";} }

?

字符串

String

String是字符串final常量類,值一經(jīng)賦值,其值不可變(指的是所指向的內(nèi)存值不可修改,但可以改變指向),而且無法被繼承。

初始化

?String name= new String(“小貓”);

和創(chuàng)建對象過程沒有區(qū)別,創(chuàng)建一個(gè)新的String對象,并用name指向它。

?String sex = “女”;

過程:

  • 先在常量池中查找“女”,如果沒有則創(chuàng)建對象
  • 在棧中創(chuàng)建引用sex,
  • 將sex指向?qū)ο蟆芭?/strong>
  • String s1 = "abc"; //"abc"是一個(gè)對象 String s2 = new String("abc"); //這里變成兩個(gè)對象,在內(nèi)存中存在兩個(gè),包括對象“abc” 和 new 出來的對象 String s3 = "abc"; //這里的‘a(chǎn)bc’?和s1的‘a(chǎn)bc’是同一個(gè)對象,二者的內(nèi)存地址一樣。System.out.println(s1==s2);//false System.out.println(s1==s3);//true

    部分api

    字符串連接concat(String str)、“+”運(yùn)算符 字符串查找indexOf (String str)、lastIndexOf(String str)、charAt(int indexOf) 字符串分割split(String regex) 字符串比較compareTo(String str): 忽略大小寫equalslgnoreCase(String str) 變成字符數(shù)組toCharArray()

    StringBuild和 StringBuffer

    因?yàn)镾tring的值是不可變的,每次對String的操作都會(huì)生成新的String對象,這樣效率低下,大量浪費(fèi)空間。

    第一行:我們先棧里起名字叫cat,在堆里開辟空間,存入“小貓”,并用cat指向它

    第二行:我們新開辟了一個(gè)空間,存入“小貓world”,并用cat指向它。

    這個(gè)過程顯然又費(fèi)時(shí)又費(fèi)力。

    為了應(yīng)對字符串相關(guān)的操作,谷歌引入了兩個(gè)新的類:StringBuffer類和StringBuild類,它們能夠被多次的修改,并且不產(chǎn)生新的未使用對象。

    StringBuild和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問),StringBuffer是線程安全的。(StringBuffer 中的方法大都采用了 synchronized 關(guān)鍵字進(jìn)行修飾)

    由于?StringBuilder 相較于 StringBuffer 有速度優(yōu)勢,所以多數(shù)情況下建議使用?StringBuilder 類。

    在應(yīng)用程序要求線程安全的情況下,則必須使用?StringBuffer 類。

    集合

    map/set

    每一種set有對應(yīng)類型的map

    HashSet(map)無序,底層哈希表+鏈表(1.8后,數(shù)量大于8后鏈表改為紅黑樹優(yōu)化性能),增刪改查O(1)

    TreeSet(map)有序(人規(guī)定排序的規(guī)則),底層是紅黑樹,但是增刪改查O(logN)

    LinkerHashSet(map)添加一個(gè)雙向鏈表維護(hù)了插入的順序。

    一般情況用HashSet(map)因?yàn)樾矢?/strong>

    list

    ArrayList,底層是數(shù)組,查詢快,增刪慢。

    線程不安全,速度快

    Vector, 底層是數(shù)組,查詢快,增刪慢。

    線程安全,速度慢

    LinkedList,底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢,增刪快。

    線程不安全,速度快

    PriorityQueue優(yōu)先隊(duì)列,底層是堆。增刪改查O(logN)

    API

    ArrayList<Integer> list=new ArrayList<Integer>();增:add(E e):將指定的元素添加到此列表的尾部add(int index, E element):將指定的元素插入此列表中的指定位置 刪:remove(int index):移除此列表中指定位置上的元素 改:set(int index, E element):用element替換index上的數(shù) 查:get(int index):返回下標(biāo)index上的元素size():返回此列表中的元素?cái)?shù) //map Map<Integer, Integer> map=new HashMap<Integer, Integer>();int size()//K-V關(guān)系數(shù)量 boolean isEmpty()//是否為空 增:V put(K?key,V?value)//放入K-V鍵值對void putAll(Map<K,V> m)//放入m包含的所以鍵值對 刪:V remove(Object?key)//刪除key對應(yīng)的鍵值對void clear()//刪除所有鍵值對 改:直接put,會(huì)覆蓋舊的記錄 查:boolean containsKey(Object?key)//是否包含keyboolean containsValue(Object?value)//是否包含valueV get(Object?key)//得到key對應(yīng)的value 生成集合:Set<K> keySet()//返回包含所有key的setCollection<V> values()//返回包含所有value的CollectionTreeMap特有: public K firstKey()//返回第一個(gè)key(最高) public K lastKey()//返回最后一個(gè)key(最低) //set,大部分和map類似 增:add 刪:remove 查:contains

    Iterator

    主要功能:用于對容器的遍歷

    主要方法:

    boolean hasNext():判斷是否有可以元素繼續(xù)迭代

    Object next():返回迭代的下一個(gè)元素

    void remove():從迭代器指向的集合中移除迭代器返回的最后一個(gè)元素

    例子:

    Set<String> name = new HashSet<String>(); name.add("LL"); name.add("VV"); name.add("WW"); ......Iterator<String> it = name.iterator(); while(it.hasNext()){String n = it.next();... }

    HashMap相關(guān)

    HashMap

    • ?哈希沖突:若干Key的哈希值如果落在同一個(gè)數(shù)組下標(biāo)上,將組成一條鏈,對Key的查找需要遍歷鏈上的每個(gè)元素執(zhí)行equals()比較,1.8后優(yōu)化為紅黑樹
    • 負(fù)載極限,“負(fù)載極限”是一個(gè)0~1的數(shù)值,“負(fù)載極限”決定了hash表的最大填滿程度。當(dāng)hash表中的負(fù)載因子達(dá)到指定的“負(fù)載極限”時(shí),hash表會(huì)自動(dòng)成倍地增加容量(桶的數(shù)量),并將原有的對象重新分配,放入新的桶內(nèi),這稱為rehashing。默認(rèn)當(dāng)HashMap中的鍵值對達(dá)到數(shù)組大小的75%時(shí),即會(huì)rehashing。

    解釋0.75:

    是時(shí)間和空間成本上的一種折中:

    • 較高的“負(fù)載極限”(也就是數(shù)組小)可以降低占用的空間,但會(huì)增加查詢數(shù)據(jù)的時(shí)間開銷
    • 較低的“負(fù)載極限”(也就是數(shù)組大)會(huì)提高查詢數(shù)據(jù)的性能,但會(huì)增加hash表所占用的內(nèi)存開銷

    可以根據(jù)實(shí)際情況來調(diào)整“負(fù)載極限”值。

    多線程比較

    HashMap

    線程不安全

    HashTable

    線程安全,實(shí)現(xiàn)的方式是在修改數(shù)據(jù)時(shí)鎖住整個(gè)HashTable,效率低,ConcurrentHashMap做了相關(guān)優(yōu)化

    ConcurrentHashMap

    線程安全,其關(guān)鍵在于使用了鎖分離技術(shù)。它使用了多個(gè)鎖來控制對hash表的不同部分進(jìn)行的修改。

    ConcurrentHashMap內(nèi)部使用段(Segment)來表示這些不同的部分,每個(gè)段其實(shí)就是一個(gè)小的Hashtable,它們有自己的鎖。

    只要多個(gè)修改操作發(fā)生在不同的段上,它們就可以并發(fā)進(jìn)行。

    默認(rèn)將hash表分為16個(gè)桶,諸如get、put、remove等常用操作只鎖住當(dāng)前需要用到的桶,讀操作大部分時(shí)候都不需要用到鎖。

    (JDK1.8已經(jīng)摒棄了Segment,并發(fā)控制使用Synchronized和CAS來操作,整個(gè)看起來就像是優(yōu)化過且線程安全的HashMap,雖然在JDK1.8中還能看到Segment的數(shù)據(jù)結(jié)構(gòu),但是已經(jīng)簡化了屬性,只是為了兼容舊版本。)

    ?

    泛型

    泛型用一個(gè)通用的數(shù)據(jù)類型T來代替類,在類實(shí)例化時(shí)指定T的類型,運(yùn)行時(shí)自動(dòng)編譯為本地代碼,運(yùn)行效率和代碼質(zhì)量都有很大提高,并且保證數(shù)據(jù)類型安全。

    泛型的作用就是提高代碼的重用性,避免強(qiáng)制類型轉(zhuǎn)換,減少裝箱拆箱提高性能,減少錯(cuò)誤。

    總結(jié)

    以上是生活随笔為你收集整理的复习Java的精华总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。