今天来学习一下全新关于Kotlin的概念---数据类【data class】,也是非常有用的东东,下面先来对其进行理论化的了解:

数据类其实跟java的实体类(model)很类似,像Java定义一个Person类,里面有各种属性然后再生成它的get和set方法,当然可以借助于IDE来生成,但是其实java的这种做法是挺冗长啰嗦的,当然其实有现成的解决方案来解决这个冗长了,比如用lombok库,利用注解就可以动态生成get和set,接下来咱们来看一下kotlin数据类是怎么使用的:

这样数据库就定义成了,也没任何额外的get和set方法,是不是特别的简洁,好,下面来使用一下:

如果将data关键字去掉,其输出就会是对象的toString()了,如下:

数据类的定义是不是很简单,其实数据类是有一些要求的,下面来瞅下:

1、主构造方法,至少要有一个参数。

2、所有的主构造方法参数都需要被标记为var或val。

3、数据类不能是抽象的、open的、sealed【密封类,还未学到】的以及inner的。

另外对于数据类,编译器会自动的生成如下内容:

1、equals/hashcode对。

2、toString()方法,形式为我们看到的:

3、针对属性的componentN方法,并且是按照属性的声明顺序来生成的。

啥意思,也就是针对咱们的这个类会生成component1()、component2()、component3(),而这三个方法的返回值是按照我们定义的name、age、address。

