@@ -52,8 +52,9 @@ openjdk8u:
52
52
53
53
OpenJdk是基于Sum捐赠的HotSpot的源代码开发的,是开源的。
54
54
OracleJdk是Oracle对Jdk的商业化版本,由Oracle发布并维护.
55
- 因此OracleJdk比OpenJdk更可靠。
55
+ 因此OracleJdk比OpenJdk更可靠(不过随着版本的迭代,二者之间的差异正在减少) 。
56
56
57
+ '
57
58
#### Java与C++的异同
58
59
59
60
- Java和C++都是基于面向对象思想的语言。
@@ -65,6 +66,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
65
66
66
67
- Java不支持多继承,而C++支持。
67
68
69
+
68
70
#### JVM,JDK和JRE的区别
69
71
70
72
- JVM: JVM(java virtual machine)是java虚拟机
@@ -73,6 +75,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
73
75
74
76
- JDK: JDK(java development kit)是java开发工具包,不仅包含了jre和jvm,还提供了javac编译器和javadoc等其他开发所需的工具
75
77
78
+
76
79
#### Java语言的特点
77
80
78
81
- 面向对象
@@ -90,6 +93,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
90
93
- 安全(个人认为所有语言写出来的代码的安全性是开发者决定的,
91
94
而不是语言本身决定的,语言能决定的只是提供方便或不便的安全的API)
92
95
96
+
93
97
#### 面向对象的特征
94
98
面向对象三大特征:封装,继承,多态。
95
99
@@ -105,6 +109,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
105
109
** 多态的目的是为了程序的可扩展性和维护性。**
106
110
在Java中可以使用继承与接口2大特性实现多态。
107
111
112
+
108
113
#### 重载和重写的区别
109
114
个人认为重载和重写完全没有可比性,不知道为啥老有人喜欢拿它们做比较。
110
115
@@ -113,6 +118,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
113
118
- 重写: 重写是描述子类对父类的某个方法的逻辑进行了重新编写,但重写的只是方法的内容,
114
119
方法名,参数,类型,顺序,返回值都是不变的。
115
120
121
+
116
122
#### 接口与抽象类的区别
117
123
118
124
- 接口需要被实现,而抽象类是需要被继承的。
@@ -123,19 +129,21 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
123
129
124
130
- 接口是对类的规范,规范的是行为能力。而抽象类是对类的抽象,抽象的是逻辑。
125
131
132
+
126
133
#### Object类的方法有哪些?
127
134
1 . getClass
128
135
2 . equals
129
136
3 . hashCode
130
137
4 . toString
131
138
5 . wait
132
- 6 . wait(long): 让当前对象进入TIMED_WATING状态
133
- 7 . wait(long,int):让当前对象进入TIMED_WATING状态
139
+ 6 . wait(long): 让当前Thread进入TIMED_WATING状态
140
+ 7 . wait(long,int):让当前Thread进入TIMED_WATING状态
134
141
8 . notify
135
142
9 . nofifyAll
136
143
10 . clone
137
144
11 . finalize
138
145
146
+
139
147
#### 静态属性方法和成员属性方法区别
140
148
** 静态属性和方法属于类Class,而成员属性和方法属于实例化的对象。**
141
149
@@ -144,6 +152,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
144
152
145
153
** 简单理解就是不允许一个已存在的事物使用一个不存在的事物。**
146
154
155
+
147
156
#### 子类属性与父类属性初始化顺序
148
157
1 . 无论如何,静态数据首先加载,所以先初始化父类静态变量和静态初始化块(静态变量和静态初始化块按源码编写的顺序执行,
149
158
普通初始化块和普通成员变量也是如此),再初始化子类静态变量和静态初始化块。
@@ -152,6 +161,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
152
161
153
162
3 . 调用子类普通代码块,普通成员变量和构造方法。
154
163
164
+
155
165
#### 自动拆箱和装箱
156
166
自动拆箱和装箱实际上是Java编译器的一个语法糖。
157
167
@@ -171,6 +181,7 @@ C++则需要开发者手动释放内存。因此Java在内存管理上相对C++
171
181
包装类的缓存池缓存的范围基本都为: -128 - 127之间,
172
182
除了Character的缓存范围为 0 - 127。
173
183
184
+
174
185
#### String为什么不可变?
175
186
先说下我的看法: String 是Java中最常使用的类没有之一,如果String是可变的,那么会发生非常多数不清的问题。
176
187
如ip地址,人名,邮箱非常多的敏感数据。
@@ -184,6 +195,7 @@ String是不可变的,那么它本质上也是线程安全的。
184
195
String内部的字段是用final修饰的(我的jdk版本是11,String由byte[ ] 实现),
185
196
并且没有对外提供修改字段的方法。这也是为什么String不可变的原理。**
186
197
198
+
187
199
#### final关键字的作用
188
200
189
201
- 被final修饰的类,不能被继承,并且这个类所有的成员方法都为final,不能被重写。
@@ -193,13 +205,15 @@ String内部的字段是用final修饰的(我的jdk版本是11,String由byte[]
193
205
194
206
- 被final修饰的方法不能被子类重写。
195
207
208
+
196
209
#### StringBuilder和StringBuffer区别
197
210
** StringBuilder和StringBuffer都是可变的字符串,但是StringBuilder是线程不安全的。**
198
211
199
212
StringBuffer是安全的,因此单线程情况下考虑使用StringBuilder,多线程情况下考虑使用StringBuffer。
200
213
201
214
** 他们之间的关系就好比HashMap和HashTable的关系。**
202
215
216
+
203
217
#### equals知识点
204
218
205
219
- ** == 和 equals区别** :
@@ -229,27 +243,32 @@ StringBuffer是安全的,因此单线程情况下考虑使用StringBuilder,多
229
243
试想下,如果2个对象的值相等,但是由于它们是2个对象,hashcode却不相等。
230
244
那么即使放入map,set(map)仍会存在重复数据。
231
245
246
+
232
247
#### 深拷贝与浅拷贝
233
248
** 深拷贝: 拷贝所有的内容,除了基本数据类型的变量复制一份,连引用类型的变量也复制一份。**
234
249
235
250
** 浅拷贝: 复制基本数据类型的变量,对于引用类型的变量,直接返回这个引用本身。**
236
251
252
+
237
253
#### IO流分类
238
254
239
255
1 . 按照流的流向,分为:输入流和输入流。
240
256
241
257
2 . 按照操作单元,分为:字节流和字符流。
242
258
259
+
243
260
#### 使用字节流还是字符流?
244
261
考虑通用性,应该使用字节流。
245
262
如果只是文本文件的操作,可以使用字符流。
246
263
264
+
247
265
#### BigDecimal
248
266
BigDecimal是Java中表示大浮点数的类型。
249
267
250
268
在Java中,如果遇到浮点数的判断,可以使用BigDecimal来做计算,
251
269
因为如果使用普通数据类型很可能会发生精度丢失的情况,这个时候的结果可能会出乎意料之外.
252
270
271
+
253
272
#### Java异常体系结构
254
273
在Java中,异常分为 Exception和Error,这2个类都继承自Throwable。
255
274
@@ -295,6 +314,7 @@ add.invoke(list, "kl");
295
314
System.out.println(list)
296
315
```
297
316
317
+
298
318
#### 泛型通配符
299
319
300
320
** 常用的 T,E,K,V,?**
@@ -377,6 +397,7 @@ animals的泛型是父类对象`Animal`,dogs的泛型是子类对象`Dog`,
377
397
378
398
这段代码看上去好像没什么问题,但是仔细想想。现在animals指向的是一个泛型为Dog的容器,现在又将Cat放进容器中,就相当于在一堆狗里面放进一只猫,这就矛盾了。所以子类泛型** 不能** 转换为父类泛型,反过来也是一样。
379
399
400
+
380
401
#### 上界通配符 <? extend E>
381
402
382
403
上界:用extend关键字指定,表示所指定的类型只能是某个类的子类或者这个类本身
@@ -400,6 +421,7 @@ static <K extends Comparable & Serializable> K test(K arg1) {
400
421
401
422
有多个限定类型用"&"隔开,有多个类型变量用","逗号隔开
402
423
424
+
403
425
#### 下界通配符 <? super E>
404
426
下界:用super关键字指定,表示所指定的类型只能是这个类本身或者某个类的父类,直至Object
405
427
@@ -460,6 +482,7 @@ T extends A
460
482
而是Arrays类内部实现的ArrayList,这个内部类只支持访问和set操作,
461
483
并不支持remove,add,clear等修改操作。**
462
484
485
+
463
486
#### Java中引用的类型
464
487
465
488
Java中引用类型总共有四种: 强引用,软引用,弱引用,虚引用。
0 commit comments