5Java基礎整理

1.API:Application programming interface

舉例:System類中的 public static void arraycopy(int[] src,int srcPos,int[] dest,int[] desst,int destPos,int length),實現數組的複製。java

若是destnull ,那麼會拋出一個NullPointerException若是srcnull ,則拋出一個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個位置上。app

與冒泡排序的區別:冒泡排序每一輪可能會有屢次交換,選擇排序每一輪只有一次交換。jvm

二分查找:基於有序的數組,每一輪將查找區間分爲兩部分,若是未找到,就到可能存在的區間中進行查找,直到區間中沒有元素。函數

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) 填充必定區域的數組ui

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.

相關文章
相關標籤/搜索