好,下面来反编译一下,来看一下数据类的底层细节:

  1. xiongweideMacBook-Pro:kotlin_lecture xiongwei$ javap -c com/kotlin/test2/Person.class
  2. Compiled from "HelloKotlin1.kt"
  3. public final class com.kotlin.test2.Person {
  4. public final java.lang.String getName();
  5. Code:
  6. 0: aload_0
  7. 1: getfield #11 // Field name:Ljava/lang/String;
  8. 4: areturn
  9.  
  10. public final int getAge();
  11. Code:
  12. 0: aload_0
  13. 1: getfield #19 // Field age:I
  14. 4: ireturn
  15.  
  16. public final void setAge(int);
  17. Code:
  18. 0: aload_0
  19. 1: iload_1
  20. 2: putfield #19 // Field age:I
  21. 5: return
  22.  
  23. public final java.lang.String getAddress();
  24. Code:
  25. 0: aload_0
  26. 1: getfield #26 // Field address:Ljava/lang/String;
  27. 4: areturn
  28.  
  29. public final void setAddress(java.lang.String);
  30. Code:
  31. 0: aload_1
  32. 1: ldc #29 // String <set-?>
  33. 3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  34. 6: aload_0
  35. 7: aload_1
  36. 8: putfield #26 // Field address:Ljava/lang/String;
  37. 11: return
  38.  
  39. public com.kotlin.test2.Person(java.lang.String, int, java.lang.String);
  40. Code:
  41. 0: aload_1
  42. 1: ldc #38 // String name
  43. 3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  44. 6: aload_3
  45. 7: ldc #39 // String address
  46. 9: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  47. 12: aload_0
  48. 13: invokespecial #42 // Method java/lang/Object."<init>":()V
  49. 16: aload_0
  50. 17: aload_1
  51. 18: putfield #11 // Field name:Ljava/lang/String;
  52. 21: aload_0
  53. 22: iload_2
  54. 23: putfield #19 // Field age:I
  55. 26: aload_0
  56. 27: aload_3
  57. 28: putfield #26 // Field address:Ljava/lang/String;
  58. 31: return
  59.  
  60. public final java.lang.String component1();
  61. Code:
  62. 0: aload_0
  63. 1: getfield #11 // Field name:Ljava/lang/String;
  64. 4: areturn
  65.  
  66. public final int component2();
  67. Code:
  68. 0: aload_0
  69. 1: getfield #19 // Field age:I
  70. 4: ireturn
  71.  
  72. public final java.lang.String component3();
  73. Code:
  74. 0: aload_0
  75. 1: getfield #26 // Field address:Ljava/lang/String;
  76. 4: areturn
  77.  
  78. public final com.kotlin.test2.Person copy(java.lang.String, int, java.lang.String);
  79. Code:
  80. 0: aload_1
  81. 1: ldc #38 // String name
  82. 3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  83. 6: aload_3
  84. 7: ldc #39 // String address
  85. 9: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  86. 12: new #2 // class com/kotlin/test2/Person
  87. 15: dup
  88. 16: aload_1
  89. 17: iload_2
  90. 18: aload_3
  91. 19: invokespecial #49 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
  92. 22: areturn
  93.  
  94. public static com.kotlin.test2.Person copy$default(com.kotlin.test2.Person, java.lang.String, int, java.lang.String, int, java.lang.Object);
  95. Code:
  96. 0: iload 4
  97. 2: iconst_1
  98. 3: iand
  99. 4: ifeq 12
  100. 7: aload_0
  101. 8: getfield #11 // Field name:Ljava/lang/String;
  102. 11: astore_1
  103. 12: iload 4
  104. 14: iconst_2
  105. 15: iand
  106. 16: ifeq 24
  107. 19: aload_0
  108. 20: getfield #19 // Field age:I
  109. 23: istore_2
  110. 24: iload 4
  111. 26: iconst_4
  112. 27: iand
  113. 28: ifeq 36
  114. 31: aload_0
  115. 32: getfield #26 // Field address:Ljava/lang/String;
  116. 35: astore_3
  117. 36: aload_0
  118. 37: aload_1
  119. 38: iload_2
  120. 39: aload_3
  121. 40: invokevirtual #53 // Method copy:(Ljava/lang/String;ILjava/lang/String;)Lcom/kotlin/test2/Person;
  122. 43: areturn
  123.  
  124. public java.lang.String toString();
  125. Code:
  126. 0: new #56 // class java/lang/StringBuilder
  127. 3: dup
  128. 4: invokespecial #57 // Method java/lang/StringBuilder."<init>":()V
  129. 7: ldc #59 // String Person(name=
  130. 9: invokevirtual #63 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  131. 12: aload_0
  132. 13: getfield #11 // Field name:Ljava/lang/String;
  133. 16: invokevirtual #63 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  134. 19: ldc #65 // String , age=
  135. 21: invokevirtual #63 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  136. 24: aload_0
  137. 25: getfield #19 // Field age:I
  138. 28: invokevirtual #68 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  139. 31: ldc #70 // String , address=
  140. 33: invokevirtual #63 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  141. 36: aload_0
  142. 37: getfield #26 // Field address:Ljava/lang/String;
  143. 40: invokevirtual #63 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  144. 43: ldc #72 // String )
  145. 45: invokevirtual #63 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  146. 48: invokevirtual #74 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  147. 51: areturn
  148.  
  149. public int hashCode();
  150. Code:
  151. 0: aload_0
  152. 1: getfield #11 // Field name:Ljava/lang/String;
  153. 4: dup
  154. 5: ifnull 14
  155. 8: invokevirtual #77 // Method java/lang/Object.hashCode:()I
  156. 11: goto 16
  157. 14: pop
  158. 15: iconst_0
  159. 16: bipush 31
  160. 18: imul
  161. 19: aload_0
  162. 20: getfield #19 // Field age:I
  163. 23: invokestatic #82 // Method java/lang/Integer.hashCode:(I)I
  164. 26: iadd
  165. 27: bipush 31
  166. 29: imul
  167. 30: aload_0
  168. 31: getfield #26 // Field address:Ljava/lang/String;
  169. 34: dup
  170. 35: ifnull 44
  171. 38: invokevirtual #77 // Method java/lang/Object.hashCode:()I
  172. 41: goto 46
  173. 44: pop
  174. 45: iconst_0
  175. 46: iadd
  176. 47: ireturn
  177.  
  178. public boolean equals(java.lang.Object);
  179. Code:
  180. 0: aload_0
  181. 1: aload_1
  182. 2: if_acmpeq 64
  183. 5: aload_1
  184. 6: instanceof #2 // class com/kotlin/test2/Person
  185. 9: ifeq 66
  186. 12: aload_1
  187. 13: checkcast #2 // class com/kotlin/test2/Person
  188. 16: astore_2
  189. 17: aload_0
  190. 18: getfield #11 // Field name:Ljava/lang/String;
  191. 21: aload_2
  192. 22: getfield #11 // Field name:Ljava/lang/String;
  193. 25: invokestatic #91 // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
  194. 28: ifeq 66
  195. 31: aload_0
  196. 32: getfield #19 // Field age:I
  197. 35: aload_2
  198. 36: getfield #19 // Field age:I
  199. 39: if_icmpne 46
  200. 42: iconst_1
  201. 43: goto 47
  202. 46: iconst_0
  203. 47: ifeq 66
  204. 50: aload_0
  205. 51: getfield #26 // Field address:Ljava/lang/String;
  206. 54: aload_2
  207. 55: getfield #26 // Field address:Ljava/lang/String;
  208. 58: invokestatic #91 // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
  209. 61: ifeq 66
  210. 64: iconst_1
  211. 65: ireturn
  212. 66: iconst_0
  213. 67: ireturn
  214. }
  215. xiongweideMacBook-Pro:kotlin_lecture xiongwei$

