这篇文章主要介绍了Java的使用优势实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java的使用优势实例分析文章都会有所收获,下面我们一起来看看吧。
new个对象
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.javapublic class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }}//Main.javapublic 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.ktclass Person { var name:String = ""}//main.ktfun 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:mainThread-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:mainmain:Thread
竟然是在同一个线程上实现的并发,少了一个线程的申请开销,效率更高,这也是kotlin
提出协程的概念。如果我们不想让它在main
线程上执行,可以通过切换调度器来实现。
launch(Dispatchers.IO)
只需要把上面的代码的launch
换成launch(Dispatchers.IO)
即可,这样调度器就给我们分配了一个IO
的线程池来执行我们的代码。如果我们使用Java
来实现,要自己定义线程池,还要提交Runnable
,整个代码是非常多的。
main:mainDefaultDispatcher-worker-1:Thread
kotlin
的协程非常强大和简洁,通过以上的例子,不能完全展示它的特性,剩下的如协程上下文、调度器、Flow、通道等能力大家可以自己摸索。
关于“Java的使用优势实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java的使用优势实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。