面试宝典---java程序设计的基本概念

一.JVM的工作原理


  我们都知道java语言的最大优点在于他的跨平台概念,为什么能跨平台?因为有了这个jvm,中文为java 虚拟机.正因为它的存在所以有了一次编译,到处运行一说..
    Java是一种技术,它由四方面组成:Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示:
        面试宝典---java程序设计的基本概念

   运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。 

·每个JVM都包含

方法区、Java堆、Java栈、本地方法栈、指令计数器及其他隐含寄存器

面试宝典---java程序设计的基本概念


JVM内存结构分为:方法区(method),栈内存(stack),堆内存(heap),本地方法栈(java中的jni调用)

(1)堆内存(heap)

所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。 

操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码中的delete语句才能正确的释放本内存空间。但由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。这时由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,它不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然这种方法用起来最不方便,但是速度快,也是最灵活的。堆内存是向高地址扩展的数据结构,是不连续的内存区域。由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

(2)栈内存是(stack)

在Windows下, 栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是固定的(是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 由系统自动分配,速度较快。但程序员是无法控制的。

堆内存与栈内存需要说明:

基础数据类型直接在栈空间分配,方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。引用数据类型,需要用new来创建,既在栈空间分配一个地址空间,又在堆空间分配对象的类变量 。方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完成后从栈空间回收。局部变量new出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待GC回收。方法调用时传入的literal参数,先在栈空间分配,在方法调用完成后从栈空间收回。字符串常量、static在DATA区域分配,this在堆空间分配。数组既在栈空间分配数组名称,又在堆空间分配数组实际的大小。

(3)本地方法栈(java中的jni调用)

用于支持native方法的执行,存储了每个native方法调用的状态。对于本地方法接口,实现JVM并不要求一定要有它的支持,甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可移植性的考虑,当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情,需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉

(4)方法区(method)

它保存方法代码(编译后的java代码)和符号表。存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

ClassLoader加载:
  当一个程序运行的时候,JVM启动,运行bootstrap classloader,该classloader加载核心api,然后调用ExtClassLoader加载扩展API,最后AppClassLoder加载ClassPath目录定义下的Class.

JVM编码:
 字符编码分为两部分:JVM内部和OS的文件系统.在JVM内部,同意使用Unicode表示,当这个字符从JVM内部转移到外部,就发生了字符编码转换.这里就用到了I/O流

二.length与length()

string的length()方法.length是数组的长度属性

三.java的数据类型转换

java的数据类型图

面试宝典---java程序设计的基本概念
char占两个字节

面试宝典---java程序设计的基本概念
面试宝典---java程序设计的基本概念

1.简单数据类型的转换
(byte,short,char)--int--long--float--double

低级------->高级 自动类型转换
高级------->低级 强制类型转换

byte、short、char之间计算不会互相转换,而是转换成int再计算,即使是同类型间计算也会先转换成int再计算,计算后赋值给byte、short、char需要强制类型转换。

注意:char与int 之间的转换 ,
        int c=1+'a';//98
char d=1+'a';//b
char e=(char) c;//b
  
2.包装类过渡类型转换

java的包装类就是可以将简单类型的变量表示为一个类.java共有六个包装类

boolean------->Boolean
char---------->Character
int ------------>Integer
long----------->Long
float----------->Float
double--------->Double
列如 double d=123.0;
转为int
double d=123.0;
Double d1=d;//转为包装类型
int a=d1.intValue();//再转为int型

3.string与其他字符类型的转换

 例子:int a=1;
        Integer i=a;
        String s=i.toString();

四.位运算符


五.异常