其中是不是可以看到自动为其生成属性的set和get方法了,除了name之外,因为它声明的是一个常量:

接着生成了两个参数的构造方法:

再接着就看到我们第三点说的componentN了,如下:

再往下看:

还帮我们生成了toString()方法:

最后就是hashCode()和equals():

下面继续来对数据类成员的继承要点进行说明:

1、如果数据类中显示定义了equals,hashCode或者是toString方法,或者是在数据类的父类中将这些方法声明为final,那么这些方法就不会再生成,转而使用已有的。

2、如果父类拥有componentN方法,并且是open的以及返回兼容的类型,那么编译器就会在数据类中生成相应的componentN方法,并且重写父类的这些方法;如果父类中的这些方法由于不兼容的签名或者被定义为final的,那么编译器就会报错。

3、在数据类中显示提供componentN方法以及copy方法实现是不允许的。下面来试一下:

其错误提示为:

接下来来对生成的copy方法进行一个说明,它的重用主要是根据已有的属性来创建一个新的对象,比如:

如果咱们这样写:

接下来想一个问题:既然Kotlin编译主动给属性生成了set和get方法了,那。。是不是可以直接像Java那样来操作属性呢,下面瞅下:

不通这样写,只能:

解构声明:

在主构造方法中有多少个参数,就会依次生成相应的component1、component2、component3...,这些方法返回的就是对应字段的值,componentN方法是用来实现解构声明的。如何理解,看代码:

那,如果只写两个变量呢?

另外,我们通过反编译数据类可以发现,貌似生成的是带参的构造方法,如下:

那,如何声明不带参的构造方法呢,其实在JVM平台上,如果生成的类需要拥有无参构造方法,那么就需要为所有属性指定默认值,如下:

