Java 编程基础之易错题2

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kaikai_sk/article/details/84895304

字符串的不可变性

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类型不能和任何类型进行转换,会报出类型异常错误。

扫描二维码关注公众号,回复: 5405924 查看本文章

构造函数的修饰符

构造方法不能被子类继承,所以用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方法的第一个参数是一个正则表达式,而".“在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成”/"。如果想替换的只是".",那么久要写成"\.".

Statement接口及其子接口

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kaikai_sk/article/details/84895304