字符串的不可变性
String str = new String(“abc”),“abc”在内存中是怎么分配的?
abc 在堆中
引用str在字符串常量池中
什么是字符串常量池?
JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池
工作原理
当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。
Arrays.asList()
Arrays.asList(),其将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是Arrays类的内部类:
finally之坑
public static int func (){
try{
return 1;
}catch (Exception e){
return 2;
}finally{
return 3;
}
}
结果:
3
解释:
finally一定会执行的,有两种情况:
1.finally中有return语句,当try执行到return时会执行finally中的代码,其中有return 就直接返回了,如题,返回值为3.
2.finally中不含return语句,那么当执行到return时,它会被保存等待finally执行完毕后返回,这个时候无论finally内部如何改变这个值,都不会影响返回结果!如:
int i = 0 ;
int test(){
try {
return i;
} catch (Exception e) {
return -1;
}finally{
i++;
}
}
//output: 0
守护线程
将一个线程标记成daemon线程,意味着当主线程结束,并且没有其它正在运行的非daemon线程时,该daemon线程也会自动结束。
swing 顶层容器
顶层容器包含JApplet、JDialog、JFrame和JWindow及其子类。
java.util.ArrayList里面的坑
List<Integer> NumberList = new ArrayList<Integer>();
NumberList.add(2);
NumberList.add(4);
NumberList.add(1);
NumberList.add(3);
NumberList.add(5);
for(int i =0;i<NumberList.size();++i){
int v = NumberList.get(i);
if(v%2==0){
NumberList.remove(v);
}
}
System.out.println(NumberList);
结果:
会出现越界情况
解释:
这题主要考察两点:
1.ArrayList删除元素后,剩余元素会依次向前移动,因此下标一直在变,size()也会减小;
2.remove()方法调用的是remove(int index),而不是remove(Object o),因此删除的是index索引处的元素;
该题具体流程:1.i=0,v=2,remove(2)删除掉了元素1,因此NumberList剩余元素为【2,4,3,5】;
2.i=1,v=4,remove(4),此时线性表中只有四个元素,不可能删除索引为4的元素,因此会报数组下标越界异常。
Servlet中request域对象
request.getAttribute()方法返回request范围内存在的对象
request.getParameter()方法是获取http提交过来的数据。
getAttribute是返回对象,getParameter返回字符串。
Java强制类型转换
boolean类型不能和任何类型进行转换,会报出类型异常错误。
构造函数的修饰符
构造方法不能被子类继承,所以用final修饰没有意义。构造方法用于创建一个新的对象,不能作为类的静态方法,所以用static修饰没有意义。此外,Java语言不支持native或synchronized的构造方法。
逻辑或的短路逻辑
int i=0;
int j=0;
if((++i>0)||(++j>0))
{
//打印出i和j的值。
}
结果
i=1;j=0
解析:
考察的是短路逻辑的用法,即:当第一个逻辑表达式可以确定结果时,将不再进行剩余表达式的运算。
Java之枚举
enum AccountType
{
SAVING, FIXED, CURRENT;
private AccountType()
{
System.out.println(“It is a account type”);
}
}
class EnumOne
{
public static void main(String[]args)
{
System.out.println(AccountType.FIXED);
}
}
结果描述:
Compiles fine and output is prints”It is a account type”thrice followed by”FIXED”
解释:
枚举类有三个实例,故调用三次构造方法,打印三次It is a account type
replaceAll()之坑
public static void main (String[] args) {
String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class";
System.out.println(classFile);
}
结果
///MyClass.class
解释:
由于replaceAll方法的第一个参数是一个正则表达式,而".“在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成”/"。如果想替换的只是".",那么久要写成"\.".