Java 基礎
1.JDK 和 JRE 有什么區別?
java development kit:java開發工具包,提供開發環境和運行環境
java runtime environment:java運行環境,為java的運行提供了所需的環境
2.== 和 equals 的區別是什么?
==
- 基本型別:比較的是值是否相同;
- 參考型別:比較的是參考是否相同;
equals不重寫的話本質上就是==,其原始碼就是用的==
總結來說== 對于基本型別來說是值比較,對于參考型別來說是比較的是參考;而 equals 默認情況下是參考比較,只是很多類重寫了 equals 方法,比如 String、Integer 等把它變成了值比較,所以一般情況下 equals 比較的是屬性值是否相等,
3.兩個物件的 hashCode()相同,則 equals()也一定為 true,對嗎?
不對,因為在散串列中,hashCode()相等即兩個鍵值對的哈希值相等,然而哈希值相等,并不一定能得出鍵值對相等,
可以自己重寫hashcode(),可以自己定義哈希碼的生成規則
object中定義的hashcode方法生成的哈希碼和物件本身的屬性值無關
hashmap中,借助equals和hashcode方法來完成資料的存盤
4.final 在 java 中有什么作用?
final修飾的類不能繼承
final修飾的方法不能被重寫
final修飾的變數叫常量,常量的值必須初始化,且初始化的值不能被修改
5.java 中的 Math.round(-1.5) 等于多少?
值為-1,round()方法在實作四舍五入的時候實際上是不論正負的,它會先將這個數加上0.5然后在像下取整.
6.String 屬于基礎的資料型別嗎?
不屬于,只有8種基礎型別,String屬于物件
7.java 中操作字串都有哪些類?它們之間有什么區別?
String:生成的是不可變物件,每呼叫一次都會創建新的物件,將指標指向新的String
StringBuffer 執行緒是安全的,適用于多執行緒
StringBulider執行緒不安全,適用于單執行緒
后兩者都可以對原有的物件進行操作
8.String str="i"與 String str=new String(“i”)一樣嗎?
不一樣,因為前者生成的資料被存放在常量池中,后者則是放在堆當中
9.如何將字串反轉?
使用StringBuffer或StringBulider的reverse()方法
10.String 類的常用方法都有那些?
- indexOf():回傳指定字符的索引,
- charAt():回傳指定索引處的字符,
- replace():字串替換,
- trim():去除字串兩端空白,
- split():分割字串,回傳一個分割后的字串陣列,
- getBytes():回傳字串的 byte 型別陣列,
- length():回傳字串長度,
- toLowerCase():將字串轉成小寫字母,
- toUpperCase():將字串轉成大寫字符,
- substring():截取字串,
- equals():字串比較,
11.抽象類必須要有抽象方法嗎?
抽象類不一定需要抽象方法,但有抽象方法的類一定會是抽象類
12.普通類和抽象類有哪些區別?
普通類不能含有抽象方法,抽象類則不一定
抽象類不能實體化,普通類可以實體化
13.抽象類能使用 final 修飾嗎?
不能,定義抽象類是為了讓其他類繼承的,final修飾的類不能被繼承
14.介面和抽象類有什么區別?
實作:抽象類繼承使用extends,介面則需要使用implements
建構式:抽象類可以有,介面不能有
main方法:抽象類可以有可以運行,介面類不能有main方法
實作數量:類可以實作多個介面;但是只能繼承一個抽象類
訪問修飾符:介面中使用的public,抽象類中都可以使用
15.java 中 IO 流分為幾種?
分為輸入流和輸出流
分為位元組流(8進制),字符流(16進制)
16.BIO、NIO、AIO 有什么區別?
- BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,并發處理能力低,
- NIO:New IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和服務器端通過 Channel(通道)通訊,實作了多路復用,
- AIO:Asynchronous IO 是 NIO 的升級,也叫 NIO2,實作了異步非堵塞 IO ,異步 IO 的操作基于事件和回呼機制,
17.Files的常用方法都有哪些?
-
Files.exists():檢測檔案路徑是否存在,
-
Files.createFile():創建檔案,
-
Files.createDirectory():創建檔案夾,
-
Files.delete():洗掉一個檔案或目錄,
-
Files.copy():復制檔案,
-
Files.move():移動檔案,
-
Files.size():查看檔案個數,
-
Files.read():讀取檔案,
-
Files.write():寫入檔案,
集合類怎么解決高并發問題?
執行緒中的非安全的集合類ArrayList、HashSet我們用到的比較多
普通的安全集合類
juc
ConcurrentHashMap
hashmap執行緒安全的方式?
1.通過collections.sychronizedMap()方式,會使用封裝類來實作安全,使用sychroized鎖住
2.concurrentmap通過對hashmap重寫,使用的是新的鎖機制,使用的是NonfaieSync
描述一下Object類中的常用方法
toString :回傳一個字串,定義一個物件的字串表現形式,可以重寫方法
hashCode:
equals:
clone:回傳一個物件的副本(比創建一個物件方便) 深克隆和淺克隆 重寫是要實作Cloneable方法
finalized:回收
1.8新特性:
Lambda運算式(內部類)函式式介面 函式式編程
重寫 多載的區別
重寫:繼承中對父類的方法進行重寫
多載:在同一個類當中發生的,減少方法名
java中的自增是執行緒安全嗎,如何實作執行緒安全的自增?
不是安全的
增加syncahronized進行執行緒同步
使用lock、unlock處理Reetrantent鎖進行鎖定
hashmap在1.8后的改變
資料結構:1.7中使用的資料+單向鏈表1.8中使用資料+單向鏈表+紅黑樹1
鏈表插入節點的方式:1.7中是頭插法1.8尾插法
為什么hashmap擴容的是兩倍?
1.8擴容之后,需要重新計算元素位置,其中計算時用的與陣列長度-1和hash碼進行與運算,防守hash沖突
解決hash沖突的方法
1.開放定址法2.再哈希法
3.鏈地址法,將每一個hash表的next的指標,構成一個單向鏈表
4.建立公共溢位區
用紅黑樹不用AVL樹
Hashmap為什么使用紅黑樹?
在鏈表長度大于8(泊松分布)的時候,將后面的資料存在紅黑樹中,加快檢索速度
保證紅黑樹的查找、插入、洗掉的時間復雜度最壞為o(log2n)加快檢索速度
AVL平衡度要求高高,會需要使用旋轉,左旋,紅黑樹旋轉的次數少,插入洗掉等效率高
Tomcat為什么要重寫加載類
類加載器的雙親委派:一次向上詢問,然后依次向下回答
java運行時資料區
反射,反射會不會影響性能
運行中可以動態的獲取物件,動態的獲取資訊獲取功能就是反射
反射方式實體化物件比正常的要慢,偶爾使用反射,反射的影響可以忽略不計
sleep和wait區別
1.方法所屬的類不一樣一個是thread中的wait是object類中
2.暫停了執行指定的時間,讓出cpu,sleep不會釋放鎖
3.wait會放棄鎖
4.sleep用thread呼叫,在非同步的狀態也可以呼叫
syncahroized(jvm)和reentrantlock(jdk)
相同點:
1.都用來協調多執行緒共享物件、變數的訪問
2.都是可重入鎖,同一執行緒可以多次獲得同一個鎖
不同點:
1.reentrantlock可以顯式獲得釋放鎖,syncahroized隱式的
2.在例外中reentrantlock要放在final陳述句中syncahroized是一個關鍵字會自動釋放執行緒占有的鎖
3.lock可以讓等待鎖的執行緒回應中斷,而syncahroized會一直等待下去
4.lock可以提高多個執行緒進行讀取的效率,多個執行緒使用共享鎖,寫執行緒用的排它鎖
trylock和lock和lockinterruptibly的區別
1.trylock能獲得鎖就回傳true,不能就立即回傳false
2.lock能獲得鎖就立刻回傳ture,不能的話就一直等待獲得鎖
3.lock和lockinterruptibly,若中斷兩個執行緒,lock不會拋出例外,后一個會拋出例外
單例模式有哪些實作方法優缺點
單例模式:一個類只有能產生一個物件,提高作業效率,減少資源的占用
組成部分:
1.私有的構造方法
2.私有的當前類的物件作為靜態屬性
3.共有的向外界提供當前類的物件的靜態方法
有餓漢式,懶漢式,內部式
餓漢式:上來就直接new一個物件,然后回傳這個物件,無法實作延遲類的加載
懶漢式:當呼叫的時候先檢測是否有這個物件,如果沒有就創建物件然后回傳,多執行緒的情況下會同時new多個物件,因此就會加個鎖來限制,但是需要判斷兩次物件是否為空,雙重檢測鎖機制(volatile)定義物件需要加
靜態內部類單例模式:定義一個靜態內部的類,然后當使用一個方法時才會靜態呼叫這個內部類的方法
序列化
將物件序列化表示為位元組序列,方便存入檔案資料庫,或者讀取
使用的時候:需要通過網路之間發送的話,都需要使用
物體類都要實作序列化介面
使用transient關鍵字可以使物件不序列化
java基礎語法知識
java運行程序
1.編譯javac,把Java源檔案編譯成class位元組碼檔案
2.運行java
識別符號
1.以字母、下劃線 開 頭 2. 其 余 部 分 可 以 是 字 母 下 劃 線 開頭 2.其余部分可以是字母下劃線 開頭2.其余部分可以是字母下劃線
3.不能為關鍵字變數
1.區域變數:定義在方法內或陳述句內,從屬于方法或陳述句塊,使用之前必須手動初始化
2.成員變數(實體變數):定義在類里面、方法外面,從屬于物件,若沒有手動初始化變數,系統會自動初始化,
數字:0.0,0 布爾:false char:、\u0000
3.靜態變數:定義在類里面、方法外面、使用static修飾從屬于類
資料型別
1.基本資料型別
a)數字:整數:byte(1位元組)short(2個位元組)int默認該型別(4位元組)long(8位元組)
浮點數:float(4個位元組)double(8位元組)默認型別
byte short char可以自動轉化為int 其余則是用強制型別轉化
b)字符char(2個位元組)
c)布爾 boolean(1位)
2.參考型別(4個位元組)
a)陣列
b)物件
c)介面
運算式:
1.型別的自動提升
如果有long(double),結果就是long(double)
2.強制轉型
運算子:
1.算術運算子
2.關系運算子
3.邏輯運算子(與或非)&&,||,!(左右兩邊均是布爾型)
&,| (3&4)
4.位運算子
&,|,<<(左移一位相當于乘以2),>>>(右移一位相當于除以2)
5.擴展運算子
6.三目運算子
(布爾運算式)?A:B
控制陳述句:
1.順序結構
2.選擇結構:if if else if else if else switch 多值選擇 運算式:int、char short byte
3.回圈結構
面向物件基礎:
1.物件的進化史
a)基本資料型別階段 資料少 無資料結構管理時代
b)陣列 資料多了,將同型別資料放在一起 弱資料管理時代
c)結構體 資料多了,復雜了,將不同的資料型別的資料放在一起 強管理
d)物件 資料多了、型別復雜了、行為也復雜了,將不同型別的資料放在一起
2.物件和類:物件是具體的,類是抽象的,類是一個模板,通過類的模板new物件
定義類:
(public)class(類名){
//屬性
private 修飾 //建議增加相應的getter、seeter方法
//方法
//構造方法
}
構造方法:
1.方法名必須和類名一致
2.無回傳型別
3.通過new來呼叫
4.無參構造器問題
a)如果為手動定義構造器,系統將會自動添加一個無參的構造器
b)如果定義過則不會添加
5.構造方法的第一句總是super,就是呼叫直接父類的構造方法,有繼承關系的構造方法呼叫順序
方法的多載(overload):
兩同(同一個類、同一個方法名)三不同(引數不同:型別、個數、順序)
回傳值不同不能構成多載
形參名稱不同不能構成多載
this:普通方法中,呼叫本方法的物件,構造方法中,正要初始化的物件
還可以用來呼叫其他的構造方法
super:就是呼叫直接父類的構造方法,有繼承關系的構造方法呼叫順序
static:修飾的變數和方法,變成靜態變數和靜態方法,從屬于類 ,通過類名可呼叫實際存盤在方法區中
package:位于非注釋行的第一句
import:引入類
final:修飾變數:常量(命名規范:全部大寫,多個單詞之間通過下劃線隔開)
修飾方法:不能被重寫
修飾類:不能被繼承
面向物件的三大特征:
封裝
通過private、public、default、protected關鍵字實作屬性或者方法的封裝
高內聚、低耦合
繼承
通過extends 優點:1.代碼重用2.通過繼承實作對現實世界更加準確的建模
類只能單繼承,沒有c++的多繼承
方法的重寫:=:方法名保持一致>=子類的權限可以大于等于父類<=子類的回傳值型別小于等于父類的型別,子類宣告的例外型別不能超過父類的型別
Object類:
1.根基類
2.toString
3.equal、hashcode
4.wait、notify、notifyAll
多型
三個必要條件:繼承、方法的重寫、父類參考指向子類物件
動態系結、靜態系結:java比較慢
抽象類:
1.包含抽象方法的類,一定是抽象類
2.抽象類不能被new
3.抽象類可以包含:普通方法、成員變數、構造方法
介面:
1.interface
2.類實作介面:implements 可以實作多個介面
3.介面可以多繼承
記憶體機制:
堆疊1.存放區域變數2.不可以被多個執行緒共享3.空間連續、速度快
堆1.存放物件2.可以被多個執行緒共享3.空間不連續速度慢但是靈活
方法區
1.存放類的資訊:代碼、靜態變數、字串常量等
2.可以被多個執行緒共享
垃圾回收器(GC Garbage Collection):
1.程式員無法呼叫垃圾回收器,但是可以通過system,gc建議回收
2.finallize:一般不會呼叫
例外機制:
1.try catch finally
2.宣告拋出例外:throws
3.手動拋出例外:throw
4.自定義例外extends Exception或者他的子類
陣列:
1.長度固定,不可變
2.所有元素的型別一致
3.元素型別可以為任意型別
4.Arrays類:包含了對陣列的排序、查找
容器:1.Collection
a)list(有序可重復)
ArrayList底層用陣列實作,執行緒不安全,效率高
LinkedList:底層用雙向鏈表實作,執行緒不安全,效率高
Vector:底層用陣列實作,執行緒安全,效率低
b)Set(無序,不可重復)
HashSet(內部使用HashMap實作)
2.Map
采用“key-value”來存盤資料
a)HashMap執行緒不安全,效率高
b)HashTable執行緒安全,效率低
3.iterator
用過它可以實作遍歷容器中的元素
4.泛型
5.Collections工具類
常用類:
1.包裝類:實作了基本資料型別和物件的相互轉化,自動裝箱、自動拆箱
2.String/StringBulider/StringBuffer
String:不可變字符序列
StringBulider:可變字符序列,執行緒不安全
StringBuffer:可變字符序列,執行緒安全
3.時間:Date、DateFormat、Calendar
Date:使用毫秒數來表示時間
DateFormat:實作Date物件和String物件相互轉化(根據制定格式轉化)
Calendar:日期類,實作人的日期和Date相互轉化
4.File(檔案)
5.math
6.列舉,若定義一組常量就是使用列舉
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/275135.html
標籤:java
