JAVA基础知识总结篇

JAVA基础知识总结篇

谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

  1. Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。
  2. 我们日常会接触到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。
    JRE,也就是 Java 运行环境,包含了 JVM 和 Java 类库,以及一些模块等。而 JDK 可以看作是JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。
  3. 对于“Java 是解释执行”这句话,这个说法不太准确。我们开发的 Java 的源代码,首先通过
    Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释
    器将字节码转换成为最终的机器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK
    提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是
    解释执行了。
  4. JDK 包含哪些工具或者 Java 领域内其他工具等,如编译器、运行时环境、安全工具、诊断和监控工具等。这些基本工具是日常工作效率的保证,对于我们工作在其他语言平台上,同样有所帮助。
    java平台

请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别?

  1. Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以
    被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
  2. Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运
    行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
  3. Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM
    自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见比
    如 OutOfMemoryError 之类,都是 Error 的子类。
  4. Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码
    里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是
    Throwable 不是 Exception。
  5. 不检查异常就是所谓的运行时异常,类似 NullPointerException、
    ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来
    判断是否需要捕获,并不会在编译期强制要求。
  6. 你了解哪些 Error、Exception 或者RuntimeException?
    异常

int 和 Integer 有什么区别?谈谈 Integer 的值缓存范围?

  1. int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte、short、char、int、float、double、long)之一。Java 语言虽然号称一切都是对象,但原始数据类型是例外。Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。
  2. 关于 Integer 的值缓存,这涉及 Java 5 中另一个改进。构建 Integer 对象的传统方式是直接调
    用构造器,直接 new 一个对象。但是根据实践,我们发现大部分数据操作都是集中在有限的、
    较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一
    个缓存机制,带来了明显的性能改进。按照 Javadoc,这个值默认缓存是 -128 到 127 之间。

对比 Vector、ArrayList、LinkedList 有何区别?

  1. 这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。但因为具体的设计区别,在行为、性能、线程安全等方面,表现又有很大不同。
  2. Verctor 是 Java 早期提供的线程安全的动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。
  3. ArrayList 是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。
  4. LinkedList 顾名思义是 Java 提供的双向链表,所以它不需要像上面两种那样调整容量,它也不
    是线程安全的。
  5. 一般来说,也可以补充一下不同容器类型适合的场景:
  • Vector 和 ArrayList 作为动态数组,其内部元素以数组形式顺序存储的,所以非常适合随机访问的场合。除了尾部插入和删除元素,往往性能会相对较差,比如我们在中间位置插入一个元素,需要移动后续所有元素。
  • 而 LinkedList 进行节点插入、删除却要高效得多,但是随机访问性能则要比动态数组慢。所以,在应用开发中,如果事先可以估计到,应用操作是偏向于插入、删除,还是随机访问较多,就可以针对性的进行选择。这也是面试最常见的一个考察角度,给定一个场景,选择适合的数据结构,所以对于这种典型选择一定要掌握清楚。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值