Java面试题

自动装箱问题

@Test
public void test3() {
	Integer i = new Integer(1);
	Integer j = new Integer(1);
	System.out.println(i == j);//false
	
	//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
	//保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在
	//-128~127范围内时,可以直接使用数组中的元素,不用再去new了。目的:提高效率
	
	Integer m = 1;
	Integer n = 1;
	System.out.println(m == n);//true

	Integer x = 128;//相当于new了一个Integer对象
	Integer y = 128;//相当于new了一个Integer对象
	System.out.println(x == y);//false
}

关于代码块的执行顺序

class Father {
    static {
        System.out.println("11111111111");
    }

    {
        System.out.println("33333333333");
    }
    // 执行顺序和构造器和非静态代码块的位置无关
    public Father() {
        System.out.println("44444444444");

    }
}

public class Son extends Father {
    static {
        System.out.println("22222222222");
    }

    {
        System.out.println("55555555555");
    }

    public Son() {
        System.out.println("66666666666");
    }


    public static void main(String[] args) {
        System.out.println("我是第一行code..."); //注意:这句话并不会首先执行
        System.out.println("************************");
        new Son();
        System.out.println("************************");
        new Son();
        System.out.println("************************");
        new Father(); //注意:此时Father的 静态代码块也不会再执行
    }
}
# 执行结果
11111111111
22222222222
我是第一行code...
************************
33333333333
44444444444
55555555555
66666666666
************************
33333333333
44444444444
55555555555
66666666666
************************
33333333333
44444444444

关于异常中的finally

public class ReturnExceptionDemo {
	static void methodA() {
		try {
			System.out.println("进入方法A");
			throw new RuntimeException("制造异常");
		} finally {
			System.out.println("用A方法的finally");
		}
	}

	static void methodB() {
		try {
			System.out.println("进入方法B");
			return;
		} finally {
			System.out.println("调用B方法的finally");
		}
	}

	public static void main(String[] args) {
		try {
			methodA();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}		
		methodB();
	}
}

输出结果:
进入方法A
用A方法的finally
制造异常
进入方法B
调用B方法的finally

获得两个字符串的最大子串

 /**
     * 假设:两个字符串中只有一个最大相同子串
     * @param str1
     * @param str2
     * @return
     */
 public String getMaxSameString(String str1, String str2) {
     if (str1 != null && str2 != null) {
         String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
         String minStr = (str1.length() < str2.length()) ? str1 : str2;
         int length = minStr.length();

         for (int i = 0; i < length; i++) {
             for (int x = 0, y = length - i; y <= length; x++, y++) {
                 String subStr = minStr.substring(x, y);
                 if (maxStr.contains(subStr)) {
                     return subStr;
                 }

             }
         }

     }
 	return null;
 }

注意remove方法

/**
 * note:
 * 1.区分List中remove(int index)和remove(Object obj)
 * 2.IDEA中好像会判断是不是index.. List类型时,无法自动装箱;只会将2认定为index
 * 3.下面的变量声明的是List,所以会判断。但是如果是Collection类型的话,只有remove(object)函数,所以会自动装箱。
 */
public class ListExer {
    @Test
    public void testListRemove() {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        updateList(list);
        System.out.println(list);
    }

    /**
     * 第一个是删除 index为2的数值
     * 第二个是删除 对象2
     * 补充:这里之所以可以删除,是因为包装类中重写了equals方法;调用remove(Object object)方法时,底层会遍历一遍;
     * 然后用equals方法判断这个数据是否存在。
     * @param list
     */
    private void updateList(List list) {
        list.remove(2);
        list.remove(new Integer(2));
    }
}

关于集合的考点

/**
 * @author shkstart
 * @create 2019 上午 9:36
 *
 * note:Person中已经重写equals和hashcode方法
 * 1.remove失败:remove的原理,和add一样,同样会计算hashcode
 *  remove移除失败原因:修改对象后的hashcode变了。
 * 2.添加成功,new Person(1001,"CC")通过hashcode计算的坐标值上没有数据
 * 3.添加成功,坐标已有数据,但是hash值不同
 */
public class CollectionTest {
    @Test
    public void test3(){
        HashSet set = new HashSet();
        Person p1 = new Person(1001,"AA");
        Person p2 = new Person(1002,"BB");

        set.add(p1);
        set.add(p2);
        System.out.println(set);

        p1.name = "CC";
        set.remove(p1);
        System.out.println(set);
        set.add(new Person(1001,"CC"));
        System.out.println(set);
        set.add(new Person(1001,"AA"));
        System.out.println(set);
    }
}

输出结果:
[Person{id=1002, name='BB'}, Person{id=1001, name='AA'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]

你可能感兴趣的:(大数据面试)