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.參考連接
Java中的String,StringBuilder,StringBuffer三者的區別