再次反编译论证一下:

  1. xiongweideMacBook-Pro:kotlin_lecture xiongwei$ javap -c com/kotlin/test2/Person2.class
  2. Compiled from "HelloKotlin1.kt"
  3. public final class com.kotlin.test2.Person2 {
  4. public final java.lang.String getName();
  5. Code:
  6. 0: aload_0
  7. 1: getfield #11 // Field name:Ljava/lang/String;
  8. 4: areturn
  9.  
  10. public final int getAge();
  11. Code:
  12. 0: aload_0
  13. 1: getfield #19 // Field age:I
  14. 4: ireturn
  15.  
  16. public final void setAge(int);
  17. Code:
  18. 0: aload_0
  19. 1: iload_1
  20. 2: putfield #19 // Field age:I
  21. 5: return
  22.  
  23. public final java.lang.String getAddress();
  24. Code:
  25. 0: aload_0
  26. 1: getfield #26 // Field address:Ljava/lang/String;
  27. 4: areturn
  28.  
  29. public final void setAddress(java.lang.String);
  30. Code:
  31. 0: aload_1
  32. 1: ldc #29 // String <set-?>
  33. 3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  34. 6: aload_0
  35. 7: aload_1
  36. 8: putfield #26 // Field address:Ljava/lang/String;
  37. 11: return
  38.  
  39. public com.kotlin.test2.Person2(java.lang.String, int, java.lang.String);
  40. Code:
  41. 0: aload_1
  42. 1: ldc #38 // String name
  43. 3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  44. 6: aload_3
  45. 7: ldc #39 // String address
  46. 9: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  47. 12: aload_0
  48. 13: invokespecial #42 // Method java/lang/Object."<init>":()V
  49. 16: aload_0
  50. 17: aload_1
  51. 18: putfield #11 // Field name:Ljava/lang/String;
  52. 21: aload_0
  53. 22: iload_2
  54. 23: putfield #19 // Field age:I
  55. 26: aload_0
  56. 27: aload_3
  57. 28: putfield #26 // Field address:Ljava/lang/String;
  58. 31: return
  59.  
  60. public com.kotlin.test2.Person2(java.lang.String, int, java.lang.String, int, kotlin.jvm.internal.DefaultConstructorMarker);
  61. Code:
  62. 0: iload 4
  63. 2: iconst_1
  64. 3: iand
  65. 4: ifeq 10
  66. 7: ldc #45 // String
  67. 9: astore_1
  68. 10: iload 4
  69. 12: iconst_2
  70. 13: iand
  71. 14: ifeq 20
  72. 17: bipush 20
  73. 19: istore_2
  74. 20: iload 4
  75. 22: iconst_4
  76. 23: iand
  77. 24: ifeq 30
  78. 27: ldc #47 // String henan
  79. 29: astore_3
  80. 30: aload_0
  81. 31: aload_1
  82. 32: iload_2
  83. 33: aload_3
  84. 34: invokespecial #49 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
  85. 37: return
  86.  
  87. public com.kotlin.test2.Person2();
  88. Code:
  89. 0: aload_0
  90. 1: aconst_null
  91. 2: iconst_0
  92. 3: aconst_null
  93. 4: bipush 7
  94. 6: aconst_null
  95. 7: invokespecial #51 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
  96. 10: return
  97.  
  98. public final java.lang.String component1();
  99. Code:
  100. 0: aload_0
  101. 1: getfield #11 // Field name:Ljava/lang/String;
  102. 4: areturn
  103.  
  104. public final int component2();
  105. Code:
  106. 0: aload_0
  107. 1: getfield #19 // Field age:I
  108. 4: ireturn
  109.  
  110. public final java.lang.String component3();
  111. Code:
  112. 0: aload_0
  113. 1: getfield #26 // Field address:Ljava/lang/String;
  114. 4: areturn
  115.  
  116. public final com.kotlin.test2.Person2 copy(java.lang.String, int, java.lang.String);
  117. Code:
  118. 0: aload_1
  119. 1: ldc #38 // String name
  120. 3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  121. 6: aload_3
  122. 7: ldc #39 // String address
  123. 9: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  124. 12: new #2 // class com/kotlin/test2/Person2
  125. 15: dup
  126. 16: aload_1
  127. 17: iload_2
  128. 18: aload_3
  129. 19: invokespecial #49 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
  130. 22: areturn
  131.  
  132. public static com.kotlin.test2.Person2 copy$default(com.kotlin.test2.Person2, java.lang.String, int, java.lang.String, int, java.lang.Object);
  133. Code:
  134. 0: iload 4
  135. 2: iconst_1
  136. 3: iand
  137. 4: ifeq 12
  138. 7: aload_0
  139. 8: getfield #11 // Field name:Ljava/lang/String;
  140. 11: astore_1
  141. 12: iload 4
  142. 14: iconst_2
  143. 15: iand
  144. 16: ifeq 24
  145. 19: aload_0
  146. 20: getfield #19 // Field age:I
  147. 23: istore_2
  148. 24: iload 4
  149. 26: iconst_4
  150. 27: iand
  151. 28: ifeq 36
  152. 31: aload_0
  153. 32: getfield #26 // Field address:Ljava/lang/String;
  154. 35: astore_3
  155. 36: aload_0
  156. 37: aload_1
  157. 38: iload_2
  158. 39: aload_3
  159. 40: invokevirtual #60 // Method copy:(Ljava/lang/String;ILjava/lang/String;)Lcom/kotlin/test2/Person2;
  160. 43: areturn
  161.  
  162. public java.lang.String toString();
  163. Code:
  164. 0: new #63 // class java/lang/StringBuilder
  165. 3: dup
  166. 4: invokespecial #64 // Method java/lang/StringBuilder."<init>":()V
  167. 7: ldc #66 // String Person2(name=
  168. 9: invokevirtual #70 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  169. 12: aload_0
  170. 13: getfield #11 // Field name:Ljava/lang/String;
  171. 16: invokevirtual #70 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  172. 19: ldc #72 // String , age=
  173. 21: invokevirtual #70 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  174. 24: aload_0
  175. 25: getfield #19 // Field age:I
  176. 28: invokevirtual #75 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
  177. 31: ldc #77 // String , address=
  178. 33: invokevirtual #70 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  179. 36: aload_0
  180. 37: getfield #26 // Field address:Ljava/lang/String;
  181. 40: invokevirtual #70 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  182. 43: ldc #79 // String )
  183. 45: invokevirtual #70 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  184. 48: invokevirtual #81 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
  185. 51: areturn
  186.  
  187. public int hashCode();
  188. Code:
  189. 0: aload_0
  190. 1: getfield #11 // Field name:Ljava/lang/String;
  191. 4: dup
  192. 5: ifnull 14
  193. 8: invokevirtual #84 // Method java/lang/Object.hashCode:()I
  194. 11: goto 16
  195. 14: pop
  196. 15: iconst_0
  197. 16: bipush 31
  198. 18: imul
  199. 19: aload_0
  200. 20: getfield #19 // Field age:I
  201. 23: invokestatic #89 // Method java/lang/Integer.hashCode:(I)I
  202. 26: iadd
  203. 27: bipush 31
  204. 29: imul
  205. 30: aload_0
  206. 31: getfield #26 // Field address:Ljava/lang/String;
  207. 34: dup
  208. 35: ifnull 44
  209. 38: invokevirtual #84 // Method java/lang/Object.hashCode:()I
  210. 41: goto 46
  211. 44: pop
  212. 45: iconst_0
  213. 46: iadd
  214. 47: ireturn
  215.  
  216. public boolean equals(java.lang.Object);
  217. Code:
  218. 0: aload_0
  219. 1: aload_1
  220. 2: if_acmpeq 64
  221. 5: aload_1
  222. 6: instanceof #2 // class com/kotlin/test2/Person2
  223. 9: ifeq 66
  224. 12: aload_1
  225. 13: checkcast #2 // class com/kotlin/test2/Person2
  226. 16: astore_2
  227. 17: aload_0
  228. 18: getfield #11 // Field name:Ljava/lang/String;
  229. 21: aload_2
  230. 22: getfield #11 // Field name:Ljava/lang/String;
  231. 25: invokestatic #98 // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
  232. 28: ifeq 66
  233. 31: aload_0
  234. 32: getfield #19 // Field age:I
  235. 35: aload_2
  236. 36: getfield #19 // Field age:I
  237. 39: if_icmpne 46
  238. 42: iconst_1
  239. 43: goto 47
  240. 46: iconst_0
  241. 47: ifeq 66
  242. 50: aload_0
  243. 51: getfield #26 // Field address:Ljava/lang/String;
  244. 54: aload_2
  245. 55: getfield #26 // Field address:Ljava/lang/String;
  246. 58: invokestatic #98 // Method kotlin/jvm/internal/Intrinsics.areEqual:(Ljava/lang/Object;Ljava/lang/Object;)Z
  247. 61: ifeq 66
  248. 64: iconst_1
  249. 65: ireturn
  250. 66: iconst_0
  251. 67: ireturn
  252. }

