java程序员面试宝典1.docx
《java程序员面试宝典1.docx》由会员分享,可在线阅读,更多相关《java程序员面试宝典1.docx(48页珍藏版)》请在冰豆网上搜索。
java程序员面试宝典1
java基础知识
java开发环境
JRE和JDK的区别?
各自的作用
:
JRE:
JavaRuntimeEnvironment的缩写,是java程序运行环境
JDK:
JavaDevelopmentKit,是java的开发工具包,包含了各种类库,同时也包含JRE,具备开发功能的JDK所包含的JRE同时有client的JVM和server的JVM,而
仅仅作为运行环境的JRE下只有client的jvm.dll就够了。
JDK需要进行环境变量的配置,JRE安装时会自动经JRE的java.exe添加到系统变量Path中。
JDK是java开发工具,不仅提供了java程序运行所需要的JRE,还提供了一系列的编译、运行等工具,如javacjavajavaw等。
JRE只是java程序的运行环境,其最核心的内容就是JVM(java虚拟机)及核心类库。
如何用JDK编译和运行应用程序
编译:
javac,将源码编译为class文件运行:
java,运行包含主方法的class文件
注意需要将JDK的安装目录/bin配置到Path环境变量中
环境变量ClassPath的作用
ClassPath环境变量是用来指定java程序搜索类的路径的,对于java应用程序来说,该变量的意义是非常重要的。
CLASSPATH环境变量在编译java源码和运行程序是使用,也就是为java程序所依赖的接口、类等指定一个搜索路径。
例如:
.;c:
\jar\logj4.jar;d:
\work\java指定了三个搜索路径,分别为:
当前目录、logj4.jar文件的路径和d:
\work\java文件夹下的所有的类。
在java程序编译和运行时,不仅会在CLASSPATH中搜索类,还会在JRE的目录下去找一个名为rt.jar的文件,器路径为jre/lib/rt.jar。
并且会先搜索rt.jar再搜索CLASSPATH指定的目录
如何为java程序动态指定类搜索路径
JDK中的java和javac命令提供了cp和classpath选项为java程序动态指定类搜索路径。
如javac-cpD:
\work\java\logj3.jarHelloWorld.java
或者java-cpD:
\work\java\logj3.jarHelloWorld.javacp也可以用classpath代替
java和c++程序在编译和运行有什么区别
C++源码编译以后生成的特定机器可以直接运行的文件,而java编码经过编译后生成的中间字节码文件,这些字节码文件需要放到JVM中运行,而JVM是有多个平台版本的所以说java鱼油跨平台性。
java是解释型语言c++是编译性语言
什么是JVM及其工作原理
JVM是一种用软件模拟出来的计算机,用于执行java程序编译后生成的中间字节码文件,是java跨平台的依赖基础。
java虚拟机有自己想象的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统,它运行java程序好像一台计算机运行C++或C程序一样,它屏蔽底层系统实现的细节。
java程序为何无须使用delete语句进行内存回收
JVM在内存存储对象的原理:
java除了8中基本类型外,其他的类型都是对象类型的数据。
JVM会把程序中的对象放在堆空间。
堆是一个运行时的数据存储区,一般,运行时的数据存储区包含堆和堆栈,栈中存放非static的自动变量、函数参数、表达式的临时结果和函数返回值。
栈中的这些实体数据的分配和释放都是由系统自行完成的。
堆中存放的实体数据都是程序中由程序员显示分配的,没有自动垃圾回收机制的系统必须由程序员显式释放这些实体。
JVM具有垃圾回收机制,也就是堆内存的管理的自动运行。
—提出:
如何确定对象已经回收?
java中根父类java.lang.Object中有个finalize()方法,它会在垃圾回收期认为这个对象是垃圾的之后,真正回收之前被调用。
因为所有的类都继承自OBject,所以它们都会有finalize()方法。
所以程序员可以在这个方法中实现一些对象被回收之前的事,如关闭数据库连接等,finalize()方法的原型为
protectedvoidfinalize()throwsThrowable
另外java.lang.System类中有一个gc()方法,也对垃圾回收有一定的影响。
通过显式的调用它可以请求开始垃圾回收线程,开始垃圾回收,但是垃圾回收线程是否立即开始还是有JVM算法决定。
java,kabg.Runtime类中gc()方法与System的作用一样,只不过是Runtime是一个单例模式的类,需要用getRunTime()方法先获得实例,然后调用gc方法
java的堆内存的数据释放功能由垃圾回收器自动完成,无需程序员显式的调用delete方法。
该机制有效的避免了程序员因忘记释放内存而造成的内存溢出的错误,是一项改进。
生成、部署
如何利用命名提示符把java程序打包成jar文件
【分析】jar文件是java程序打包以后的格式文件,它一般保存的有class文件、配置文件等。
jar文件的主要是方便程序的发布和部署。
jar{ctxuf}[vme0Mi][-c目录]文件名...
{ctxuf}必选其一[vmeOMi]可选其一【答案】
利用JDK的bin目录下的jar命令就可以对java程序进行打包,一般需要包含程序所需要的class文件、配置文件和manifest.mf文件。
其中C-V和-f三个命令较为常见(创建、生成详细报告、指定jar包的文件名)
jarcftest.jar创建并生成test.jar包
关于javaweb项目的生成、部署和配置问题
一个标准的javaweb应用程序的规范包括:
目录结构、web配置文件、打包和部署、ServletJSP等
文件夹的目录机构必须包含一个WEB-INF目录(classes、lib)以及Web描述文件web.xml;与WEB-INF同一层的目录存放的是JSP、HTML等文件。
Web配置文件定力了Servlet、过滤器、监听器和一些参数信息。
Servlet是服务器端处理HTTP请求的基本组成单元,包括JSP、过滤器等在内的许多技术都基于Servlet实现。
Servlet是符合一定规范的Java类,存活在Web容器中,由容器来控制Servlet的生命周期。
JSP是参考其他动态语言而设计,脚本语言就是java,但是本质也是Servlet,它比其他动态语言更加强大,严格意义来说,熟悉JSP开发,并意味值熟悉JavaWeb开发,只能说是使用动态语言开发Web乘车,JSP作为JavaWeb开发是不可或缺的一部分,在大多数的开发中,它往往是用于显示处理后的结果。
打包与部署:
web应用程序也可以打包,只是后缀是War,与jar打包原理一样,都可以通过JDK提供的jar命令进行打包。
部署:
将javaWeb应用程序的文件夹或打包文件放在Tomcat的安装目录项/webapps下面即可完成部署【答案】
javaWeb应用程序的生成、需要把它所需要的class文件编译好存放在WEB-INF/classes下,然后按照以上介绍的目录结构放置各类文件,如果需要添加自己的配置,需要增加或修改WEB-INF/web.xml文件。
对于JAVAWEB应用程序的部署,可以使用文件夹夏河War文件两种部署方式,其中War就是把文件夹按照jar的方法进行打包,只不过后缀为War。
EJB项目的生成和部署
【答案】
EJB项目的生成过程主要有两个步骤:
编译class文件和特定位置中存放配置文件,例如:
对于EJB3.0程序的JPA,就需要在META-INF文件夹下存放持久化的配置文件persistence.xml。
部署的过程也比较简单,就hi把打包好的jar文件或未打包的文件夹存放在javaEE服务器指定的路径下即可。
Java语法基础
基础类型和语法
变量及其作用范围
【答案】静态变量:
由类决定成员变量:
由对象决定
局部变量:
定义在方法中的变量、方法的参数或代码块里定义的变量,作用范围用{}来界定
局部变量不能与上一层局部变量同名会编译错误局部变量可以与成员变量和静态变量重名,此时如果想要调用成员变量使用this指针,使用静态变量可以使用类名。
java变量分哪两种大的数据类型
基本数据类型:
直接存放数据的值:
bytecharshortintlongfloatdoubleboolean
引用数据类型:
存放数据所在的地址
classStudent{
publicStringname;publicintage;
publicStudent(Stringname,intage){this.name=name;
this.age=age;
}
}
publicclassRefTest{
privatestaticvoidrefChange(Studentstu){stu.name="wang";
stu.age=10;
}
publicstaticvoidmain(String[]args){Studentstu1=newStudent("zhang",12);Studentstu2=stu1;
refChange(stu2);System.out.println(stu1.name+","+stu1.age);//wang,10;
即stu1和stu2指向的是同一个地址,所以改变stu2,stu1也会跟着改变。
}
}
java中的基本类型和包装类
bytecharintshortlongfloatdoubleboolean
ByteCharacterIntegerShortLongFloatDoubleBoolean
java中的装箱和拆箱
java5.0提供了自动装箱和拆箱的功能,可以使用以下语句进行打包基本类型
Integerinteger=10;
【答案】java中的装箱和拆箱指的是基本数据类型和包装类型的自动相互转换,它为开发者提供了方便。
开发人员也可以不使用它,而手动的进行数据类型转换。
并且,这个自动转换的过程是在编译阶段。
java的引用和C++的指针有什么区别
【分析】
+类型:
引用其值为地址的数据元素,java封装了的地址可以转换成字符串看,长度可以不用关心。
C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int
+所占内存:
引用声明是没有实体,不占空间。
c++指针如果声明后会到用时餐赋值,不用则不会分配内存。
+初始值:
引用的初始值null,指针初始值不固定所以比较危险
+计算:
引用是不可以计算的。
C++指针是int,可以计算
+控制:
引用不可以计算,所以它只能在自己程序中,可以被控制。
C++指针是可以计算,所以比较危险
+内存泄露:
java引用不会产生内存泄露,c++指针容易产生
+作为参数:
java的方法参数只是传值,引用作为参数是,返回给函数内引用的值的拷贝,所以在喊内交换两个引用是没有意义的,但是改变引用的属性是有用的,因为拷贝和引用的引用对象是同一个对象。
【答案】java的易用与C++指针主要有类型、所占内存、内存泄露、初始值、计算和控制以及作为参数8个方面。
本质上,它们两者都是想通过一个叫做引用或者指针的东西,找到要操作的目标,方便在程序中操作。
java中的引用更加安全一些。
简述java中的main方法
publicstaticvoidmain(String[]args)
【答案】
main()方法是java程序的执行入口,它是一个定义在类中的、公开的、静态的、无返回值的、参数为一个字符串数组的方法,它的参数args与执行参数一一对应。
java中的equal和==的区别
【答案】
equal和==都表示相等的意义
==运用在基本数据类型比较时,比较的是实际的值,当用于比较引用类型是,则比较两个引用的地址是否相等
equal方法是java.lang.Object的方法,可以被程序员覆盖重写通过自定义的方式来判断两个对象是否相等,对于字符串java.lang.String类来说,它的equal方法用来比较字符串的字符序列是否完全相等。
java中提供几种循环结构?
各自的特点
for,适合循环次数的循环结构while适合单条件的循环
dowhile适合在执行某段代码之后,再循环的时候更适合一些。
三元操作符
注释
///*//**/
对象和类型
类和对象有什么区别
java的类通过class关键字进行定义,它代表了一种抽象的集合对象,指的是某一个特定抽象的实例,它属于某一种类型
java中如何使用继承来重写代码
【答案】java采用的是单继承机制,使用extend关键字。
通过继承以后,子类就拥有了父类除了私有成员以外的所有成员,从而达到代码重用的目的。
在继承过程中,可以通过方法的覆盖来实现多态,让子类拥有自己独特的方法实现方式。
简述java中的多态
【答案】多态一词按照字面意思是来理解为“多种形式,多种状态”。
它的本质是,发送消息给某个对象。
让该对象自行决定响应何种行为。
通过将子类对象引用赋值给
超类对象引用变量来实现动态方法调用。
介绍java中静态成员的特点
静态成员是一组比较特殊的成员,它不属于某个特定的类的实例,而是属于一个类所有,这个类的所有实例可以共享他们。
在类加载时,就进行创建好初始化或执行代码。
对于一个类来说,都只有一份
简述java派生类中的构造方法如何为父类传递参数
在java中,使用super关键字加括号()的形式来为父类的构造方法提供参数,通过参数的数据和类型来决定调用哪一个构造方法。
如果调用的是父类的默认的无参数构造方法,则可不必显式地使用super()
简述接口与抽象类的区别
【答案】抽象类是一种功能不全的类,接口只是一个抽象方法声明和静态不能被修改的数据的集合,两者都不能被实例化。
从某种意义上说,接口是一种特殊形式的抽象类,在java中,抽象类表示一种继承关系,一个类只能继承一个抽象类,而一个类可以实现多个接口。
抽象类中不仅有方法,还可以成员变量,抽象类中也可以有非抽象方法,包含抽象方法的类一定是抽象类,抽象类不能被实例化接口中的所有方法都是抽象方法,但是可不必显式用abstract定义,只能包含静态变量,并且这些变量的值不可修改。
简述内部类的实质
【分析】内部类的含义:
内部类就像一只寄生虫一样,寄生于其他类的内部。
缩小了可见性。
内部类的分类:
局部式和成员式。
成员内部类指的是它们定义的的地方与成员变量和成员方法类型,就好像是类的一个成员一样。
局部式内部类则是定义在方法体中,仅属于局部范围所有。
成员式内部类又分为:
静态内部类和成员内部类。
局部式内部类又分为:
普通局部式和匿名内部类。
【答案】
静态内部类:
相当于外部类的静态成员一样,使用static修饰的内部类,它隶属于外部类,使用起来相当于一个独立的外部类。
成员内部类:
相当于外部类的普通成员一样,隶属于外部类的具体事例,在定义时,需要先创建外部类的对象,再创建它的实例。
局部内部类:
定义在一个方法体中,它往往仅作为方法短暂的使用,只能访问用final修饰的局部变量。
匿名内部类:
它也定义在方法体中,但是它没有一个具体的名字,具有非常大的灵活性,工作本质与局部内部类类似。
包和访问控制
包应该如何被创建及使用
包是java程序中关于命名空间的一种手段,它可以有效的解决类重名的问题。
当需要把一个类定义在某个包下的时候,需要使用package关键字进行定义;当需要使用其他包下的类的时候,则需要使用import关键字进行导入。
寿命private、protected、public和default的区别
类内部本包子类外部包
publicyyyyprotectedyyyndefaultyynnprivateynnn
数据类型及类型转换
整型数据
int和Integer的区别
【分析】
int通过new包装类或静态的valueOF方法转换成包装类–装箱
Integer通过调用intValue方法转换为int类型—拆箱【答案】
int是基础类型,字节长度为4,它的创建不会在堆内存中开辟空间,一般保存在栈中,可以进行算术运算,在参数传递时,直接传递它的值。
Integer是int的包装类,本质是一个类。
它的创建会在堆中开辟一块新的空间。
不能进行算术操作。
传参时传递的是它所代表的对象的一个引用。
int的取值范围
-2^31–(2^31-1)
如何使用八进制和十六进制数来表示整型数据
【答案】java中八进制以0开头,十六进制以0x开头
long的取值范围
-2^61—(2^61-1)
实型数据
float和double的取值范围
float:
3.4E+10^-38—3.4E+10^38double:
1.7E+10^-308—1.7E+10^308
小数默认是double,所以float需要显式定义:
floati=2.3f;而不是floati=2.3;
实型与整型的转换
如何使用BigDecimal类进行精确运算
【答案】
1用float或double变量构建BigDecimal对象,通过构造方法或者valueOf方法
2通过调用BigDecimal的加、减、乘法、除法等。
3把BigDecimal对象转换为floatint等基本类型,是使用xxxValue()等方法
布尔型数据
java中可以使用非0代表true吗?
【答案】不能,java中非0不能代表true,只能使用布尔型的true和false进行条件判断。
boolean和Boolean的区别
【答案】
1boolean是基础数据类型,Boolean是包装类
2boolean一般存放在栈中,Boolean存放在堆中3boolean有true和false两种值,Boolean还有null
字符串数据
char的取值范围
java中的char采用Unicode编码格式,用两个字节表示一个字符,16位。
所能表示的最大数量为2^16
char能否存放汉字
char可以存放汉字,每个汉字都有相应的Unicode,而char是用Unicode表示的,所以可以表示汉字。
如何使用转义字符
使用反斜杠”\”字符一起构成转义字符\b\r回车\n换行等
String类型
字符串可以使用+号,String类不能被继承
字符串变量是否自动生成一个String对象
【答案】可以。
字符串类具有一定的特殊性,JVM在执行双引号操作符的时候,会自耦东创建一个String对象,并返回该对象的引用。
字符串对象池的作用是
使用双引号和new创建字符串对象的区别在于,前者在对象池中取对象,后者直接生成新对象。
Stringstr1="abc";Stringstr2="abc";
str1==str2//true;因为会先去对象中检测有没有值相等的对象,有就取,没有再创建
Stringstr3=newString("abc");
str1==str3//false;new会直接创建新对象,所以此处引用不同。
StringBuffer和StringBuilder存在的作用
【分析】Java中的字符串对象有一个对象,为不变形,即它只能被创建,而不能被改变,因此,一些大量使用字符串的程序可能出现性能瓶颈,甚至内存溢出。
【答案】在java中,如果有大量拼接字符串的需要的话应该使用StringBuffer和StringBuilder类,它们可以避免不必要的String对象的产生,以提供性能,StringBuffer线程不安全。
StringBuilder线程安全
如何输出反转后的字符串
【分析】常规算法:
遍历逆序打印,或者转换为char数组toChar方法,逆序打出。
但是java中使用StringBuffer可以更容易实现调用其reverse()方法。
如何使用指定的字符集创建String对象
Stringa="中文";
Stringb=newString(a.getBytes(),"GBK");
Stringc=newString(a.getBytes(),"UTF-8");
数组和集合的使用
java数组
如何理解数组在java中作为一个类
int[]arr=newint[]{1,2,3,4};int[]ar1=newint[4];
数组的类名可以通过获取数组的Class类型来获取
arr.getClass.getName();//[Istr.getClass.getName();//[Ljava.lang.String
【答案】java的数组本质是一个类,该类保存了数据类型的信息。
该类通过成员变量的形式来保存数据。
并且通过[]符号,使用下表来访问数据。
在处理基本类型数据时,数组保存的是变量的值,如果未提供初始值,数组会将int型初始为0,如果处理引用类型时,数组保存的是数据的引用,如果程序员为提供初始值,数组会把这些变量的值初始化为null
newObject[5]语句是否创建了5个对象
java数组的本质是一个Java类,它也是通过new语句进行实例化。
但是这个new语句却不会实例haul数组中的对象。
【答案】不会,题目语句实际上创建了一个数组实例,长度为5,每个数组元素的值为null,并没有创建5个Object实例。
如何拷贝数组的数据
如果用=号,则只是复制了引用,并没有把数组进行拷贝,改变的同一块地址【答案】使用System.arraycopy()方法,或者重新创建一个数组,循环赋值。
二维数组的长度是否固定
int[][]arr=newint[3][];arr[0]=newint[]{4};arr[1]=newint[]{1,2};arr[2]=newint[]{1,2,3};
【答案】长度不固定,java数组的长度可以动态变化,程序员可以任意扩展数组的维度,每一维度的元素个数可以不同。
集合框架
什么是集合
collection-set(sortedSet),listmap(sortedMap)
List:
有序存放,允许重复,可以存放不同类型的对象
Set:
无序存放,不允许重复,可以存放不同类型的对象
SortedSet:
排序的SetMap:
键值对SortedMap:
排序好的Map
【答案】集合是用来存放其他对象的对象,代表一种底层结构,用于扩展数组的功能。
结合框架由一系列的接口和实现类组成,包括列表、集合、映射等,它们大多具有可迭代性和可比较性
迭代器是什么
【分析】迭代器模式,又叫游标模式,提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。