1.API:Application programming interface
舉例:System類中的 public static void arraycopy(int[] src,int srcPos,int[] dest,int[] desst,int destPos,int length),實作陣列的復制,
如果dest是null ,那么會拋出一個NullPointerException , 如果src是null ,則拋出一個NullPointerException并且目標陣列不被修改,
2.常用演算法:
遞回:每一級的函式呼叫都有自己的變數;每一次的函式的呼叫都會有一次回傳;遞回函式中,位于遞回呼叫前的陳述句和各級被呼叫的函式具有相同的執行順序,位于遞回呼叫后的陳述句和各級被呼叫的函式具有相反的執行順序,函式的代碼并不會得到復制,
排序演算法:
冒泡排序:一共執行n-1次,每次進行比上一輪少一次的相鄰兩數比較,并將最大的元素移動到n-i個位置,
public class BubbleSort {
public static void main(String[] args) {
int[] arr= new int[]{3,15,2,6,4,7,9,8};
BubbleSort b = new BubbleSort();
b.BubbleSort(arr);
b.sysArr(arr);
}
public void BubbleSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1;j++){
if(arr[j]>arr[j+1]) swap(arr,j,j+1);
}
}
}
public void swap(int[] arr,int index1,int index2){
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
//按照陣列格式輸出
public void sysArr(int[] arr){
String str = "[";
for(int a:arr)
str+=a+",";
str = str.substring(0,str.length()-1);
System.out.println(str+"]");
}
}
選擇排序:一共執行n-1次,每次從無序部分中選擇最小值(記住下標)放在第i個位置上,
與冒泡排序的區別:冒泡排序每一輪可能會有多次交換,選擇排序每一輪只有一次交換,
二分查找:基于有序的陣列,每一輪將查找區間分為兩部分,如果未找到,就到可能存在的區間中進行查找,直到區間中沒有元素,
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {12,32, 34,45, 54,65,71,82};
BinarySearch bs= new BinarySearch();
System.out.println( bs.binarySearch(arr,71));
System.out.println( bs.binarySearch(arr,70));
System.out.println(Arrays.binarySearch(arr,65));
System.out.println(Arrays.binarySearch(arr,60));
}
public boolean binarySearch(int[] arr,int num){
int left = 0,right = arr.length-1;
while(left<=right){
int mid = left+(right-left)/2;
if(arr[mid]==num) {
System.out.println(mid);
return true;
}
else if(arr[mid]<num) left = mid+1;
else right = mid-1;
}
return false;
}
}
3.Arrays工具類
常用方法:sort(int[] arr) 升序排序
fill(int[] arr,int fromIdx,int toIdx,int fillNum) 填充一定區域的陣列
4.面對物件思想 Object oriented programming
面對物件開發的階段:面對物件的分析階段(OOA) 設計階段(OOD) 編程(OOP)
面對物件指的是從生活中的具體事物提取特征,把現實生活中一類具有共同屬性的行為的事物抽象為類,類具體化為物件,類是物件的資料型別,類是具有相同屬性和行為的一組物件的集合,
5.物件的創建和參考:創建物件:類名(型別) 物件名(變數) = new 類名();
6.Java記憶體結構(JVM記憶體劃分):
JVM管理的記憶體區域,實際上是.class檔案執行時所需要存盤資料和相關資訊的空間,也稱為Runtime Data Area(運行時資料區),
運行時資料區又分為方法區(虛擬機堆疊)、堆區、堆疊區、PC暫存器和本地方法堆疊,

程式計數器:占用記憶體小,執行緒私有,生命周期與執行緒相同,作用大致為位元組碼行號指示器,
虛擬機堆疊:執行緒私有,生命周期與執行緒相同,使用連續的記憶體空間,作用是Java方法執行時的記憶體模型,存盤區域變數表、操作堆疊、動態鏈接、方法出口等資訊,會引發StackOverflowError OutOfMemoryError例外,(堆疊溢位記憶體例外)
Java堆:執行緒共享,生命周期與虛擬機相同,可以不使用連續的記憶體地址,作用是保存物件實體,所有物件實體(包括陣列)都要在堆上分配,會引發OutOfMemoryError(記憶體不足例外),
方法區:執行緒共享,生命周期與虛擬機相同,可以不使用連續的記憶體地址,存盤已被虛擬機加載的類資訊、常量、靜態變數、即時編譯器編譯后的機器代碼等資料,會引發OutOfMemoryError(記憶體不足例外),
運行時常量池:方法區的一部分,具有動態性,用于存盤字面量以及符號參考,
每一個運行在Java虛擬機中的執行緒都有自己的執行緒堆疊,
程式中創建的區域變數都存放在堆疊上,沒有默認值,創建的所有物件都在堆上,
void a(){
String s = "abc";//s在堆疊上,"abc"在常量池中
}
void a(){
String s = new String("abc");//s在堆疊上,物件在堆中
}
7.String類:String 是被final修飾的類,因此不能被繼承,
創建String:(1)使用雙引號賦值(2)借助String類包含的構造方法:String(String s);String(char[] value);String(char[] value, int offset, int count);
String類在Java中是不可變的物件(immutable),因此在使用concat()方法拼接字串時,本質上沒有拼接,而是又創建了一個新的字串,再把新字串賦值給原來的變數,

