您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java的使用優勢實例分析的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Java的使用優勢實例分析文章都會有所收獲,下面我們一起來看看吧。
new
一個對象,是我們在編程中最常用的操作之一,讓我們先看下如何在Java
中new
一個對象。
List<String> list =new ArrayList<String>(); list.add("hello world");
在Java
中,我們需要定義一個變量,然后通過new
關鍵字聲明一個ArrayList<String>
的示例,這樣我們就可以使用他了。
但是在Kotlin
,new
一個對象會更簡潔。
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
代碼使用的。
我們通常會把數據和對數據的處理封裝到一個類中,如果類中有私有字段,我們還需要提供getter
和setter
方法提供訪問和修改字段的方法。
//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 私有字段,同時提供了getter
和setter
方法,這樣我們才能夠使用它。
通過以上代碼,大家可以看到,我們為了實現一個 name 的存儲,寫了很多代碼,如果一個類存在很多字段,我們會寫更多的不必要的getter
和setter
方法。
現在我們看在Kotlin
中如何實現上面的功能。
//Person.kt class Person { var name:String = "" } //main.kt fun main(){ val p = Person() p.name = "張三" println(p.name) }
是的,就是這么簡單,只需要這么幾行代碼,就可以實現和Java
一樣的功能,因為Kotlin
可以幫我們自動的生成getter
和setter
這些模板代碼,就省了我們很多事情,大大的提高了我們的開發效率,并且整個代碼也更簡潔。
這里需要注意的是,如果字段是val
聲明的,那么只會生成getter
方法,因為val
是不可修改的,等價于Java
中的final
修飾符;如果字段是var
的,可以同時生成getter
和setter
方法,這時候就可以對字段賦值了。
Kotlin
的簡潔不僅僅體現在getter
和setter
方法上,還有數據類。一個數據類是一個數據容器,它用來存放數據。
一個好的數據類的聲明,不僅有私有的字段、getter
和setter
方法,還要有toString
、equals
和hashCode
方法的實現,以便對他們進行打印、比較以及更好的儲存在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
提供了協程來實現并發,相比Java
的Thread
和Executor
等來說,它更輕便,簡潔。我們對比下并發的基本實現。
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的使用優勢實例分析”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。