Java 基础知识和语法
基础知识
WRITE ONCE,RUN ANYWHERE
个人对于 write once ,run anywhere的一点看法,之所以JAVA相对于其他语言(比如c语言)有这样的优势,其实最大的核心在于JVM,jvm承担了一种“中间界面”的作用
即java语言调用的系统API都是JVM提供的,而JVM则对相应的系统API从各个平台寻求不同的硬件支持,因此隔离了硬件底层与JAVA代码的耦合性,从而形成这种优势的;
而C语言,因为是很底层的语言,所以直接调用硬件相关的功能和驱动,因此对于不同的平台上实现同一功能要编写多份代码;
JIT-Just In Time :
预备知识:机器码和机器指令
机器码:即一串二进制序列
机器指令:即机器码的简化版,将特定的机器码表示成对应的英文指令,如mov,inc 等
正文
JIT:即在解释字节码文件(.class)时,将“Hot Spot代码”(出现频率高的代码)直接编译成机器码的一种机制;
因为Java对于字节码文件的基本执行原理是将代码逐条解释成机器指令,而依据上述原理,对“Hot Spot代码”,我们有两种执行方式:
- 直接编译成机器码,下次直接调用编译好的机器码执行;
- 每次都将“Hot Spot代码”解释成机器指令来执行
显而易见,前一种方式的效率要更高,而这也是JIT的优势所在,至于如何识别“Hot Spot代码”,则与JVM的运行机制有关;
AOT- AHead Of Time Compilation
即提前将代码转化为对应平台的机器码
联合体:
即一个结构体类型中包含多个类型的变量,多个类型共用同一个结构体类型,具体用法如下:
typedef union object{
jlong x;
jint y;
jstring z;
}object;
object a = 10;
a = 10.9;
a = "asdas";
特点:
- 联合体/共用体的内存空间等于联合体中占内存最大的那个内存;
- 给联合体变量赋值时,下一次的赋值会使得上一次的赋值失效;
Java中的异常与错误
概念:
1 Exception
Exception是Java程序运行中可通过合理编程来避免的异常情况,分为可检查和不可检查异常两种;
- 可检查异常:一般要通过try{}catch()来处理异常;
- 不可检查异常:比如NullPointException/除零异常/IOException虽然不能捕捉,但是可以通过合理的编程方式来避免
2 Error
Error相对于Exception而言,属于更严重的异常情况,如VitualMachineError以及OutOfMemoryError都属于该类错误,这类错误一般不可捕捉
课后问题
-
NoClassDefFoundError与ClassNotFoundException的区别
NoClassDefFoundError概念:
程序编译成功,但在运行时由于某些jar包被删除,则jvm在加载该类的时候会报该错误,属于Error,与Exception不同,Error一般是由于JVM异常导致的
ClassNotFoundException概念:
一般是程序中使用了Class.forName()或用了ClassLoader通过类名加载类,结果在动态加载class文件的时候发现找不到对应的类,从而导致该异常,属于程序自身的问题,有可能是类名参数写错或者没导入相应的代码库,一般这种程序编写不正确导致的问题在编译器无法检查,只有在运行期间才能发现
区别阐述
而NoClassDefFoundError则是因为在编译时没问题的库,到了运行时却出错了,只能将其归属于jvm出异常了;
ClassNotFoundException则是因为在编译期就不确定该类能不能找到,完全由程序员自己保证对应的类存在,属于程序自身的问题;
final,finally,finalize的概念和作用
final
关键字,用于声明变量引用无法被重新赋值;
finally
finalize
clean
Java中对新引入的一种回收机制,相对于finalize而言要安全,可靠一些,但是仍旧存在与finalize相似问题的可能;
问题:
1 String为什么会被声明为final
- 保证内部的native机制不被继承所破坏;
- 关于字符串的堆存储机制不被破坏;
- 保证string的性能和高效性;
强引用,软引用,弱引用,幻象引用
强引用
基本概念:
- 即平常开发过程中创建的对象的过程,new Object()的过程都是创建强引用的过程;
特点:
- 对于强引用,JVM宁愿抛出OutMemoryError也不会回收强引用指向的对象;
软引用
基本概念:
- 用SoftReference<>进行软引用声明,软引用声明的对象一般具有内存敏感性,因此用于实现缓存,若内存空间足够时,从缓存读取数据;
特点:
- 对于软引用指向的对象,不一定会被GC立即回收,只有当GC发现内存不足时,才会清理软引用对象,GC会保证在出现OutOfMemoryError之前清理软引用对象;
弱引用
基本概念:
- 用WeakReference<>进行软引用声明,弱引用声明的对象也具有内存敏感性,因此用于实现缓存,在下一次gc周期到来之间,弱引用对象不会回收;
特点
- 对于软引用指向的对象,当被gc扫描到时,会清理掉该对象;
幻象引用/虚引用
ReferenceQueue-引用队列
作用:如果某个引用与ReferenceQueue绑定,则JVM会在特定的时机将引用入队,开发者便可以从队列中获得该引用,从而判断引用指向的对象的一些状态;比如判断对象是否被回收;
String、StringBuffer 、StringBuilder
String
StringBuilder
StringBuffer(线程安全)
StringBuffer的线程安全是利用synchronized关键字实现的,这也是StringBuffer 与 StringBuilder是否线程安全的关键所在
String.intern
字符编码
选用合适的字符编码能有效的节省字符串的内存空间以及提升字符串的操作效率,不同的字符编码所规定的单个字符所占字节有所不同,应选择合适的字节编码,而不是盲目指定编码
总结
- 使用StringBuilder以及StringBuffer时,最好能指定合适的capacity,这样就不用因为容量不足而频繁扩大存储空间
IO操作的常见方式-BIO \NIO\ AIO
BIO 的 概念:
即传统的IO操作,比如对文件的读写,对网络流的读写等,都属于BIO操作,属于同步阻塞操作,即当前线程会阻塞等待准备工作完成;
NIO概念:
属于同步非阻塞操作,利用channel来对各个IO操作进行管理,若当前IO操作堵塞,则需让出线程资源给其他IO操作进行调用;
AIO概念:
异步非堵塞,类似Android 事件回调,即IO不会堵塞,会直接返回,只有当结果出来后才会触发回调,接着再执行回调之后的事件;