Java白皮书(总结一些题目)
Posted daiwenxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java白皮书(总结一些题目)相关的知识,希望对你有一定的参考价值。
java基础
1. 简述JVM的运行原理?
Java平台由Java 虚拟机和Java 应用程序接口搭建,Java语言则是进入这个平台的通道, 用Java语言编写并编译的程序可以运行在这个平台上。运行期环境代表着Java平台,开发人 员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存, 一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成 机器码执行
2. 简述JVM的运行原理?
JVM栈由堆、栈、本地方法栈、方法区等部分组成 堆: 所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控 制。 堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor 由From Space和To Space组成 栈:每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作 数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。 本地方法栈:用于支持native 方法的执行,存储了每个native 方法调用的状态 方法区:存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持 久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize 来指定最小值和最大值
3. GC是什么? 为什么要有GC?
GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘 记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动 监测对象是否超过作用域从而达到自动回收内存的目,Java语言没有提供释放已分配内存的 显示操作方法。
4. 简单阐述垃圾回收机制?
1.回收的内容是new出来的对象所占内存; 2.垃圾回收只与内存有关,清理内存外的资源依靠finalize()方法。垃圾回收机制在回收某个 对象的内存前会调用该对象的finalize()方法。 3.垃圾回收以单独的线程在后台运行,为减少虚拟机额外消耗,一般在内存不足时会进行垃圾 回收,所以就算强制系统垃圾回收,垃圾回收也不一定发生 4.对象在内存中的状态有可达状态、可恢复状态、不可达状态,当处于可恢复状态时可能会进 行垃圾回收。
5. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法?
通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使 用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量 (literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是 栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬 盘上的虚拟内存都可以被当成堆空间来使用。
变量和数据类型
1. char型变量中能不能存贮一个中文汉字?为什么?
是能够定义成为一个中文的,因为java中以unicode编码,一个char 占16个字节, 所以放一个中文是没问题的
2. 用不同的方法交换两个数的位置?
①普通的方法:建立一个临时变量,通过temp=a,a=b,b=temp来实现交换
②指针的方法:取两个数的地址,在swap方法中再用指针指向地址交换, 这时候为数值交换(函数调用结束后原空间的值也得到了交换)。 int swap(int *_x,int *_y)//主函数中把两个数的地址传过来 { int tmp = *_x;//定义中间变量 然后交换两个数 *_x = *_y; *_y = tmp; printf("%d %d",*_x,*_y); }
③加减交换:取两个数的和,然后通过减去另外一个数来得到这个数
④异或方法:通过二进制异或方法交换,如a=3二进制为11,b=2的二进制为10, 按位异或(两个值相同为0,否则为1
3. 数据类型有哪些?
整数: byte short int long
浮点数 float double
布尔 boolean
字符 char
4. 说出一些常用的类,包,接口,请各举5个?
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
常用的包:java.lang java.awt java.io java.util java.sql
常用的接口:Remote List Map Document NodeList
5. 用最有效率的方法算出2乘以8等于几?
2 <<3
选择结构
1. switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
witch(expr1)中,expr1是一个整数表达式。
因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。
long,string 都不能作用于swtich
2. &和&&的区别?
&和&&都是逻辑运算符号,&&又叫短路运算符
区别如下 int i=1;
if(i==2 & i++==2){} //i==2为false,但i++==2还会继续比较,所以i++被执行
System.out.println(i); //i 打印出来为2
int j=1;
if(j==2 && j++==2){} //j==2为false,但j++==2不会继续比较,所以j++不被执行 System.out.println(j); //j打印出来为1
& 不管前面的条件是否正确,后面都执行
&& 前面条件正确时,才执行后面,不正确时,就不执行,就效率而言,这个更好
3. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)
short s1 = 1; s1 += 1;(可以正确编译)
4. 在一个问题中如果能同时使用多个if 和if-else 完成操作,你会选择什么?为什么?
选择if-else,因为如果第一个条件满足的话后面的就不会继续判断,提高执行效率。
5. ==和equals() 都可以返回一个true或者false的结果,请问二者有什么区别?
== 可以比较基本数据类型的值也可以比较引用数据类型的值 equals()如果没有被重写的话是和==是一样的,如果被重写了就按照重写的规则进行比较
循环结构
1. for循环的语法和执行顺序是什么?
for(①;②;③){
④
}
顺序为: ① ② ④ ③
2. while do-while for 三种循环的语法和适用场景是什么?
while 语法:
while(){
}
场景:循环次数不固定的时候使用。 先判断后执行
do-while 语法:
do{
}while(条件);
场景 : 循环次数不固定的时候先执行后判断
for : 语法 for(表达式1;表达式2;表达式3){
执行的代码
}
循环次数固定的时候使用 先判断后使用
3. break 和continue的区别是什么?
break跳出循环,continue跳出本次循环,进入下次循环
4. 如何使用最简单的方式打印死循环?
for( ; ; ){ }
5. String s= new String("xyz") ?
创建了几个String Object ?如果是多个,那么他们之间有什么区别?
两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区, 常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍, 就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。 如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿
多重循环及调试
1. 说出算术运算符,关系运算符,逻辑运算符,赋值运算符,位运算符的优先级?
算术运算符,关系运算符,位运算符,逻辑运算符,赋值运算符
2. double 和long 谁的范围大?
double
System.out.println(Long.MAX_VALUE);//最大数:9223372036854775807 System.out.println(Long.MIN_VALUE);//最小数:-9223372036854775808
System.out.println(Double.MAX_VALUE);//最大数:1.7976931348623157E308 System.out.println(Double.MIN_VALUE);//最小数:4.9E-324
3. 请用一行代码写出计算闰年的方式?
year%4==0&&year%100!=0)||year%400==0
4. 阐述基本数据类型对应的包装类是哪些?
byte Byte
short Short
int Integer
long Long
double Double
float Float
char Character
booelan Boolean
5. 描述断点调试的步骤?
分析错误,设置断点
启动调试
单步运行
观察变量
发现问题
修正代码,重新运行
解决问题
一维数组及经典应用
1. 数组的概念?
数组是具有相同数据类型的数据集合,相同的数据类型,
意味着数组中每个数据都是同一类型数据,或者属于基本数据类型中相同类型的数据, 或者属于对象类型中相同类型的数据;如果按照维数来划分,
数组可分为一维数组、二维数组和多维数组等,每一维代表一个空间的数据
2. 数组在平时的 程序代码中使用是否频繁?
其实数组有一个缺点,就是一旦声明,就不能改变容量,这个也是其使用频率不高的原因
3. 实现数组排序和查询相应元素的索引方法是什么?
Arrays类的sort()方法实现排序功能; binarySearch()方法实现查找元素索引功能。
4. 数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length 的属性。String 有length()方法。javascript中,获得字符串
5. 手写冒泡排序?
public static void main(String[] args) {
int[] arr = { 3, 4, 8, 2, 5, 9, 1, 7 };
for (int i = 1; i < arr.length; i++){
for (int j = 0; j < arr.length - 1; j++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
二维数组及经典应用
1. 使用双重循环编程?
1
2 7
3 8 12
4 9 13 16
5 10 14 17 19
6 11 15 18 21 22
二维数组的做法
参考案列
int[][] a = new int[6][6];
int b = 1;
for(int j = 0; j < 6; j++) {
for(int i = j; i < 6; i++) {
a[i][j] = b++;
}
}
2. 遍历二维数组?
public class Test1 {
public static void main(String[] args) {
int[] score1=new int[10];
int[][] score2;
String[][] names; //二维数组的初始化
score2=new int[][]{{1,2,3},{3,4,5,6},{16,7}};//静态初始化
names=new String[6][5];//动态初始化方式一
names=new String[6][];//动态初始化方式二,一定要设置行数
names[0]=new String[5];//第一行中有5个元素
names[1]=new String[4];
names[2]=new String[7];
names[3]=new String[5];
names[4]=new String[8];
names[5]=new String[5];
System.out.println("第一行中的元素:"+names[1].length);
System.out.println(names.length);//打印的是二维数组有几行
//如何遍历二维数组
for(int m=0;m<score2.length;m++){//控制行数
for(int n=0;n<score2[m].length;n++){//一行中有多少个元素(即多少列)
System.out.print(score2[m][n]+" ");
}
System.out.println();
}
3. 一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序?
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1.确认使用for循环。
2.为避免重复输出结果,当找到和target值相等的array[][]时,立即跳出循环,并在循 环外判断是否存在。
3.输出结果
public static void main(String[] args) {
int[][] array={{1,2,3}, {2,3,4}, {3,4,5}};
boolean find=false ;
Scanner scanner =new Scanner(System .in);
System.out.println("请输入数字:");
int target=scanner .nextInt();//确认target的值
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j]==target) { find=true;//返回true.
i=array.length-1;
j=array[i].length-1;//当target数值等于array[i][j]时,立即跳出循环。
}
}
}if (find) { System.out.println("存在数字 "+target);
//在循环外判断target值是否存在,并输出结果。
}else {
System.out.println("不存在数字:"+target);
}
}
4. java中是否有goto?
java中的保留字,现在没有在java中使用
5. BS 与 CS 的联系和区别?
对象 |
硬件环境 |
客户端要 求 |
软件安装 |
升级和维护 |
安全性 |
C/S |
用户固定,并且处于相同区域,要求拥有相同的操作系统。 |
客户端的计算机电脑配置要求较高。 |
每一个客户端都必须安装和配置软件. |
C/S每一个客户端都要升级程序。可以采用自动升级。 |
一般面向相对固定的用户群,程序更加注重流程,它可以对权限进行多层次校验,提供了更安全的存取模式,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S结构适宜。 |
B/S |
要有操作系统和浏览器,与操作系统平台无关。 |
客户端的计算机电脑配置要求较低。 |
可以在任何地方进行操作而不用安装任何专门的软件。 |
不必安装及维护 |
吃货联盟
1. jdk 和 jre的区别是什么?
Java运行时环境(JRE)是将要执行Java 程序的Java 虚拟机。 它同时也包含了执行applet需要的浏览器插件。 Java开发工具包(JDK)是完整的Java软件开发包, 包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器), 可以让开发者开发、编译、执行Java应用程序
2. 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
不会,在下一个垃圾回收周期中,这个对象将是可被回收的。
3. 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?
吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。 而串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存)就足够了
4. String 是最基本的数据类型么?如果不是那么和 String 同种类型的数据类型还有那些?
不是,String是引用数据类型,引用数据类型还有类,接口和数组。
5. 在Java中,对象什么时候可以被垃圾回收?
当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了
认识类与对象
1. 什么是面向对象?
面向对象是一种使用封装、继承、多态、抽象等思想进行软件的分析和开发的方法,而java 就是一门面向对象编程的语言。
2. 什么是类?
现实世界是由很多对象组成的,基于对象抽出了类
3. 什么是对象?
对象:真实存在的单个的个体,类:类型/类别,一类个体
4. 类的组成部分?
生活中的类:根据对象相似的特征和相似的行为进行归类。例如:桌子、椅子 程序中的类 :由两个部分组成:1.属性(成员变量);2.方法(成员函数)
5. 类和对象的关系?
类是对象的抽象,而对象是类的具体实例。 类是抽象的,不占用内存,而对象是具体的,占用存储空间;类和对象是抽象与具体的关系
类的方法
1. 什么是成员变量?
成员变量:
1. 类中,方法外
2. new时存在堆中,对象被回收时消失
3. 成员变量可以设置初始值也可以不设置,如果不设置会有默认值。
2. 成员变量又可分实例成员变量和静态成员变量以及各自的特点?
实例成员变量:
1. 属于对象的,存在堆中
2. 有几个对象就有几份实例变量
3. 必须通过对象名.来访问
静态成员变量:
1. 属于类的,存在方法区中
2. 只有一份
3. 常常通过类名.来访问
3. 什么是局部变量?
1. 方法中
2. 调方法时存在栈中,方法调用结束时与栈桢一并消失
3. 没有默认值
4. 方法的调用方式?
1. 普通类: 实例化一个该类的对象,然后通过对象名.方法名 访问
2. 静态类: 可以通过类名直接访问,而不用实例化对象
5. 创建包的关键字package 和 导入包的关键字import的使用方式?
package:
1. 作用:避免类的命名冲突
2. 包名命名规范: 建议包名所有字母都小写,且有层次结构
3. 类的完全限定名: 包名.类名
import:
1. 作用:声明类/引入类
2. 同包中的类可以直接访问;
不同包中的类想访问:
2.1.先import 声明类再访问类(建议)
2.2.类的全称-----太繁琐(不建议)
6. 什么是方法形参和实参?
形参,就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。
实参,就是实际参数,用于调用时传递给方法的参数。实参在传递给别的方法之前是要被预先 赋值的。
7. 调用方法实参注意事项?
实参的个数、数据类型以及次序要和所调用方法声明的参数列表匹配
8. Java中定义的方法形式?以及使用方法的好处?
方法的参数列表可以是有参数的,也可以是没有参数的;
有参方法是指( )中包含一个或多个变量的定义,也称为参数列表
无参方法是指( )中不含参数
使用方法的好处:提高代码的复用性
9. 什么是值传递和引用传递?
值传递:方法调用时,实际参数将它的值传递给对应的形式参数,函数接收到的是原始值 的副本,此时内存中存在两个相等的基本类型,若方法中对形参执行处理操作,并不会影响实 际参数的值。 引用传递:方法调用时,实际参数的引用(是指地址,而不是参数的值)被传递给方法中 相应的形式参数,函数接收到的是原始值的内存地址,在方法中,形参与实参的内容相同,方 法中对形参的处理会影响实参的值。
注意: 这里要特殊考虑String,以及Integer、Double等几个基本类型包装类,它们都是 immutable 类型,因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特 殊对待,可以认为是和基本数据类型相似,传值操作。
10. this的作用?
1. 代表本类当前对象的引用
2. 既可以调用本类成员变量、成员方法,也可以调用本类的构造方法。
3. 用于区别局部变量和成员变量
继承与封装
1. 什么是封装?封装的原则?好处?
封装就是隐藏对象的属性和具体实现细节,仅对外提供公共的访问方式。
原则:
1. 将不需要对外暴露的信息隐藏;
2. 对外提供公共的访问方式。
好处:将变化隔离;提高了安全性;提高了代码代码重用性,便于使用。
2. 封装就是私有,对吗?为什么?get/set访问方式必须成对出现吗?
不对,
private(私有)仅仅是封装的一种体现形式。我们常用的类,方法,函数也是封装。只 要是对外不可见,就能达到封装的效果,比如:包与包之间的访问。
get/set访问方式不是必须成对出现的,具体看需求,需要设置值就提供set方法,如果需 要访问值,就提供get方法
3. 构造方法的特点?
1. 方法名和类名完全一致
2. 没有返回值类型,连viod都没有。
3. 没有明确的返回值,但是可以有return关键字;
4. 构造方法,set方法都可以给成员变量赋值,这两种赋值方式有什么区别?
构造方法主要作用是用来给对象初始化,赋值只是它的捎带工作,也可以不用赋值。
Set方法只能用来赋值,在原有对象的基础上赋值,可以用来修改值。
构造方法重新赋值,相对于重新创建对象。
5. 静态代码块和构造代码块的区别?
1. 静态代码块随着类的加载而加载,一般是用来加载驱动的。只在类加载的时候执行一次, 优先于构造方法执行
2. 构造代码块里边放的是所有构造方法的共性内容,为了简化书写,调高效率。每创建一次 对象,就执行一次,它是优先于构造方法执行的。
接口&抽象类
1. 类变量(静态变量)和实例变量(对象变量,成员变量)的区别?
1. 所属不同:类变量属于类,是对象的共性内容;实例变量属于对象,是对象的特性内容。
2. 在内存中位置不同:类变量存在方法区的静态区;实例变量存在堆内存中。
3. 生命周期不同:类变量随着类的加载而存在,随着类的消失而消失;实例变量随着对象的 存在而存在,随着对象的消失而消失。
4. 调用方式不同:类变量既能被类名点的形式调用,也能通过对象点的形式调用;而实例变 量只能通过对象点的形式调用。
2. 什么是继承?
当多个类中有很多共性的内容时,我们可以把这些共性内容抽取出来封装成一个类,让这些类与这个封装的类产生关系。这种关系就是继承。
3. 继承的的特点和好处,弊端?
特点:可以从以下两方面来讲:
类与类之间的继承:只能单继承不能多继承,但是可以多层继承。
接口与接口之间的继承:既可以单继承也可以多继承。
好处:
1. 提高了代码的复用性、维护性、可扩展性。
2. 让类与类产生了关系,是多态的前提。
弊端:
增强了类与类的耦合性。
4. this和super 的区别?
this代表本类当前对象的引用,谁调用我,我就代表谁。
super代表当前对象父类的内存空间标识。 (可以理解为父类的引用,通过super可以访问父 类的成员
5. super( )和this( )在构造方法能同时使用吗?
不能,
super()调用的是父类的空参构造,this()调用的是本类的空参构造,因为它们都要求 放构造方法的第一行,所以不能同时使用。
多态与方法重写
1. Java的访问修饰符是什么?
访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法 或者变量的访问权限。
它们包含:
public: 所有类都可以访问
protected: 同一个包内以及所有子类都可以访问
默认: 归属类及相同包下的子类可以访问
private: 只有本类才能访问
2. 什么是多态?使用多态的好处以及弊端?
多态是同一个行为具有多个不同表现形式或形态的能力。
多态的好处:
1. 提高了代码的维护性(继承保证)
2. 提高了代码的扩展性(由多态保证) 多态的弊端:不能使用子类的特有功能。
3. Java中实现多态的机制是什么?
方法的重写和重载是Java多态性的不同表现。重写是父类与子类之间多态性的一种表现,重 载是一个类中多态性的一种表现。
4. 方法重载和方法重写区别?
方法重载:同一个类中,方法名相同,参数的类型、顺序和个数不同,与返回值类型和方法访问 修饰符无关
方法重写:不同类中,发生在继承类中,方法名称、参数类型、返回值类型全部相同,被重写的 方法不能拥有比父类更严格的权限
5. Java实现多态的必要条件?
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用 父类的方法和子类的方法
异常
1. try-catch-finally 异常捕获语句的执行流程?
try 中是可能发生异常的程序段;
catch中依次编写对应的异常处理器方法,当抛出异常后,由运行时系统在栈中从当前位置 开始依次回查方法,直到找到合适的异常处理方法,如果未找到,则执行finally或直接结束 程序运行。 finally :无论是否捕获或处理异常,finally 块里的语句都会被执行。
注意:
当在try 块或catch块中遇到return语句时, finally语句块将在方法返回之前被执行; finally块不会被执行情况: 在前面的代码中用了System.exit(0)退出程序。
2. throw和throws关键字的区别?
throw用来抛出一个异常,在方法体内。语法格式为:throw 异常对象。
throws用来声明方法可能会抛出什么异常,在方法名后; 语法格式为:
throws 异常类型1,异常类型2...异常类型n。
3. 异常的两种类型,Error和Exception的区别?
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指 望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的 情况。
4. 运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能 遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时 异常,但是并不要求必须声明抛出未被捕获的运行时异常。
5. final, finally, finalize的区别?
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可 以覆盖此方法提供垃圾收集时的其他资源回收
QuickHit
1. 抽象类的特点?
1. 抽象方法和抽象类都必须被abstract关键字修饰。
2. 抽象方法一定在抽象类中。
3. 抽象类不可以用new 创建和实例化对象。因为抽象类本身就是不完整的。
4. 抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。
2. abstract 关键字,和哪些关键字不能共存?
final:被final修饰的类不能有子类(不能被继承)。而被abstract修饰的类一定是一个父类(一定要被继承)
private: 抽象类中私有的抽象方法不被子类所知,就无法被复写;而抽象方法出现的就是需要被复写。
static:如果static 可以修饰抽象方法,那么连对象都省了,直接类名调用就可以了。可是抽象方法运行没意义。
3. 接口的特点?
1. 接口不可实例化,可结合多态进行使用(接口 对象=new 对象())
2. 接口里的成员属性全部是以 public(公开)、static(静态)、final(最终) 修饰符修饰
3. 接口里的成员方法全部是以 public(公开)、abstract(抽象) 修饰符修饰
4. 接口里不能包含普通方法
5. 子类继承接口必须实现接口里的所有成员方法,除非子类也是抽象类
4. 面向接口编程的好处?
1. 更加抽象,更加面向对象
2. 提高编程的灵活性
3. 实现高内聚、低耦合,提高可维护性,降低系统维护成本。
5. 抽象类和接口的区别?
抽象类:是一个不能被实例化的类,因为它其中存在抽象方法,但它的其它行为和一个普通 类没什么不同。
接口:是java为了弥补不能多继承提供的概念,接口之间支持多继承,接口中只允许存在公 有静态常量或公有的抽象方法,一个类可实现多个接口,从而扩展不同的功能。
集合框架和泛型
1. Java集合框架是什么?说出一些集合框架的优点?
答:每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable 和Array。随着集合的广泛使用,Java1.2提出了囊括所有集合接口、实现和算法的集合框架。 在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久。它还包括在Java并 发包中,阻塞接口以及它们的实现。集合框架的部分优点如下:
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
(3)通过使用JDK附带的集合类,可以降低代码维护成本。
(4)复用性和可操作性。
2. 集合框架中的泛型有什么优点?
答:Java1.5引入了泛型,所有的集合接口和实现都大量地使用它。泛型允许我们为集合提供 一个可以容纳的对象类型,因此,如果你添加其它类型的任何元素,它会在编译时报错。这避 免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。泛型也使得代 码整洁,我们不需要使用显式转换和 instanceOf操作符。它也给运行时带来好处,因为不会产生类型检查的字节码指令。
3. Java集合框架的基础接口有哪些?
答:
(1)Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。 Java平台不提供这个接口任何直接的实现。
(2)Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代 表集合,就如一副牌。
(3)List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List 更像长度动态变换的数组。
(4)Map是一个将key映射到value 的对象.一个Map不能包含重复的key:每个key 最多只能映射一个value。
(5)一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。
4. 为何Map接口不继承Collection接口?
答:
(1)尽管Map接口和它的实现也是集合框架的一部分,但Map不是集合,集合也不是 Map。因此,Map继承Collection毫无意义,反之亦然。
(2)如果Map继承Collection接口,那么元素去哪儿?Map 包含key-value 对,它提 供抽取key或value 列表集合的方法,但是它不适合“一组对象”规范。
5. Iterator是什么?
答:Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代 器方法来获取迭代器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用 者在迭代过程中移除元素。
实用类介绍
1. 如何将字符串转化成int?
答:使用包装类Integer。Integer.valueOf("2");其他基本数据类型都是类似
2. 为什么在Java中存储密码要使用char[],而不使用String?
答:因为String是不可变的,当String创建之后,就不会再改变了。而char[]是可变的,程 序员在用完之后可以将其改变,不会留下任何原始数据。所以,在使用密码时,一般都是会用 char数组,例如JavaSwing中的JPassWordField,获取密码框的值就是使用char数据。而 不使用String。
3. 如何将字符串转换成时间Date?
答:使用SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date =sdf.parse("2017-12-10")。
4. 字符串对象String,StringBuilder ,StringBuffer之间的区别?
答: String不可变的,其余两个为可变的,也就是可以自由增加或者删除字符串。 StringBuilder 和StringBuffer,前者是线程不安全的,后者是线程安全的。理论上StringBuilder 效率更高。 字符串大量拼接时,建议使用StringBuilder ,StringBuffer。
5. 计算一个字符串某个字符的出现次数?
答:
(1)使用charAt方法截取之后,循环判断。
(2)使用apache commons lang包中的StringUtils:
int n = StringUtils.countMatches("ababababab", "a");
System.out.println(n);
输入和输出处理
1. java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
答:
(1)字节流,字符流。
(2)字节流继承于InputStream OutputStream,
(3)字符流继承于Reader Writer。在java.io包中还有许多其他的流,主要是为了提高 性能和使用方便。
2. 什么是java序列化,如何实现java序列化?
答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以 对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对 对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable 接口,该接口没有需要实现的方法, implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如: FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出 (即保存其状态),要恢复的话则用输入流。
3. 使用处理流的优势有哪些?如何识别所使用的流是处理流还是节点流?
答:
优势:对开发人员来说,使用处理流进行输入/输出操作更简单;使用处理流的执行效率 更高。
判别:处理流的构造器的参数不是一个物理节点,而是已经存在的流。而节点流都是直接 以物理IO及节点作为构造器参数的。
4. 什么是标准的I/O流?
答:在java语言中,用stdin表示键盘,用stdout表示监视器。他们均被封装在System类的类变量in 和out中,对应于系统调用System.in和System.out。这样的两个流加上
System.err统称为标准流,它们是在System类中声明的3个类变量:
public static InputStream in;
public static PrintStream out;
public static PrintStream err;
5. 什么能被序列化?什么不能被序列化?
答:
能被序列化:
①属性(包括基本数据类型、数组、对其它对象的引用);
②类名;
不能被序列化:
①static的属性;
②方法;
③加了transient修饰符的属性。
要想序列化对象,必须先创建一个outputstream,然后把它嵌进objectoutputstream。 这时就能用writeobject()方法把对象写入outputstream,。读的时候需要把inputstream嵌 到objectinputstream中,然后在调用readobject()方法。
XML
1. XML 是什么?
答:XML 可扩展标记语言(ExtensibleMarkuplanguage),可以根据自己的需要扩展 XML。
XML 中可以轻松定义, 等自定义标签,而在 html 等其他标记语言中须使用预定义标签,比如,而不能使用用户定义的标。
2. DTD 与 XML Schema 有何区别?
答:DTD 与 XML Schema 有以下区别:
DTD 不使用 XML 编写而 XML Schema 本身就 是 xml 文件,这表示XML 解析器等已有的XML 工具可以用来处理 XML Schema。并且 XML Schema 是设计于DTD之后的,它提供了更多的类型来映射 xml 文件不同的数据类 型。DTD 是文档类型描述(Document Type definition)是定义 XML 文件结构的传统方式。
3. XML CDATA 是什么?
答:CDATA是指字符数据,它有特殊的指令被XML解析器解析。
XML 解析器解析XML 文 档中所有的文本,比如Thisisname ofperson,标签的值也会被解析,因为标签值也可能包含XML标签,比如FirstName。CDATA部分不会被XML 解析器解析。CDATA部分以结束。
4. XSLT是什么?
答:XSLT也是常用的XML 技术,用于将一个XML 文件转换为另一种XML,HTML或者其*他的格式。XSLT为转换XML 文件详细定义了自己的语法,函数和操作符。通常由XSLT引擎 完成转换,XSLT引擎读取XSLT语法编写的XML 样式表或者XSL 文件的指令。XSLT大量使 用递归来执行转换。 一个常见XSLT使用就是将XML文件中的数据作为HTML页面显示。 XSLT 也可以很方便地把一种XML 文件转换为另一种XML 文档。
以上是关于Java白皮书(总结一些题目)的主要内容,如果未能解决你的问题,请参考以下文章