果真如此,跟Java不同的是,如果Java中的属性没有赋值会有默认值,而在Kotlin中默认是不会自动给默认值给属性进行赋值的,其实这样做更加的安全,这样既便我们在使用Kotlin的无参构造方法时,它里面的属性也能保证都有初始值。

关于数据类在实际中使用是非常多的,可见也比Java要简洁好使得多,可以多多体会。

Kotlin数据类深度解析与底层剖析的更多相关文章

  1. Java 8 Optional 类深度解析

    Java 8 Optional 类深度解析 身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只 ...

  2. 深度解析HashMap底层实现架构

    摘要:分析Map接口的详细使用以及HashMap的底层是如何实现的? 本文分享自华为云社区<[图文并茂]深度解析HashMap高频面试及底层实现结构![奔跑吧!JAVA]>,原文作者:灰小 ...

  3. Java基础常用类深度解析(包含常见排序算法)

    目录 一.工具类 1.1.工具类的设计 1.1.1.公共静态方法 1.2.单例模式 二.包装类 2.1.基本类型的包装类 2.1.1.Integer 2.1.1.1.Integer >> ...

  4. Kotlin 数据类与密封类

    数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: data class User(val name: String, val age: Int) 编译器会自动的从主构造函数中根据 ...

  5. 语言小知识-Java ArrayList类 深度解析

    · 问题 1:ArrayList 的 size 和 capacity 怎么理解? 如果把 ArrayList 看作一个杯子的话,capacity 就是杯子的容积,也就是代表杯子能装多少东西,而 siz ...

  6. Java 8 Optional类深度解析

    身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...

  7. Java 8 Optional类深度解析(转)

    经常会遇到这样的问题,调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. 新版本的Java,比如J ...

  8. Java 8 Optional类深度解析(转载)

    身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...

  9. [转]Java 8 Optional类深度解析(null处理)

    原文链接:http://www.importnew.com/6675.html 本文由 ImportNew - 高俊阳 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 身为一 ...

