【JAVA面试题整理】JAVA基础(二)
JAVA常见的API一、Math.Round(11.4)和Math.Round(-11.4)的结果分别是多少?输出结果分别为11和-11,round(四舍五入的原理是对原数字加上0.5之后再取整);二、switch能否作用在byte、long、String类型上?java5之前,switch后面跟的参数只能是byte、short、char、int,但是从java5开始,引入了e...
JAVA常见的API
一、Math.Round(11.4)和Math.Round(-11.4)的结果分别是多少?

输出结果分别为11和-11,round(四舍五入的原理是对原数字加上0.5之后再取整);
二、switch能否作用在byte、long、String类型上?
java5之前,switch后面跟的参数只能是byte、short、char、int,但是从java5开始,引入了enum(枚举)类型;
从java7开始,引入了String类型,但是long类型不能使用
三、String、StringBuffer、StringBuilder的区别
-
String由final修饰,字符本身不能被改变;

对于上图描述的,看似是对str进行改变,其实str只是一个引用对象,在第二行操作后,让str从"abc"的引用指向了一个新的字符串"bcd"的引用,这两个对象并没有任何变化;
-
StringBuffer和StringBuilder都可以对对象进行直接地修改;
-
StringBuilder是java5中引入的,它和StringBuffer的用法完全相同,只是它没有被synchronzied修饰,因此在单线程环境下,会比StringBuffer效率要高;
StringBuffer部分源码
@Override
public synchronized StringBuffer append(char[] str, int offset, int len) {
toStringCache = null;
super.append(str, offset, len);
return this;
}
@Override
public synchronized StringBuffer append(boolean b) {
toStringCache = null;
super.append(b);
return this;
}
@Override
public synchronized StringBuffer append(char c) {
toStringCache = null;
super.append(c);
return this;
}
@Override
public synchronized StringBuffer append(int i) {
toStringCache = null;
super.append(i);
return this;
}
StringBuilder部分源码
@Override
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
四、请说出下面程序的输出

String对象的intern()方法会得到字符串对象在常量池中对应版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则把该字符串添加到常量池中,然后返回常量池中字符串的引用。
五、JAVA中日期和时间
1、如何获取年月日、小时分钟秒?

JAVA的数据类型
一、java基本数据类型都有哪些,各占几个字节?
|
四类 |
八种 |
字节数 |
数据表示范围 |
|
整型 |
byte |
1 |
-128~127 |
|
short |
2 |
-32768~32767 |
|
|
int |
4 |
-2147483648~2147483647 |
|
|
long |
8 |
-2^63~2^63-1 |
|
|
浮点型 |
float |
4 |
-3.403E38~3.403E38 |
|
double |
8 |
-1.798E308~1.798E308 |
|
|
字符型 |
char |
2 |
表示一个字符,如('a','A','0','我')等 |
|
布尔型 |
boolean |
1 |
true、false |
二、String是基本类型吗?
String是引用类型,底层用char数组实现的。
private final char value[];
三、short s1=1;s1=s1+1;有错吗?short s1=1;s1+=1;有错吗?
前者不正确,后者正确。
由于s1是short类型,1是int,所以运算结果也是int,要把结果赋值给short就要做类型转换;而s1+=1中,相当于(short)(s1+1),隐含着类型转换。
四、int和Integer有什么区别?
int的包装类型就是Integer,从java5开始,引入了自动装箱和拆箱,是二者可以自动转换。
基本类型:byte、short、int、long、float、double、char、boolean
包装类型:Byte、Short、Integer、Long、Float、Double、Character、Boolean
五、下面题目输出结果是什么?

答:
true
false
由于Integer是一个对象,==在对象中对比的是对象的引用。Integer在给对象赋int值时,调用的是valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的一个内部类
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
由源码可以看出,Integer赋值时,如果值在-128~127之前,是直接使用静态代码块生成的int值,不会额外new一个Integer对象,而超过了这个范围,就要重新new一个对象,所以f1==f2的结果是true,f3==f4的结果是false。
六、String类常用方法

七、数据类型之间的转换
字符串向基本数据类型转换:使用parseXXX(String)方法或者valueOf(String)方法即可返回对应基本类型;
基本数据类型向字符串转换:一种是使用+“”(连接一个空字符传),或者使用String.valueOf()方法返回字符串;
JAVA中的IO
一、JAVA中有几种类型的流?

二、字节流如何转换为字符流
字节输入流转字符输入流通过InputStreamReader实现,该类构造函数可以传入InputStream对象。
字节输出流转字符输出流通过OutputStreamWriter实现,该类构造函数可以传入OutputStream对象。
三、字节流和字符流的区别
字节流读取的时候,读到一个字节就返回一个字节;字符流使用了字节流读到一个或多个字节(中文对应的字节数是2个,在UTF-8码表中是3个字节)时,先去差指定的编码表,将查到的字符返回。字节流可以处理所有类型数据,如:图片、MP3、AVI视频文件等,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。字节流主要是操作byte类型数据,以byte数组为准,主要操作类就是OutputStream、InputStream。
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的unicodde字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点儿,如果是关系到中文(文本)的,用字符流好点儿。在程序中一个字符等于两个字节,java提供了Reader、Writer两个专门操作字符流的类。
四、什么是java的序列化,如何实现java序列化?
序列化就是一种用来处理对象六的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输与网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:间需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,实现该接口只是为了标注对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputSteam(对象流)对象,接着,使用对象流对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存期状态),要恢复的话则用输入流。
更多推荐



所有评论(0)