一. java语言基础:
1、合法标识符:
答:以字母,“_”,“$“符号开头,可以包含字母,“_”,“$“和数字;
2、八大类型以及各种整数类型的取值范围:
答:byte 8位(-2^7~2^7-1)、short 16位(-2^15~2^15-1)、int 32位(-2^31~2^31-1)、long 64位(-2^63~2^63-1)
float 32位单精度浮点数、double 64位双精度浮点数、boolean、char单一的 16 位 Unicode 字符等;
-
在把容量大的类型转换为容量小的类型时必须使用强制类型转换;
-
转换过程中可能导致溢出或损失精度;
-
char型变量中能不能存贮一个中文汉字?为什么?
-
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的。
3、&(位运算符)与&&(关系运算符)区别:
答:&比较两个二进制是否为1;而&&比较两边是否为true,只有两边都为true时才为true;
4、if与else语句:
答:一个判断中可以有多个if、if else语句,但是只能有一个else;else可以没有;
5、switch里面数据类型包括:
答:整型(byte,short,int),char,枚举(重点);
int i = 5; switch(i){ case 0: System.out.println("0");break; case 1: System.out.println("1");break; case 2: System.out.println("2");break; default: System.out.println("default");break; }
default可以放在中间吗?多个case可以共用一条语句;
可以,但是一般default放在最后
6、while循环:
答:当while内条件为true时,循环继续执行,当while内条件为false时才退出循环;若一开始就为false时程序只执行do范围内语句一次;
Given:
10.int x=0;
11.int y=10;
12. do {
l3. y--;
14. ++x;
15. } while (x < 5);
16. System.out.print(x + "," + y);
Answer:5,5
7、break与continue区别:
答:continue是退出本次循环,继续下一次循环,而break是退出整个循环体;
8、关于可变长参数:
答:a、参数列表中最多只能出现一次可变长参数;
b、如果参数中包含多个参数的话,那么可变长参数只能出现在最后面的位置;
c、可变长参数可实现方法的重载(重点);
public class Demo {
public static int sum(int n, int... nums) {
for (int i = 0; i < nums.length; i++) {
n = n + nums[i];
}
return n;
}
public static void main(String[] args) {
int s1 = sum(1, 2);
int s2 = sum(1, 2, 3);
int s3 = sum(1, 2, 3, 4);
int s4 = sum(1, 2, 3, 4, 5);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
System.out.println(s4);
}
}
9、静态常量初始化两种方式:
答:静态常量必须显示的初始化;a、通过构造器进行初始化,b、只能用静态代码块初始化;
public class Test{
public static String a="";
public Test(){a="1";//后初始化};
static{a="2";//先初始化}
}
10、Java初始化顺序(静态变量、静态初始化块、实例变量、实例初始化块、构造方法);A继承B,A是子类,B是父类(基类);成员变量不继承;
父类静态成员--子类静态成员;
父类静态初始化块--子类静态初始化块;
父类实例成员和实例初始化块--父类构造方法;
子类实例成员和实例初始化块--子类构造方法;
11、不同访问修饰符对类成员的访问范围:
当前类 | 同一package | 子孙类 | 其他package | |
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
friendly(不写时默认) | √ | √ | × | × |
private | √ | × | × | × |
12、String 和stringBuffer的区别:
答:String创建的字符串不能修改;而stringBuffer定义的字符串可以修改;
new String("hello")创建了几个对象?
答案:创建了两个对象
String temp="hello";//在常量池中
String str=new String(temp);//在堆上
13、final, finally, finalize的区别。
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。String类即是final类;
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
14、int 和 Integer 有什么区别?
答:a、Integer是对象类型,而int是基本数据类型;
b、类可以是null,但基本数据类型不能为空;
17、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;Math.round(-11.6)返回(long)-12;
正数:小数点后第一位>=5,+1;负数,小数点后第一位>5;+1;
18、怎样将浮点数(float)相加 ? Float 好像没有办法?
答:请注意 float 和 Float 是不同的,前者是 Java 基本类型之一, 而后者却是class。您应该将源代码改为:
float One;
float Two;
float Hard = One + Two;
或
Float One = new Float(1.0);
Float Two = new Float(2.0);
Float Hard = new Float(One.floatvalue() + Two.floatvalue());
19、如何将字串String转换成整数int?
答:1)int i = Integer.parseInt(“String”);
20、如何将整数 int 转换成字串 String?
有三种方法:
1)String s = String.valueOf(i);
2)String s = Integer.toString(i);
3)String s = "" + i;
21、什么是J2EE,J2SE,J2ME?
答:J2SE主要用于开发界面平台软件的;
J2ME主要用于开发嵌入式程序,如:手机软件程序等;
J2EE主要是基于WEB服务器的开发B/S结构企业级程序;
22、Java中的属性和字段有什么区别?
答:Java中的属性,通常可以理解为get和set方法。而字段通常叫做“类中定义的成员变量”。
23、值类型与引用类型变量的区别?
答:值类型变量是基本数据类型的一个变量;而引用类型变量是一个对象类型引用的变量;
24、隐式参数与显示参数?
答:显示参数是明显列在方法声明中,而隐式参数没有出现在方法声明中;
隐式参数,如,关键字this;
this代表对象的引用(谁调用就代表谁);
super代表当前子类对父类的引用。
25、什么是实例域、实例、实例变量?
答:实例域就是指定义类时的最外层的那两个大括号那个范围。
实例就是你new出来的类的对象引用。
实例变量:private(访问修饰符) int(数据类型) a(实例变量)=0;
实例变量不能标识为 abstract、synchronized 、native 或 strictfp。不能用JAVA关键字
26、什么是标识符、修饰符、访问修饰符?
(1)标识符:“_”、“$”
(2)修饰符:final、synchronized、abstract、
(3)访问修饰符:public、protected、default、private
27、一个类在new后,其静态代码块会执行吗?
答:一个类在new的时候即执行其静态代码块;执行完毕之后不会再执行;
二.类/接口/枚举/封装类:
1、一个类为什么要做成抽象类?接口?
答:a、减少代码的重复;b、解耦合;
接口与抽象类:一个类实现接口必须实现接口所有方法,而继承抽象类只需实现抽象方法,非抽象方法可不实现,这样就减少了这个类不需要的代码的重写性;
2、匿名内部类是否可以继承其他类,是否可以实现接口?
答:匿名内部类必须扩展一个基类或实现一个接口,但是不能有显式的继承和实现子句;
3、静态内部类与普通内部类区别:
答:a、静态内部类实例化的时候不必先实例化外围类,可以直接实例化内部类,而对于非静态内部类必须先实例化其外部类,才能再实例化本身;
b、静态内部类没有了指向外部类的引用;
c、在任何非静态内部类中,都不能有静态数据、方法、静态类等;
4、为什么需要使用内部类呢?其主要原因有以下三点:
答:a、内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据。
b、内部类可以对同一个包中的其他类隐藏起来。
c、当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷。
三.面向对象编程:
1、请问java的三大特性是什么?它们各有什么特点?
答:a、封装:将一个类的成员属性设置成私有的,再提供get和set方法供外部访问;即这样的封装类不会被外界所改变,只能给外界使用;
b、继承:一个子类继承一个父类,继承父类中所有方法,不能继承父类中成员变量;子类本身又可以有另外的方法,即子类具有可扩展性特性;
c、多态(重写):两种,一种是重写,重写就是子类重写父类中方法(方法名、返回类型(子类的返回类型必须相同或是父类返回类型的子类)和参数类型必须一致);
另外一种是重载,重载是在一个类中的方法名相同,参数类型必须不同(或它们有不同的参数个数),返回类型可以相同,可以不同;
2、类与对象之间的关系:
答:a、关联:一个类受另外一个类影响,一个Driver类里面只跟一个Car类变量,即在Driver类中的方法内传一个car属性对象,强耦合关系;
b、依赖:一种使用关系,很弱的一种耦合。driver开几种类型的车,即重载,drive(plane);drive(car);这个时候drive与plane的关系即为依赖关系;
c、聚合:聚合关联 Aggregation:弱'拥有'关系,A对象可以包含B对象,但B不是A的一部分;
d、组合:是一种强的‘拥有’关系,体现严格的部分和整体的关系,
e、泛化:继承
f、实现:接口
3、类与对象间的结构关系:
纵向关系:泛化(包括类继承、接口继承、实现)
横向关系:关联(包括一般关联、聚合、组合)
4.面向对象理解
什么是OOP?什么是类?请对比类和对象实例之间的关系。OOP是面向对象编程缩写。指的是用对象的观点来组织与构建系统,对象是类的实例化。对象通常作为计算机模拟思维,表示真实世界的抽象。类是静态的,对象是动态的,类负责产生对象,可以将类当成生产对象的工厂。
6、UML图分几类?
答:常用的UML图:
A、用例图:帮助开发团队以一种可视化的方式了解系统功能需求,比如:角色与用例之间关系;
B、 类图:三部分描述,上面是类名、中间是属性、下面是方法;完整的类图,应该具有指向其父类关系,并且具有与之关联的部分;
C、 时序图:显示不同对象之间的调用关系;
D、状态图:某个类所处的不同状态或者是该类的状态转换信息:
E、 活动图:表示在处理某个活动时,两个或者更多类对象之间的过程控制流。
F、 组件图:显示系统中软件与其他软件的依赖关系:
G、部署图表示该软件系统如何部署到硬件环境中。
静态(系统结构):用例图、类图、对象图、组件图、部署图
动态(系统行为):时序图、协作图、状态图、活动图
五.I/O流:
1、在Java语言中,如何列出PC机文件系统中的所有驱动器名?
答:在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能;
2、IO流的三种分类方式:
a.按流的方向分为:输入流和输出流;
b.按流的数据单位不同分为:字节流和字符流;
c.按流的功能不同分为:节点流和过滤流;
3、IO流的四大抽象类:
(1)字节流:
InputStream(读数据):所有字节输入流的祖先;(从外部读取文件数据到程序中)
OutputStream(写数据):所有字节输出流的祖先;(将程序中的数据输出到外部文件中)
(2)字符流:Reader:所有读取字符输入流的祖先;
Writer :所有写入字符串的祖先;
4、文件读写的基本类:
(1)、读取字节流:
文件àFileInputStreamàBufferedInputStreamàDataInputStreamà数据;
(2)、写入字节流:
数据à DataOutputStream à BufferedOutputStream à FileOutputStream à文件;
(3)、该程序接受键盘输入(从键盘读取数据):
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str=in.readLine();
(4)、写入字符流:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("C:\\test.txt")));
out.write(“dagdagd”);
六.集合和泛型
1、说出ArrayList,Vector, LinkedList的存储性能和特性
答:ArrayList,Vector, 查询数据快,插入慢,Vector是线程安全的,LinkedList查询数据慢,插入速度快;list有序可重复;set不可重复且无序;
2、Collection 和 Collections的区别
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
3、HashMap和Hashtable的区别。
答:HashMap是线程不安全的,允许有null的key值或者value值;
Hashtable是线程安全的,不允许空key和value值;
4、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。而==是判断两个值是否相等的;
5、遍历一个list
for(int i=0;i <list.size();i++)
for(Object o:list)
Iterator it=list.iterator()
for(;it.hasNext();)
Set set = new HashSet(list);
for(Iterator it=set.iterator();it.hasNext();)
{ Object o = it.next; System.out.println(o.toString());}
List<Object> list
for(Object foo : list){
String className = foo.getClass().getClassName;
System.out.println(foo);
}
6、 String传值,
public class Test {
public static void change(String str){
str="123";
}
public static void main(String args[]) {
String abc = new String("abc");
Test.change(abc);
System.out.println(abc); }
输出:abc
7.为什么重写equals()时也要重写hashCode()?两者什么关系
因为这两个函数都可以重写;完全可以hashcode相等的对象而equals确返回false;重写hashCode是为了集合类存储这些对象的时候有个比较规则;比如Map不允许重复元素,就是通过hashCode来检测的;但是hashcode的实现,一般要满足几个特征,比如:自反性,传递性什么的。
8.java泛型中的E,T,K,V,U,S
E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的java类型
9.认识理解Java中的native方法
Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。在java中native是关键字。它一般在本地声明,异地用C和C++来实现。它的声明有几点要注意:
1)native与访问控制符前后的关系不受限制。
2)必须在返回类型之前。
3)它一般为非抽象类方法。
4)native方法在异地实现,象抽象方法一样,所以没有方法体,以分号结束。如下列5种声明:
native public void f(); 正确。
private native void f(); 正确。
protected int native f(); 错误,返回类型位置不对,返回类型必须在native之后。
public abstract native void f(); native必然不是abstract的。
native int f(){} 错误,因为存在方法体{}
public static native f(); 正确。static与native方法位置随意。
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。 int是数据类型;
Integer i = 1;int ii = 1; i==ii为true还是为false?
public static void main(String[] args) {
13 int i = 128;
14 Integer i2 = 128;
15 Integer i3 = new Integer(128);
16 //Integer会自动拆箱为int,所以为true
17 System.out.println(i == i2);
18 System.out.println(i == i3);
19 System.out.println("**************");
20 Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
21 Integer i6 = 127;
22 System.out.println(i5 == i6);//true
23 /*Integer i5 = 128;
24 Integer i6 = 128;
25 System.out.println(i5 == i6);//false
26 */ Integer ii5 = new Integer(127);
27 System.out.println(i5 == ii5); //false
28 Integer i7 = new Integer(128);
29 Integer i8 = new Integer(123);
30 System.out.println(i7 == i8); //false
31 }
首先,17行和18行输出结果都为true,因为Integer和int比都会自动拆箱(jdk1.5以上)。
22行的结果为true,而25行则为false,很多人都不动为什么。其实java在编译Integer i5 = 127的时候,被翻译成-> Integer i5 = Integer.valueOf(127);所以关键就是看valueOf()函数了。只要看看valueOf()函数的源码就会明白了。JDK源码的valueOf函数式这样的:
看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以22行的结果为true,而25行为false。
11. IP协议属于()层。
-
应用层
-
数据链路层
-
网络互联层
-
传输层
答案:C
IP协议是网络层协议
A,应用层协议有http ftp smtp pop3 等
B,数据链路层协议有PPP ARP RARP等
D,传输层协议有TCP UDP
12.十六进制数30转换成二进制数是()
-
110000
-
100000
-
111000
-
101010
答案:A
十六进制转换为二进制快捷的方法是将每一个十六进制字符转换成4个二进制字符,不足4个的前面补零
3转换为二进制是0011,0转换为二进制是0000
合起来就是00110000
将前面两个无用的0去掉就是110000
13.List<? extends T>和List<? super T>之间有什么区别?
List<? extends T>要求List中的泛型对象只可以是T或者T的子类对象
List<? super T>要求List中的泛型对象只可以是T或者T的父类对象
14.对于IP地址为200.5.6.3,属于()类
-
A
-
B
-
C
-
D
答案:C
第一字节范围1到127属于A类IP
第一字节范围128到191属于B类IP
第一字节范围192到223属于C类IP
15. 某系统中有11台打印机,N个进程共享打印机资源,每个进程要求3台,当N的取值不超过()时系统不会发生死锁。
-
4
-
5
-
6
-
7
答案:B
不发生死锁的条件是至少能保证一个进程能获得三台打印机资源。
最坏的情况是1个进程获取三台打印机资源,另外N-1个进程获取到两台打印机,等待获取第三台。
3+(N-1)*2=11
N=5
16. 排序
1、java类自带排序:
组成int数组,再调用Arrays.sort(int[] a)实现升序;降序可从尾部开始输出;
2、方法二:重复for循环比较两值大小存入ArrayList中;
17. JAVA序列化
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序 列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
18.数据结构有哪些
集合、线性结构、树形结构、图状结构