随机推荐

  1. [LeetCode] 358. Rearrange String k Distance Apart 按距离k间隔重排字符串

    Given a non-empty string str and an integer k, rearrange the string such that the same characters ar ...

  2. [LeetCode] 805. Split Array With Same Average 用相同均值拆分数组

    In a given integer array A, we must move every element of A to either list B or list C. (B and C ini ...

  3. 使用office365 world2016发布编辑备份你的博客

    开门见山.   如果你曾使用过live writer或者world 2013及之前版本发布过博客,那么请直接异步到最后的tips来查找你可能遇到的问题.     在office365中找到博客模板 打 ...

  4. 获取apk的Activity和Package

    2.查看包名和activity adb logcat|grep -i activitymanager 获取当前界面的activity 1.adb shell dumpsys window window ...

  5. Apache Kafka Consumer 消费者集

    1.目标 在我们的上一篇文章中,我们讨论了Kafka Producer.今天,我们将讨论Kafka Consumer.首先,我们将看到什么是Kafka Consumer和Kafka Consumer的 ...

  6. 基于卷积神经网络的人脸识别项目_使用Tensorflow-gpu+dilib+sklearn

    https://www.cnblogs.com/31415926535x/p/11001669.html 基于卷积神经网络的人脸识别项目_使用Tensorflow-gpu+dilib+sklearn ...

  7. Python安装-Pycharm+Anaconda

    1.初识Python Python是一门非常简单优雅的编程语言,可以用极少的代码就能实现强大的功能,而且学习起来十分简单,没有编程基础也可轻松入门.其功能强大,特别是第三方库的库的支持,使得开发方便十 ...

  8. 模型层之ORM、数据库和单表操作

    一.ORM简介 ORM是“对象-关系-映射”的简称,一般指持久化数据和实体对象的映射 1.1 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中( ...

  9. 18 IO流(十五)——RandomAccessFile随机访问文件及使用它进行大文件切割的方法

    本文部分内容转自:https://blog.csdn.net/nightcurtis/article/details/51384126 1.RandomAccessFile特点 RandomAcces ...

  10. A Simple Question of Chemistry

    #include<stdio.h> int main() { int i, l; ]; ]; l = ; ) { l++; } ; a[i]!= && i<l; i+ ...