String中判斷字串相等:==用來判斷兩個字串物件是否相等,即堆疊中存放的參考物件地址是否相等;equals()方法用于判斷兩個字串內容是否相等,equals()判斷時,首先判斷是否是String型別,如果不是直接為false,
public boolean equals(Object anObject) {
if (this == anObject) {//同一個物件 1)
return true;
}
if (anObject instanceof String) {//字串型別 2)
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;//不符合1) 2)直接false
}
String創建:(1)String s = "abc";這種方式會創建1個String物件,首先會查看常量池中有沒有“abc”,如果不存在,就會在常量池中直接創建"abc",否則,直接回傳”abc“的參考,因此,String s1 ="abc";String s2 = "abc"; 此時s1==s2為true,
(2)String str = new String("abc"),這種方式,會創建2個String物件,首先在常量池中創建“abc”字串物件,然后再在堆中創建一個字串物件,將"abc"的字符陣列復制到堆中創建的物件的字符陣列上,因此,String str = new String("abc");String s = "abc";str==s為false,new String("xxx");總是會創建一個新的堆記憶體物件
(3)String ss = "abc".intern();這種方式會回傳一個字串物件參考,intern()是一個本地方法,作用是查看或者創建一個常量池中的字串參考并回傳,該方法常用于將某些經常訪問的字串物件保存在常量池中,避免經常創建物件,
(4)String m = new String("123")+new String("123");首先在常量池中創建一個"123"物件,再在堆中創建"123123"物件,并回傳參考,
(5)String s3 = m.intern();String s4 = "123123"; s3==s4為true,如果s3與s4反過來為false,因為上一句在堆中創建"123123",并沒有在常量池中創建,而intern()方法讀取常量池,發現沒有"123123"的常量,因此創建一個物件并回傳參考,s4再創建時,常量池中已經有了字串的參考,
(6)String s5 = "abc";String s6 = "abc"+"def";對于字面量的拼接,java會轉化為String s5 = "abcdef";實際上只創建了一個物件,
而String s5 = "abc";String s6= s5+"def";等同于在常量池中創建"abc"和"def"兩個物件,在堆中創建"abcdef"這個物件,它的實作程序等同于
String s5 = "abc";String s6 = new StringBuilder().append(s5).append("def").toString();
8.String常用方法
public char charAt(int index)
public int length()
public int indexOf(String str)
public int indexOf(String str,int fromIndex)從fromIdx開始搜索子串的位置
public boolean equalsIgnoreCase(String another)
public String replace(char oldChar,char newChar)
public boolean startsWith(String prefix)
public boolean endsWith(String suffix)
public String toUpperCase()
public String toLowerCase()
public String substring(int beginIndex)
public String substring(int beginIndex,int endIndex)
public String trim()
public static String valueOf(基本資料型別引數)
public String[] split(String regex) 要注意split方法中實際使用regex,所以.的分割要使用\\.
9.StringBuffer:執行緒安全 StringBuilder:非執行緒安全(快)
StringBuffer():構造一個空白的字串緩沖區,其初始容量為 16 個字符,(底層是長度為16的字符陣列)
StringBuffer(String str):構造一個字串緩沖區,并將其內容初始化為指定的字串內容,
StringBuffer主要方法:
public StringBuffer append(String str)
public StringBuffer append(StringBuffer str)
public StringBuffer append(char[] str)
public StringBuffer append(char[] str,int offset,int len)
public StringBuffer append(double d)
public StringBuffer append(Object obj)
public StringBuffer insert(int offset,String str)
StringBuffer是一個內容可變的字符序列,

10.java.util.Date類
Date(long millisec)
long getTime()
boolean after(Date date)
boolean before(Date date)
API 含義
Instant 時間戳
LocalDate 日期,如 2020-06-16
LocalTime 時刻,如 11:52:52
LocalDateTime 具體時間,如 2020-06-16 11:52:52
java.util包還提供了SimpleDateFormat、Calendar和Math類等常用類,
11.很多連在一起的分隔符的split()情況
String s1 = ",,,,,,k,x,,,x,x,,,,,,,,,"; for(String s:s1.split(",")) System.out.println(s.length());
String s1 = ",,,,,,k,x,,,x,x,,,,,,,,,";
for(String s:s1.split(","))
System.out.println(s.equals(""));
String s1 = ",,,,,,k,x,,,x,x,,,,,,,,,";
for(String s:s1.split(","))
System.out.println(s=="");
輸出結果為:
0 true false
0 true false
0 true false
0 true false
0 true false
0 true false
1 false false
1 false false
0 true false
0 true false
1 false false
1 false false
由此可以看出,當分隔符在其他文本的前面時,這個分隔符就會分出長度為空的物件“”,但是如果在所有的其他字符后面,就不會再分,
String s1 = new String(""); String s2 = new String(""); String s3 = ""; String s4 = ""; System.out.println(s1==s2); System.out.println(s3==s4);
由此可以看出,split()方法回傳的字串是在堆中new出來的字串物件,
12.System.out.println(res.substring(0,res.length()));最后一個引數可以是取不到的res.length()位置
scanner.next()遇到空白就結束 scanner.nextLine()讀取一整行
13.字串拼接
每次對String進行拼接操作,實際在jvm中都是new了一個新的String,隨著String的new的次數越多,會造成虛擬機速度下降,
效率:StringBuilder>StringBuffer(非執行緒安全快于執行緒安全)>String.concat>String+ == String+=
String類本身是final型別,字串拼接時,會使用StringBuffer,并呼叫append,之后再呼叫toString方法,
而StringBuffer轉換成String時,開銷相當大,中間不僅創立了臨時物件StringBuffer,還每次完后再要轉成String,
14.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296183.html
標籤:其他
上一篇:4網課內容總結
下一篇:6 Java基礎整理 第六-八章
