Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
醒狮指南
JavaGuide
提交
915d4a20
J
JavaGuide
项目概览
醒狮指南
/
JavaGuide
与 Fork 源项目一致
从无法访问的项目Fork
通知
5
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
JavaGuide
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
915d4a20
编写于
6月 15, 2019
作者:
S
SnailClimb
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update Java基础知识.md
上级
8af50f39
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
16 addition
and
27 deletion
+16
-27
docs/java/Java基础知识.md
docs/java/Java基础知识.md
+16
-27
未找到文件。
docs/java/Java基础知识.md
浏览文件 @
915d4a20
...
...
@@ -59,17 +59,8 @@
## 1. 面向对象和面向过程的区别
### 面向过程
**优点:**
性能比面向对象高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发
**缺点:**
没有面向对象易维护、易复用、易扩展
### 面向对象
**优点:**
易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
**缺点:**
性能比面向过程低
-
**面向过程**
:
**面向过程性能比面向对象高。**
因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,
**面向过程没有面向对象易维护、易复用、易扩展。**
-
**面向对象**
:
**面向对象易维护、易复用、易扩展。**
因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,
**面向过程性能比面向过程低**
。
## 2. Java 语言有哪些特点?
...
...
@@ -100,7 +91,9 @@ Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同
> HotSpot采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
总结:Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
**总结:**
Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
### JDK 和 JRE
...
...
@@ -120,7 +113,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
>
> 答:非常接近 - 我们的Oracle JDK版本构建过程基于OpenJDK 7构建,只添加了几个部分,例如部署代码,其中包括Oracle的Java插件和Java WebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源Oracle JDK的所有部分,除了我们考虑商业功能的部分。
总结:
**总结:**
1.
Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;
2.
OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的;
...
...
@@ -145,7 +138,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
## 7. Java 应用程序与小程序之间有那些差别?
简单说应用程序是从主线程启动(也就是
main() 方法)。applet 小程序没有main方法,主要是嵌在浏览器页面上运行(调用init()线程或者run()
来启动),嵌入浏览器这点跟 flash 的小游戏类似。
简单说应用程序是从主线程启动(也就是
`main()`
方法)。applet 小程序没有
`main()`
方法,主要是嵌在浏览器页面上运行(调用
`init()`
或者
`run()`
来启动),嵌入浏览器这点跟 flash 的小游戏类似。
## 8. 字符型常量和字符串常量的区别?
...
...
@@ -162,9 +155,8 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
## 10. 重载和重写的区别
**重载:**
发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
**重写:**
发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
-
**重载:**
发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
-
**重写:**
发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。
## 11. Java 面向对象编程三大特性: 封装 继承 多态
...
...
@@ -191,7 +183,6 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
## 12. String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
**可变性**
简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,
`private final char value[]`
,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串
`char[]value`
但是没有用 final 关键字修饰,所以这两种对象都是可变的。
...
...
@@ -213,8 +204,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
**线程安全性**
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。
**性能**
...
...
@@ -228,9 +218,8 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
## 13. 自动装箱与拆箱
**装箱**
:将基本类型用它们对应的引用类型包装起来;
**拆箱**
:将包装类型转换为基本数据类型;
-
**装箱**
:将基本类型用它们对应的引用类型包装起来;
-
**拆箱**
:将包装类型转换为基本数据类型;
## 14. 在一个静态方法内调用一个非静态成员为什么是非法的?
...
...
@@ -238,7 +227,7 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
## 15. 在 Java 中定义一个不做事且没有参数的构造方法的作用
Java 程序在执行子类的构造方法之前,如果没有用
super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super()
来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
Java 程序在执行子类的构造方法之前,如果没有用
`super() `
来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用
`super() `
来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
## 16. import java和javax有什么区别?
...
...
@@ -489,12 +478,12 @@ Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很
按操作方式分类结构图:
![
按操作方式分类结构图
](
https://user-gold-cdn.xitu.io/2018/5/16/16367d4fd1ce1b46?w=720&h=1080&f=jpeg&s=69522
)
![
IO-操作方式分类
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/IO-操作方式分类.png
)
按操作对象分类结构图:
![
按操作对象分类结构图
](
https://user-gold-cdn.xitu.io/2018/5/16/16367d673b0e268d?w=720&h=535&f=jpeg&s=46081
)
![
IO-操作对象分类
](
https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/IO-操作对象分类.png
)
### BIO,NIO,AIO 有什么区别?
...
...
@@ -524,4 +513,4 @@ Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很
**Java工程师必备学习资源:**
一些Java工程师常用学习资源公众号后台回复关键字
**“1”**
即可免费无套路获取。
![
我的公众号
](
https://
user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334
)
![
我的公众号
](
https://
my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png
)
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录