1、java程序员面试宝典1java基础知识java开发环境JRE和JDK的区别?各自的作用:JRE:Java Runtime Environment的缩写,是java程序运行环境JDK:Java Development Kit,是java的开发工具包,包含了各种类库,同时也包含JRE,具备开发功能的JDK所包含的JRE同时有client的JVM和server的JVM,而仅仅作为运行环境的JRE下只有client的jvm.dll就够了。 JDK需要进行环境变量的配置,JRE安装时会自动经JRE的java.exe添加到系统变量Path中。JDK是java开发工具,不仅提供了java程序运行所需要的J
2、RE,还提供了一系列的编译、运行等工具,如javac java javaw等。JRE只是java程序的运行环境,其最 核心的内容就是JVM(java虚拟机)及核心类库。如何用JDK编译和运行应用程序编译:javac,将源码编译为class文件 运行:java,运行包含主方法的class文件注意 需要将JDK的安装目录/bin配置到Path环境变量中环境变量ClassPath的作用ClassPath环境变量是用来指定java程序搜索类的路径的,对于java应用程序来说,该变量的意义是非常重要的。CLASSPATH环境变量在编译java源码和运行程序是使用,也就是为java程序所依赖的接口、类等指
3、定一个搜索路径。例如:.;c:jarlogj4.jar;d:workjava 指定了三个搜索路径,分别为:当前目录、logj4.jar文件的路径和d:workjava文件夹下的所有的类。在java程序编译和运行 时,不仅会在CLASSPATH中搜索类,还会在JRE的目录下去找一个名为rt.jar的文件,器路径为jre/lib/rt.jar。并且 会先搜索rt.jar 再搜索CLASSPATH指定的目录如何为java程序动态指定类搜索路径JDK中的java和javac命令提供了 cp 和 classpath 选项为java程序动态指定类搜索路径。如 javac -cp D:workjavalog
4、j3.jar HelloWorld.java或者 java -cp D:workjavalogj3.jar HelloWorld.java cp 也可以用classpath代替java和c+程序在编译和运行有什么区别C+源码编译以后生成的特定机器可以直接运行的文件,而java编码经过编译后生成的中间字节码文件,这些字节码文件需要放到JVM中运行,而JVM是有多个 平台版本的所以说java鱼油跨平台性。java是解释型语言 c+是编译性语言什么是JVM及其工作原理JVM是一种用软件模拟出来的计算机,用于执行java程序编译后生成的中间字节码文件,是java跨平台的依赖基础。java虚拟机有自己想
5、象的硬件,如处理器、 堆栈、寄存器等,还具有相应的指令系统,它运行java程序好像一台计算机运行C+或C程序一样,它屏蔽底层系统实现的细节。java程序为何无须使用delete语句进行内存回收JVM在内存存储对象的原理:java除了8中基本类型外,其他的类型都是对象类型的数据。JVM会把程序中的对象放在堆空间。 堆是一个运行时的数据存储区,一般,运行时的数据存储区包含堆和堆栈,栈中存放非static的自动变量、函数参数、表达式的临时结果和函数返回值。栈中的 这些实体数据的分配和释放都是由系统自行完成的。堆中存放的实体数据都是程序中由程序员显示分配的,没有自动垃圾回收机制的系统必须由程序员显式释
6、 放这些实体。JVM具有垃圾回收机制,也就是堆内存的管理的自动运行。提出:如何确定对象已经回收? java中根父类java.lang.Object中有个finalize()方法,它会在垃圾回收期认为这个对象是垃圾的之后,真正回收之前被调用。因为所有的类都继承自OBject,所以 它们都会有finalize()方法。所以程序员可以在这个方法中实现一些对象被回收之前的事,如关闭数据库连接等,finalize()方法的原型为protected void finalize()throws Throwable另外java.lang.System类中有一个gc()方法,也对垃圾回收有一定的影响。通过显式的
7、调用它可以请求开始垃圾回收线程,开始垃圾回收,但是垃圾回收线程是否 立即开始还是有JVM算法决定。 java,kabg.Runtime类中gc()方法与System的作用一样,只不过是Runtime是一个单例模式的类,需要用getRunTime()方法先获得实例,然后调用gc方法java的堆内存的数据释放功能由垃圾回收器自动完成,无需程序员显式的调用delete方法。该机制有效的避免了程序员因忘记释放内存而造成的内存溢出的错 误,是一项改进。生成、部署如何利用命名提示符把java程序打包成jar文件【分析】 jar文件是java程序打包以后的格式文件,它一般保存的有class文件、配置文件等。
8、jar文件的主要是方便程序的发布和部署。jar c t x u f v m e 0 M i-c 目录 文件名.ctxuf必选其一vmeOMi可选其一 【答案】利用JDK的bin目录下的jar命令就可以对java程序进行打包,一般需要包含程序所需要的class文件、配置文件和manifest.mf文件。其中C -V 和 -f三个命令较为常见 (创建、生成详细报告、指定jar包的文件名)jar cf test.jar 创建并生成 test.jar包关于java web项目的生成、部署和配置问题一个标准的java web应用程序的规范包括:目录结构、web配置文件、打包和部署、Servlet JSP
9、 等文件夹的目录机构必须包含一个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开发,并意
10、味值熟悉Java Web开发,只能说是使用动态语言开发Web乘车,JSP作为Java Web开发是不可或缺的一部分,在大多数的开发中,它往往是用于显示处理后的结果。 打包与部署:web应用程序也可以打包,只是后缀是War,与jar打包原理一样,都可以通过JDK提供的jar命令进行打包。部署:将java Web应用程序的文件夹或打包文件放在Tomcat的安装目录项/webapps下面即可完成部署 【答案】java Web应用程序的生成、需要把它所需要的class文件编译好存放在WEB-INF/classes下,然后按照以上介绍的目录结构放置各类文件,如果需要添加自己的配 置,需要增加或修改WEB
11、-INF/web.xml文件。对于JAVA WEB应用程序的部署,可以使用文件夹夏河War文件两种部署方式,其中War就是把文件夹按照jar的方法 进行打包,只不过后缀为War。EJB项目的生成和部署【答案】EJB项目的生成过程主要有两个步骤:编译class文件和特定位置中存放配置文件,例如:对于EJB 3.0程序的JPA,就需要在META-INF文件夹下存放持久化的配置 文件persistence.xml。部署的过程也比较简单,就hi把打包好的jar文件或未打包的文件夹存放在java EE服务器指定的路径下即可。Java语法基础基础类型和语法变量及其作用范围【答案】 静态变量:由类决定 成员
12、变量:由对象决定局部变量:定义在方法中的变量、方法的参数或代码块里定义的变量,作用范围用来界定局部变量不能与上一层局部变量同名会编译错误 局部变量可以与成员变量和静态变量重名,此时如果想要调用成员变量使用this指针,使用静态变量可以使用类名。java变量分哪两种大的数据类型基本数据类型:直接存放数据的值:byte char short int long float double boolean引用数据类型:存放数据所在的地址class Studentpublic String name; public int age;public Student(String name,int age) t
13、his.name = name;this.age = age;public class RefTestprivate static void refChange(Student stu) stu.name = wang;stu.age = 10;public static void main(String args) Student stu1 = new Student(zhang,12); Student stu2 = stu1;refChange(stu2); System.out.println(stu1.name+,+stu1.age);/wang,10;即stu1 和 stu2指向的
14、是同一个地址,所以改变stu2,stu1也会跟着改变。java中的基本类型和包装类byte char int short long float double booleanByte Character Integer Short Long Float Double Booleanjava中的装箱和拆箱java 5.0 提供了自动装箱和拆箱的功能,可以使用以下语句进行打包基本类型Integer integer = 10;【答案】 java中的装箱和拆箱指的是基本数据类型和包装类型的自动相互转换,它为开发者提供了方便。开发人员也可以不使用它,而手动的进行数据类型转换。并 且,这个自动转换的过程是在
15、编译阶段。java的引用和C+的指针有什么区别【分析】+ 类型:引用其值为地址的数据元素,java封装了的地址可以转换成字符串看,长度可以不用关心。C+指针是一个装地址的变量,长度一般是计算机字长,可 以认为是个int+ 所占内存:引用声明是没有实体,不占空间。c+指针如果声明后会到用时餐赋值,不用则不会分配内存。+ 初始值:引用的初始值 null,指针初始值不固定所以比较危险+ 计算:引用是不可以计算的。C+指针是int,可以计算+ 控制:引用不可以计算,所以它只能在自己程序中,可以被控制。C+指针是可以计算,所以比较危险+ 内存泄露:java引用不会产生内存泄露,c+指针容易产生+ 作为参
16、数:java的方法参数只是传值,引用作为参数是,返回给函数内引用的值的拷贝,所以在喊内交换两个引用是没有意义的,但是改变引用的属性是有用 的,因为拷贝和引用的引用对象是同一个对象。【答案】 java的易用与C+指针主要有类型、所占内存、内存泄露、初始值、计算和控制以及作为参数8个方面。本质上,它们两者都是想通过一个叫做引用或者指针的 东西,找到要操作的目标,方便在程序中操作。java中的引用更加安全一些。简述java中的main方法public static void main(String args)【答案】main()方法是java程序的执行入口,它是一个定义在类中的、公开的、静态的、无返
17、回值的、参数为一个字符串数组的方法,它的参数args与执行参数一一对 应。java中的equal和=的区别【答案】equal和= 都表示相等的意义= 运用在基本数据类型比较时,比较的是实际的值,当用于比较引用类型是,则比较两个引用的地址是否相等equal 方法是java.lang.Object的方法,可以被程序员覆盖重写通过自定义的方式来判断两个对象是否相等,对于字符串java.lang.String类来说,它的equal方法用 来比较字符串的字符序列是否完全相等。java中提供几种循环结构?各自的特点for,适合循环次数的循环结构 while 适合单条件的循环do while 适合在执行某段
18、代码之后,再循环的时候更适合一些。三元操作符注释/ /* / /* */对象和类型类和对象有什么区别java的类通过class关键字进行定义,它代表了一种抽象的集合 对象,指的是某一个特定抽象的实例,它属于某一种类型java中如何使用继承来重写代码【答案】 java采用的是单继承机制,使用extend关键字。通过继承以后,子类就拥有了父类除了私有成员以外的所有成员,从而达到代码重用的目的。在继承过程中,可 以通过方法的覆盖来实现多态,让子类拥有自己独特的方法实现方式。简述java中的多态【答案】 多态 一词按照字面意思是来理解为“多种形式,多种状态”。它的本质是,发送消息给某个对象。让该对象自
19、行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。介绍java中静态成员的特点静态成员是一组比较特殊的成员,它不属于某个特定的类的实例,而是属于一个类所有,这个类的所有实例可以共享他们。在类加载时,就进行创建好初始化 或执行代码。对于一个类来说,都只有一份简述java派生类中的构造方法如何为父类传递参数在java中,使用super关键字加括号()的形式来为父类的构造方法提供参数,通过参数的数据和类型来决定调用哪一个构造方法。如果调用的是父类的默认的 无参数构造方法,则可不必显式地使用 super()简述接口与抽象类的区别【答案】 抽象类是一种功能不全的类,接口只是
20、一个抽象方法声明和静态不能被修改的数据的集合,两者都不能被实例化。从某种意义上说,接口是一种特殊形式的抽 象类,在java中,抽象类表示一种继承关系,一个类只能继承一个抽象类,而一个类可以实现多个接口。 抽象类中不仅有方法,还可以成员变量,抽象类中也可以有非抽象方法,包含抽象方法的类一定是抽象类,抽象类不能被实例化 接口中的所有方法都是抽象方法,但是可不必显式用abstract 定义,只能包含静态变量,并且这些变量的值不可修改。简述内部类的实质【分析】 内部类的含义:内部类就像一只寄生虫一样,寄生于其他类的内部。缩小了可见性。内部类的分类:局部式和成员式。成员内部类指的是它们定义的的地方与成员
21、变量和成员方法类型,就好像是类的一个成员一样。局部式内部类则是定义在方 法体中,仅属于局部范围所有。成员式内部类又分为:静态内部类和成员内部类。 局部式内部类又分为:普通局部式和匿名内部类。 【答案】静态内部类:相当于外部类的静态成员一样,使用static修饰的内部类,它隶属于外部类,使用起来相当于一个独立的外部类。 成员内部类:相当于外部类的普通成员一样,隶属于外部类的具体事例,在定义时,需要先创建外部类的对象,再创建它的实例。 局部内部类:定义在一个方法体中,它往往仅作为方法短暂的使用,只能访问用final修饰的局部变量。 匿名内部类:它也定义在方法体中,但是它没有一个具体的名字,具有非常
22、大的灵活性,工作本质与局部内部类类似。包和访问控制包应该如何被创建及使用包是java程序中关于命名空间的一种手段,它可以有效的解决类重名的问题。当需要把一个类定义在某个包下的时候,需要使用package关键字进行定义;当需 要使用其他包下的类的时候,则需要使用import关键字进行导入。寿命private、protected、public和default的区别类内部 本包 子类 外部包public y y y y protected y y y n default y y n n private y n n n数据类型及类型转换整型数据int和Integer的区别【分析】int通过new 包装
23、类或静态的valueOF方法转换成包装类装箱Integer通过调用intValue方法转换为int类型拆箱 【答案】int是基础类型,字节长度为4,它的创建不会在堆内存中开辟空间,一般保存在栈中,可以进行算术运算,在参数传递时,直接传递它的值。 Integer是int的包装类,本质是一个类。它的创建会在堆中开辟一块新的空间。不能进行算术操作。传参时传递的是它所代表的对象的一个引用。int的取值范围-231 (231-1)如何使用八进制和十六进制数来表示整型数据【答案】java中八进制以0开头,十六进制以0x开头long的取值范围-261 (261-1)实型数据float和double的取值范围
24、float:3.4E+10-38 3.4E+1038 double:1.7E+10-308 1.7E+10308小数默认是 double,所以float需要显式定义:float i= 2.3f;而不是 float i= 2.3;实型与整型的转换如何使用BigDecimal类进行精确运算【答案】1 用float或double变量构建BigDecimal对象,通过构造方法或者valueOf方法2 通过调用BigDecimal的加、减、乘法、除法等。3 把BigDecimal对象转换为float int等基本类型,是使用xxxValue()等方法布尔型数据java中可以使用非0代表true吗?【答案
25、】不能,java中非0不能代表true,只能使用布尔型的true和false进行条件判断。boolean和Boolean的区别【答案】1 boolean是基础数据类型,Boolean是包装类2 boolean一般存放在栈中,Boolean存放在堆中 3 boolean有true和false两种值,Boolean还有null字符串数据char 的取值范围java中的char采用Unicode编码格式,用两个字节表示一个字符,16位。所能表示的最大数量为216char能否存放汉字char可以存放汉字,每个汉字都有相应的Unicode,而char是用Unicode表示的,所以可以表示汉字。如何使用转
26、义字符使用反斜杠”字符 一起构成转义字符 b r回车 n换行等String类型字符串可以使用+号,String类不能被继承字符串变量是否自动生成一个String对象【答案】可以。字符串类具有一定的特殊性,JVM在执行双引号操作符的时候,会自耦东创建一个String对象,并返回该对象的引用。字符串对象池的作用是使用双引号和new创建字符串对象的区别在于,前者在对象池中取对象,后者直接生成新对象。String str1 = abc; String str2 = abc;str1 = str2/true;因为会先去对象中检测有没有值相等的对象,有就取,没有再创建String str3 = new S
27、tring(abc);str1 = str3/false;new 会直接创建新对象,所以此处引用不同。StringBuer 和 StringBuilder存在的作用【分析】Java中的字符串对象有一个对象,为不变形,即它只能被创建,而不能被改变,因此,一些大量使用字符串的程序可能出现性能瓶颈,甚至内存溢 出。【答案】 在java中,如果有大量拼接字符串的需要的话应该使用StringBuer和StringBuilder类,它们可以避免不必要的String对象的产生,以提供性能,StringBuer线程 不安全。StringBuilder线程安全如何输出反转后的字符串【分析】常规算法:遍历逆序打印
28、,或者转换为char数组toChar方法,逆序打出。 但是java中使用StringBuer可以更容易实现调用其reverse()方法。如何使用指定的字符集创建String对象String a = 中文;String b = new String(a.getBytes(),GBK);String c = new String(a.getBytes(),UTF-8);数组和集合的使用java数组如何理解数组在java中作为一个类int arr = new int1,2,3,4; int ar1= new int4;数组的类名可以通过获取数组的Class类型来获取arr.getClass.getN
29、ame();/I str.getClass.getName();/Ljava.lang.String【答案】 java的数组本质是一个类,该类保存了数据类型的信息。该类通过成员变量的形式来保存数据。并且通过符号,使用下表来访问数据。在处理基本类型数据 时,数组保存的是变量的值,如果未提供初始值,数组会将int型初始为0,如果处理引用类型时,数组保存的是数据的引用,如果程序员为提供初始值,数组会 把这些变量的值初始化为nullnew Object5语句是否创建了5个对象java数组的本质是一个Java类,它也是通过 new 语句进行 实例化。但是这个new语句却不会实例haul数组中的对象。 【
30、答案】不会,题目语句实际上创建了一个数组实例,长度为5,每个数组元素的值为null,并没有创建5个Object实例。如何拷贝数组的数据如果用= 号 ,则只是复制了引用,并没有把数组进行拷贝,改变的同一块地址 【答案】使用System.arraycopy()方法,或者重新创建一个数组,循环赋值。二维数组的长度是否固定int arr = new int3; arr0 = new int4; arr1 = new int1,2; arr2 = new int1,2,3;【答案】长度不固定,java数组的长度可以动态变化,程序员可以任意扩展数组的维度,每一维度的元素个数可以不同。集合框架什么是集合collection - set(sortedSet),list map(sortedMap)List:有序存放,允许重复,可以存放不同类型的对象Set:无序存放,不允许重复,可以存放不同类型的对象SortedSet:排序的Set Map:键值对 SortedMap:排序好的Map【答案】 集合是用来存放其他对象的对象,代表一种底层结构,用于扩展数组的功能。结合框架由一系列的接口和实现类组成,包括列表、集合、映射等,它们大多具 有可迭代性和可比较性迭代器是什么【分析】 迭代器模式,又叫游标模式,提供一种方法访问一个容器对象中各个元素,而又不需要暴露该对象的内部细节。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1