中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的使用優勢實例分析

發布時間:2022-02-23 16:27:00 來源:億速云 閱讀:122 作者:iii 欄目:開發技術

這篇文章主要介紹了Java的使用優勢實例分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java的使用優勢實例分析文章都會有所收獲,下面我們一起來看看吧。

new個對象

new一個對象,是我們在編程中最常用的操作之一,讓我們先看下如何在Javanew一個對象。

List<String> list =new ArrayList<String>();
list.add("hello world");

Java中,我們需要定義一個變量,然后通過new關鍵字聲明一個ArrayList<String>的示例,這樣我們就可以使用他了。

但是在Kotlinnew一個對象會更簡潔。

var list:ArrayList<String> = ArrayList<String>()

直接省略了new關鍵字即可。

類型推斷

對于以上的Kotlin代碼,我們完全可以省略掉變量 : 后面的類型聲明,因為kotlin可以自己推斷出來。

val list = ArrayList<String>()

是不是覺得更簡潔了?我們開發的效率也更高了。

空指針安全

Java中,變量,方法的參數等都是可以為null的,但是在Kotlin中默認是不允許的,通過這種強制的限制,更好的避免空指針異常。

var list = ArrayList<String>()
list = null

以上代碼,在編譯期你會得到一個錯誤提示:

Null can not be a value of a non-null type ArrayList<String>

如果我們的確需要null賦值怎么做呢?在Kotlin中需要開發者自己顯示聲明才可以。

var list:Array<String>? = null

如上所示,在類型后加 ? 即可。但是注意,我們不提倡這種做法,在實際的開發中,你會發現 ? 大部分都是為了兼容Java代碼使用的。

屬性

我們通常會把數據和對數據的處理封裝到一個類中,如果類中有私有字段,我們還需要提供gettersetter方法提供訪問和修改字段的方法。

//Person.java
public  class Person {
  private String name;


  public String getName() {
    return name;
  }


  public void setName(String name) {
    this.name = name;
  }
}
//Main.java
public static void main(String[] args) {
  Person p = new Person();
  p.setName("張三");
  System.out.println(p.getName());
}

以上是我們通過Java實現的一個Person類,并且定義了 name 私有字段,同時提供了gettersetter方法,這樣我們才能夠使用它。

通過以上代碼,大家可以看到,我們為了實現一個 name 的存儲,寫了很多代碼,如果一個類存在很多字段,我們會寫更多的不必要的gettersetter方法。

現在我們看在Kotlin中如何實現上面的功能。

//Person.kt
class Person {
  var name:String = ""
}


//main.kt
fun main(){
  val p = Person()
  p.name = "張三"
  println(p.name)
}

是的,就是這么簡單,只需要這么幾行代碼,就可以實現和Java一樣的功能,因為Kotlin可以幫我們自動的生成gettersetter這些模板代碼,就省了我們很多事情,大大的提高了我們的開發效率,并且整個代碼也更簡潔。

這里需要注意的是,如果字段是val聲明的,那么只會生成getter方法,因為val是不可修改的,等價于Java中的final修飾符;如果字段是var的,可以同時生成gettersetter方法,這時候就可以對字段賦值了。

數據類

Kotlin的簡潔不僅僅體現在gettersetter方法上,還有數據類。一個數據類是一個數據容器,它用來存放數據。

一個好的數據類的聲明,不僅有私有的字段、gettersetter方法,還要有toStringequalshashCode方法的實現,以便對他們進行打印、比較以及更好的儲存在map中。

還是以Person類為例,一個合格的數據類代碼如下:

public static  class Person {
  private String name;


  public Person(String name) {
    this.name = name;
  }


  public String getName() {
    return name;
  }


  public void setName(String name) {
    this.name = name;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;


    Person person = (Person) o;


    return Objects.equals(name, person.name);
  }


  @Override
  public int hashCode() {
    return name != null ? name.hashCode() : 0;
  }


  @Override
  public String toString() {
    return "Person{" +
      "name='" + name + '\'' +
      '}';
  }
}

看下我們Java的實現,需要有這么30多行代碼才能實現。如果我們使用Kotlin會是怎樣的呢?

data class Person(val name: String) {}

只需要這么一行代碼,以上的Java功能都會實現,這里的關鍵在于一個 data 修飾符,是不是很酸爽。

并發

Kotlin提供了協程來實現并發,相比JavaThreadExecutor等來說,它更輕便,簡潔。我們對比下并發的基本實現。

public static void main(String[] args) throws InterruptedException {
  new MyThread().start();
  System.out.println(Thread.currentThread().getName()+":main");
  //保證JVM存活
  Thread.sleep(1000);
}


private static class MyThread extends Thread{
  @Override
  public void run() {
    try {
      Thread.sleep(500);
      System.out.println(Thread.currentThread().getName()+":Thread");
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

運行查看輸出,我們發現MyThread并沒有阻塞main的執行,也就是并發了。

main:main
Thread-0:Thread

但是要注意到,Java使用了兩個線程,一個是main,一個是Thread-0。同樣的功能,我們現在使用kotlin實現下:

fun main(){
  runBlocking {
    launch {
      delay(500)
      println("${Thread.currentThread().name}:Thread")
    }
    println("${Thread.currentThread().name}:main")
  }
}

相比Java來說更簡潔,而且我們看下打印的輸出:

main:main
main:Thread

竟然是在同一個線程上實現的并發,少了一個線程的申請開銷,效率更高,這也是kotlin提出協程的概念。如果我們不想讓它在main線程上執行,可以通過切換調度器來實現。

launch(Dispatchers.IO)

只需要把上面的代碼的launch換成launch(Dispatchers.IO)即可,這樣調度器就給我們分配了一個IO的線程池來執行我們的代碼。如果我們使用Java來實現,要自己定義線程池,還要提交Runnable,整個代碼是非常多的。

main:main
DefaultDispatcher-worker-1:Thread

kotlin的協程非常強大和簡潔,通過以上的例子,不能完全展示它的特性,剩下的如協程上下文、調度器、Flow、通道等能力大家可以自己摸索。

關于“Java的使用優勢實例分析”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Java的使用優勢實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广东省| 万州区| 镇赉县| 田东县| 瑞昌市| 通道| 屯昌县| 大余县| 竹北市| 福清市| 蓝田县| 庆安县| 濮阳县| 松潘县| 南通市| 通榆县| 樟树市| 沛县| 新沂市| 巴林左旗| 广平县| 四子王旗| 明星| 湟源县| 邛崃市| 周口市| 余江县| 苗栗市| 团风县| 曲周县| 綦江县| 晋州市| 平果县| 海伦市| 巴南区| 多伦县| 屏南县| 崇信县| 方山县| 农安县| 武陟县|