考核点:Java编译过程。
答:
第一步:编写源程序,源程序扩展名为“.java”;
第二步:在Dos命令行下,进入“.java”文件所在的目录,使用javac命令进行编译源程序;
第三步:编译后,使用Java命令运行编译后的“.class”字节码文件。
考核点:基本数据类型。
答:String不是基本数据类型,是引用数据类型。
答:基本数据类型有byte、short、int、long、float、double、char、boolean。
考核点:包装类、基本数据类型。
答:
int是八种基本数据类型中的一个;
Integer是该基本数据类型所对应的包装类;
Integer可以存null值,int不可以;
Integer相比int而言其占用的内存更大一些;
在拆箱和装箱中,二者自动转换。
考核点:自动类型转换。
答:
不正确,不能;
因为Java默认浮点型数据是double类型,所以不能编译,正确写法为float f=3.4f;
因为sl+1的结果为int类型,而int类型不能直接赋值给short类型。
考核点:null与空串的区别。
答:
String s=null:s没有初始化,不能使用,否则会引发空指针异常。
String s=””: s的初始值为””,可以正常使用。
考核点:Switch语句,与JDK7特性。
答:
Swtich可以作用在byte、short、int、char四个类型;
Enum类型在JDK1.5以上的版本可以使用;
String类型在JDK1.7以上的版本中可以使用。
考核点:String类常用方法(看看其他的常用方法,至少能说出5个以上)。
答:
第一种,使用String类的split方法:
String str = ”jack,rose,tom,mike,john”; String[] strs = str.split(","); |
l 第二种(可以不答),使用StringTokenizer类,代码为:
StringTokenizer tokener = new StringTokenizer("jack,rose,tom,mike,john ", ","); String[] result = new String[tokener.countTokens()]; int i = 0; while (tokener.hasMoreTokens()) { result[i++] = tokener.nextToken(); } |
考核点:属性与方法的区别。
答:
数组没有length方法,但是有length属性;
String类有length()方法。
考核点:String类型的内存原理。
答:
如果String常量池中,已经创建"xyz",则不会继续创建,此时只创建了一个对象new String("xyz"),此时为一个对象;
如果String常量池中,没有创建"xyz",则会创建两个对象,一个对象的值是"xyz",一个对象new String("xyz"),此时为二个对象。
考核点:String类型的内存原理。
答:
0或1个,如果字符串常量池有"abc",创建0个,如果没有就创建1个。
考核点:基本类型的占用范围。
答:
char型变量中能存储一个中文汉字。原因如下:
在Java中,char类型采用的是Unicode编码,每个Unicode编码是16位,每个字节占8位,所以char占两个字节,而汉字占用两个字节;
Unicode编码字符集中包含了汉字;
如果某个汉字没有包含在Unicode字符集中,那么是不能被char型变量存储的。
考核点:break特殊用法。
答:
public void test { A:for (int j = 0; j < 10; j++) { for (int i = 1; i < 10; i++) { if (i == 5) break A; } } } |
考核点:短路机制、按位比较。
答:
&&前的判断条件为false,就不进行判断&&之后的语句,结果直接为false;
&如果比较的是两个二进制的值,按照按位比较。
||前的判断条件为true,就不进行判断||之后的语句,结果直接为true;
|如果比较的是两个二进制的值,按照按位比较。
考核点:数学类常用方法。
答:
Math.round(11.5) = 12;
Math.round(-11.5) = -11;
Math.round()方法:四舍五入。
考核点:final关键字。
答:
被final修饰的类不可以被继承;
被final修饰的方法不可以被重写;
被final修饰的变量不可以被改变;
如果修饰引用,那么表示引用不可变,引用指向的内容可变;
被final修饰的方法,JVM会尝试将其内联,以提高运行效率;
被final修饰的常量,在编译阶段会存入常量池中。
考核点:内存原理。
答:
内存泄漏(Memory Leak):是指应用程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏危害可以忽略,但如果任其发展最终会导致内存溢出,如读取文件后流要进行及时的关闭以及对数据库连接的释放。
内存溢出(Out Of Memory):是指应用程序在申请内存时,没有足够的内存空间供其使用。如我们在项目中对于大批量数据的导入,容易产生内存溢出,一般采用分批量提交的方式。
考核点:基本数据类型占用空间大小。
答:
布尔型boolean:8位;
字节型byte:8位;
字符型char:16位;
短整型short:16位;
整形int:32位;
长整形long:64位;
浮点型float:32位;
双精度double:64位;
引申,boolean类型分析:
占用1个bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
占用1个字节
理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
占用4个字节
理由来源是《Java虚拟机规范》一书中的描述:“boolean数据类型,单独使用是4个字节,在数组中又是1个字节。
总结:
boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义。
考核点:数组的内存原理
答:
如果一个对象使用new关键字创建,会在堆上分配内存空间,然后返回该对象的引用;
因为数组也是一个对象,所以也会在堆上分配内存空间,然后返回该对象的引用,简单的值类型的数组,每个数组成员是一个引用到运行时常量池上的空间。
考核点:编译机制。
答:
一个Java源文件中可以包括多个类,但是单个文件中只能有一个public类,并且该public类必须与文件名相同。
考核点:String类。
答:
String类不是基本类型,而是一个引用类型。
String类是final类型的,因此不可以继承这个类、不能修改这个类。
实际编码中为了提高效率、节省空间,应该用StringBuffer类、StringBuilder类来更改字符串的值。
考核点:值传递和引用传递。
答:
基本数据传递参数时采用值传递。值传递意味着传递了值一个副本,因此,就算是改变了值副本,也不会影响源值;
引用类型传递参数时采用引用传递。引用传递意味着传递的并不是实际的对象,而是对象的引用,因此,外部对引用对象所做的改变会反映到传递的对象上。
考核点:JDK的组成。
答:
Java运行时环境(JRE)是执行Java程序的Java虚拟机,它同时也包含了执行Applet需要的浏览器插件。
Java开发工具包(JDK)是完整的Java软件开发包,包含了Java开发工具(比如:JavaDoc、Javac)、JRE、Java编译器、Java SE API,可以让开发者开发、编译、执行Java应用程序。
考核点:Java内存原理。
答:
在JDK1.7之前运行时常量池逻辑包含字符串常量池,并存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代;
在JDK1.7字符串常量池被从方法区拿到了堆中,这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区,也就是hotspot中的永久代;
在JDK1.8 hotspot移除了永久代用元空间(Meta Space)取而代之,这时候字符串常量池还在堆,运行时常量池还在方法区,只不过方法区的实现从永久代变成了元空间(Meta Space)。
扩展:
Sun的JDK版本从1.3.1开始运用Hotspot虚拟机,2006年底开源,主要使用C++实现,JNI接口部分用C实现。
Hotspot是较新的Java虚拟机,用来代替JIT(Just in Time),可以大大提高Java运行的性能。Java原先是把源代码编译为字节码在虚拟机执行,这样执行速度较慢,Hotspot将常用的部分代码编译为本地(native)代码,提高了性能。