java基礎(chǔ)
1.排序
/*
選擇排序。
特點(diǎn):
在內(nèi)循環(huán)第一次結(jié)束,最值出現(xiàn)最低角標(biāo)位。
*/
public static void selectSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=x+1; y<arr.length; y++)
{
if(arr[x]<arr[y])
{
/*
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
*/
swap(arr,x,y);
}
}
}
}
/*冒泡排序旁钧。
特點(diǎn):相鄰兩個(gè)元素進(jìn)行比較。
內(nèi)循環(huán)結(jié)束一次互拾,最值出現(xiàn)在最后角標(biāo)位。
*/
public static void bubbleSort(int[] arr)
{
for(int x=0; x<arr.length-1; x++)
{
for(int y=0; y<arr.length-x-1; y++)
{
if(arr[y]>arr[y+1])
{
/*
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
*/
swap(arr,y,y+1);
}
}
}
}
二分查找(折半查找)
/**
* 二分查找
*
* @param arr 數(shù)據(jù)源
* @param key 查找的數(shù)據(jù)
* @return 在arr里的位置
*/
private int halfSearch(int[] arr, int key) {
int min, mid, max;
min = 0;
max = arr.length - 1;
while (min <= max) {
mid = (min + max) / 2;
if (key > arr[mid]) {
min = mid + 1;
} else if (key < arr[mid]) {
max = mid - 1;
} else {
return mid;
}
}
return -1;
}
2.static final
static有三種形式嚎幸,靜態(tài)方法颜矿,靜態(tài)變量,靜態(tài)代碼塊嫉晶。
靜態(tài)在隨著類加載的時(shí)候就一起加載骑疆。
靜態(tài)只能調(diào)用靜態(tài)變量;
靜態(tài)方法只能調(diào)用靜態(tài)方法替废;
不能以任何形式引用this,super;
靜態(tài)方法的調(diào)用不依附于實(shí)例對(duì)象
final
在Java中箍铭,final關(guān)鍵字可以用來(lái)修飾類、方法和變量(包括成員變量和局部變量)椎镣。
當(dāng)修飾類的時(shí)候诈火,該類不能被繼承。
當(dāng)修飾方法的時(shí)候状答,該方法不能被重寫冷守。
當(dāng)修飾變量的時(shí)候,如果是基本數(shù)據(jù)類型的變量惊科,則其數(shù)值一旦在初始化之后便不能更改拍摇;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象馆截。
3.基本數(shù)據(jù)類型
類型 | 字節(jié) | 位數(shù) |
---|---|---|
byte | 1字節(jié) | 8位 |
short | 2字節(jié) | 16位 |
int | 4字節(jié) | 32位 |
long | 8字節(jié) | 64位 |
double | 8字節(jié) | 64位 |
float | 4字節(jié) | 32位 |
char | 2字節(jié) | 16位 |
boolean | 1字節(jié) | 8位 |
4.集合
list
ArrayList 數(shù)組結(jié)構(gòu)充活,線程不安全的,查詢速度快蜡娶。
LinkedList 鏈表結(jié)構(gòu)混卵,線程不安全,插入和刪除的速度快翎蹈。
vector 數(shù)組結(jié)構(gòu)淮菠,線程安全。無(wú)論增刪或者查詢效率都很低荤堪。被ArrayList替代合陵。
set
存入set的每個(gè)元素都必須是唯一的枢赔,因?yàn)閟et不保存重復(fù)元素。
HashSet 哈希表結(jié)構(gòu)拥知,為快速查找而設(shè)計(jì)踏拜,效率高
TreeSet 二叉樹(shù)結(jié)構(gòu),使用它可以從set中提取有序的序列低剔。
map
HashMap基于散列表的實(shí)現(xiàn)速梗,可以存儲(chǔ)鍵值對(duì)形式的數(shù)據(jù),可以null鍵值襟齿,效率高姻锁,線程不安全。
LinkedHashmap 基于hashmap的結(jié)構(gòu)之上猜欺,其默認(rèn)獲取數(shù)據(jù)的順序是插入順序位隶。也可以通過(guò)構(gòu)造方法設(shè)置為最近最少使用的次序(LRU)。
TreeMap基于紅黑樹(shù)的實(shí)現(xiàn)开皿,查看數(shù)據(jù)的時(shí)候涧黄,會(huì)被排序。
5.線程
1.繼承Thread
2.實(shí)現(xiàn)Runable接口
3.實(shí)現(xiàn)Callable,和Runable的區(qū)別是有回調(diào)方法赋荆。
區(qū)別 :實(shí)現(xiàn)Runable接口擴(kuò)展性更好笋妥,因?yàn)槔^承只能單向繼承
什么是線程?
線程是操作系統(tǒng)運(yùn)行的最小單元窄潭;進(jìn)程里包含了多個(gè)線程春宣,他們處理不同的任務(wù),組成了一個(gè)應(yīng)用或者一個(gè)系統(tǒng)的整體邏輯狈孔。
sleep和wait的區(qū)別 最大的不同是在等待時(shí) wait 會(huì)釋放鎖信认,而 sleep 一直持有鎖。wait 通常被用于線程間交互均抽,sleep 通常被用于暫停執(zhí)行嫁赏。
Thread.yield():讓步,當(dāng)一個(gè)線程執(zhí)行yield()方法油挥,證明該線程執(zhí)行讓步潦蝇,讓其他線程有可能的獲取資源運(yùn)行。
**Thead.join(): **加入深寥,當(dāng)一個(gè)線程執(zhí)行join(),證明該線程執(zhí)行加入操作攘乒,會(huì)終止當(dāng)前正在運(yùn)行的線程,開(kāi)始執(zhí)行join的線程惋鹅。
Thread 優(yōu)先級(jí):Thread.currentThread().setPrority(value);value=Max_prority;Norm_priority;Min_priority;三種不同的優(yōu)先等級(jí)则酝;
Thread.setDaemon(boolean);設(shè)置當(dāng)前線程為后臺(tái)線程,后臺(tái)線程要在start之前調(diào)用才有效闰集。后臺(tái)線程沽讹,是指程序運(yùn)行的時(shí)候在后臺(tái)提供一種通用服務(wù)的線程般卑,且這種線程并不屬于程序中不可或缺的部分;只要有任何非后臺(tái)線程在運(yùn)行爽雄,程序就不會(huì)終止蝠检。
線程池:是統(tǒng)一管理線程的服務(wù)對(duì)象。優(yōu)點(diǎn)是通過(guò)控制線程的創(chuàng)建和銷毀挚瘟,節(jié)省資源叹谁,提高效率。
6.面向?qū)ο蟪烁牵庋b焰檩、繼承、多態(tài)
封裝:隱藏實(shí)現(xiàn)細(xì)節(jié)订框,提高程序的復(fù)用性和維護(hù)性
繼承:子類繼承父類锅尘,表明子類擁有父類的屬性和方法(注意是public protected修飾符的)
多態(tài):父類引用指向子類對(duì)象
抽象類和接口的區(qū)別
抽象類是abstract修飾的類,表示該類不足以描述一個(gè)具體的事物或者對(duì)象布蔗,就叫抽象類。
接口是一系列方法的聲明浪腐,是一些方法特征的集合纵揍,一個(gè)接口只有方法的特征沒(méi)有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn)议街,而這些實(shí)現(xiàn)可以具有不同的行為或者功能泽谨。
抽象類可以存在非抽象的方法和變量。接口中除了static特漩、final變量吧雹,不能有其他變量
抽象類可以有構(gòu)造器,但接口不能有涂身。
抽象類的方法可以用public雄卷、protected和default這些修飾符,但接口只能用public修飾蛤售。
抽象類是繼承關(guān)系丁鹉,而接口是實(shí)現(xiàn)關(guān)系。
7.泛型
- 概念:編寫的代碼可以被不同的對(duì)象類型所重用悴能。泛型的本質(zhì)是參數(shù)化類型揣钦。所操作的數(shù)據(jù)類型被指定為一個(gè)參數(shù)。有三種形式:泛型類漠酿、泛型方法冯凹、泛型接口
- 出現(xiàn):有許多原因促成了泛型的出現(xiàn),而最引人注意的一個(gè)原因炒嘲,就是為了創(chuàng)建容器類宇姚。
- 泛型好處:
類型安全:提高java程序的類型安全匈庭,編譯時(shí)期就可以檢查出類型不正確導(dǎo)致的類型轉(zhuǎn)換異常,消除強(qiáng)制類型轉(zhuǎn)換空凸。
泛型進(jìn)階
泛型的通配符:
<?> 無(wú)限制通配符
<? extends E> extends 關(guān)鍵字聲明了類型的上界嚎花,表示參數(shù)化的類型可能是所指定的類型,或者是此類型的子類
<? super E> super 關(guān)鍵字聲明了類型的下界呀洲,表示參數(shù)化的類型可能是指定的類型紊选,或者是此類型的父類
泛型的類型擦除:當(dāng)編譯器對(duì)帶有泛型的java代碼進(jìn)行編譯時(shí),它會(huì)去執(zhí)行類型檢查和類型推斷道逗,然后生成普通的不帶泛型的字節(jié)碼兵罢,這種普通的字節(jié)碼可以被一般的 Java 虛擬機(jī)接收并執(zhí)行,這在就叫做 類型擦除(type erasure)滓窍。
擦除的實(shí)現(xiàn)原理:Java 編輯器會(huì)將泛型代碼中的類型完全擦除卖词,使其變成原始類型。
當(dāng)然吏夯,這時(shí)的代碼類型和我們想要的還有距離此蜈,接著 Java 編譯器會(huì)在這些代碼中加入類型轉(zhuǎn)換,將原始類型轉(zhuǎn)換成想要的類型噪生。這些操作都是編譯器后臺(tái)進(jìn)行裆赵,可以保證類型安全。
總之泛型就是一個(gè)語(yǔ)法糖跺嗽,它運(yùn)行時(shí)沒(méi)有存儲(chǔ)任何類型信息战授。