Java基礎知識

Java基礎知識

ffer:適用於多線程下在字符緩衝區進行大量操做的狀況。html

5.2示例

以拼接10000次字符串爲例,咱們看下三者各自須要的時間:java

String str = ""; long startTime = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { str = str + i; } long endTime = System.currentTimeMillis(); long time = endTime - startTime; System.out.println("String消耗時間:" + time); StringBuilder builder = new StringBuilder(""); startTime = System.currentTimeMillis(); for (int j = 0; j < 10000; j++) { builder.append(j); } endTime = System.currentTimeMillis(); time = endTime - startTime; System.out.println("StringBuilder消耗時間:" + time); StringBuffer buffer = new StringBuffer(""); startTime = System.currentTimeMillis(); for (int k = 0; k < 10000; k++) { buffer.append(k); } endTime = System.currentTimeMillis(); time = endTime - startTime; System.out.println("StringBuffer消耗時間:" + time);

運行結果:面試

String消耗時間:258
StringBuilder消耗時間:0
StringBuffer消耗時間:1spring

也驗證了上面所說的StringBuilder > StringBuffer > String。數組

6.裝箱和拆箱

6.1什麼是裝箱?什麼是拆箱?

裝箱:自動將基本數據類型轉換爲包裝器類型。springboot

拆箱:自動將包裝器類型轉換爲基本數據類型。多線程

Integer i = 10; // 裝箱 int j = i; // 拆箱

6.2 裝箱和拆箱是如何實現的?

裝箱過程是經過調用包裝器的valueOf方法實現的,而拆箱過程是經過調用包裝器實例的 xxxValue方法實現的。(xxx表明對應的基本數據類型)。app

怎麼證實這個結論呢,咱們新建個類Main,在主方法中添加以下代碼:post

package com.zwwhnly.springbootdemo; public class Main { public static void main(String[] args) { Integer i = 100; int j = i; } }

而後打開cmd窗口,切換到Main類所在路徑,執行命令:javac Main.java,會發現該目錄會生成一個Main.class文件,用IDEA打開,會發現編譯後的代碼以下:ui

// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.zwwhnly.springbootdemo; public class Main { public Main() { } public static void main(String[] var0) { Integer var1 = Integer.valueOf(100); int var2 = var1.intValue(); } }

6.3示例

示例1:

Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1==i2); System.out.println(i3==i4);

輸出結果:

false

false

爲何都返回false呢,咱們看下Double.valueOf()方法,就知曉了:

private final double value; public Double(double value) { this.value = value; } public static Double valueOf(double d) { return new Double(d); }

示例2:

Boolean i1 = false; Boolean i2 = false; Boolean i3 = true; Boolean i4 = true; System.out.println(i1==i2); System.out.println(i3==i4);

輸出結果:

true

true

爲何都返回true呢,咱們看下Boolean.valueOf()方法,就知曉了:

public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }

7.Java中的值傳遞和引用傳遞

7.1基本概念

值傳遞:傳遞對象的一個副本,即便副本被改變,也不會影響源對象,由於值傳遞的時候,其實是將實參的值複製一份給形參。

引用傳遞:傳遞的並非實際的對象,而是對象的引用,外部對引用對象的改變也會反映到源對象上,由於引用傳遞的時候,其實是將實參的地址值複製一份給形參。

說明:對象傳遞(數組、類、接口)是引用傳遞,原始類型數據(整形、浮點型、字符型、布爾型)傳遞是值傳遞。

7.2示例

示例1(值傳遞):

package com.zwwhnly.springbootdemo; public class ArrayListDemo { public static void main(String[] args) { int num1 = 10; int num2 = 20; swap(num1, num2); System.out.println("num1 = " + num1); System.out.println("num2 = " + num2); } public static void swap(int a, int b) { int temp = a; a = b; b = temp; System.out.println("a = " + a); System.out.println("b = " + b); } }

運行結果:

a = 20

b = 10

num1 = 10

num2 = 20

雖然在swap()方法中a,b的值作了交換,可是主方法中num1,num2的值並未改變。

示例2(引用類型傳遞):

package com.zwwhnly.springbootdemo; public class ArrayListDemo { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; change(arr); System.out.println(arr[0]); } public static void change(int[] array) { System.out.println(array[0]); array[0] = 0; } }

運行結果:

1

0

在change()方法中將數組的第一個元素改成0,主方法中數組的第一個元素也跟着變爲0。

示例3(StringBuffer類型):

package com.zwwhnly.springbootdemo; public class ArrayListDemo { public static void main(String[] args) { StringBuffer stringBuffer = new StringBuffer("博客園:周偉偉的博客"); System.out.println(stringBuffer); changeStringBuffer(stringBuffer); System.out.println(stringBuffer); } public static void changeStringBuffer(StringBuffer stringBuffer) { stringBuffer = new StringBuffer("掘金:周偉偉的博客"); stringBuffer.append(",歡迎你們關注"); } }

運行結果:

博客園:周偉偉的博客

博客園:周偉偉的博客

也許你會認爲第2次應該輸出「掘金:周偉偉的博客,歡迎你們關注」,怎麼輸出的仍是原來的值呢,那是由於在changeStringBuffer中,又new了一個StringBuffer對象,此時stringBuffer對象指向的內存地址已經改變,因此主方法中的stringBuffer變量未受到影響。

若是修改changeStringBuffer()方法的代碼爲:

public static void changeStringBuffer(StringBuffer stringBuffer) { stringBuffer.append(",歡迎你們關注"); }

則運行結果變爲了:

博客園:周偉偉的博客

博客園:周偉偉的博客,歡迎你們關注

示例4(String類型):

package com.zwwhnly.springbootdemo; public class ArrayListDemo { public static void main(String[] args) { String str = new String("博客園:周偉偉的博客"); System.out.println(str); changeString(str); System.out.println(str); } public static void changeString(String string) { //string = "掘金:周偉偉的博客"; string = new String("掘金:周偉偉的博客"); } }

運行結果:

博客園:周偉偉的博客

博客園:周偉偉的博客

在changeString()方法中無論用string = "掘金:周偉偉的博客";仍是string = new String("掘金:周偉偉的博客");,主方法中的str變量都不會受影響,也驗證了String建立以後是不可變動的。

示例5(自定義類型):

package com.zwwhnly.springbootdemo; public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Person(String name) { this.name = name; } }
package com.zwwhnly.springbootdemo; public class ArrayListDemo { public static void main(String[] args) { Person person = new Person("zhangsan"); System.out.println(person.getName()); changePerson(person); System.out.println(person.getName()); } public static void changePerson(Person p) { Person person = new Person("lisi"); p = person; } }

運行結果:

zhangsan

zhangsan

修改changePerson()方法代碼爲:

public static void changePerson(Person p) { p.setName("lisi"); }

則運行結果爲:

zhangsan

lisi

8.參考連接

關於==和equals的區別和聯繫,面試這麼回答就能夠

Java中==號與equals()方法的區別

Java中的String,StringBuilder,StringBuffer三者的區別

深刻剖析Java中的裝箱和拆箱

Integer、new Integer() 和 int 比較的面試題

java面試題之int和Integer的區別

最最最多見的Java面試題總結-第一週

相關文章
相關標籤/搜索