学习过程中遇到的面试题汇总(缓慢更新中)

一、Java基础部分:

1.异常处理部分:

(1)try_catch_finally:

public class ExceptionDemo {
	public static void main(String[] args) {
		
		int i =  test();
		System.out.println(i);
	}
	public static int test() {
		int x = 1;
		try {
			int a =1/0;
			return x++;
		} catch (Exception e) {
		
			return x++;
			}finally {
				
				return x++;
		
			}
		
	}

}
		

输出 i 为2;

二、Java高级基础部分:

1、JAVAAPI

String str2 = new String("str")+new String("01");
str2.intern();
String str1 = "str01";
System.out.println(str2==str1);//true
解释:在JDK 1.7下,当执行str2.intern();时,因为常量池中没有“str01”这个字符串,所以会在常量池中
生成一个对堆中的“str01”的引用(注意这里是引用 ,就是这个区别于JDK 1.6的地方。在JDK1.6下是生成
原字符串的拷贝),而在进行String str1 = “str01”;字面量赋值的时候,常量池中已经存在一个引用,所以
直接返回了该引用,因此str1和str2都指向堆中的同一个字符串,返回true。
String str2 = new String("str")+new String("01");
String str1 = "str01";
str2.intern();
System.out.println(str2==str1);//false
解释:将中间两行调换位置以后,因为在进行字面量赋值(String str1 = “str01″)的时候,常量池中不存在,
所以str1指向的常量池中的位置,而str2指向的是堆中的对象,再进行intern方法时,对str1和str2已经没有影
响了,所以返回false。
public static void main(String[] args) {
String s1 = new String("he") + new String("llo");
String s2 = new String("h") + new String("ello");
String s3 = s1.intern();
String s4 = s2.intern();
System.out.println(s1==s3);//true
System.out.println(s2==s4);//false
System.out.println(s3==s4);//true
}

②【面试题】
下列程序运行的结果: 【面试题】 (String 不可变)

public class StringTest { 
        String str = new String("good"); 
        char[] ch = { 't', 'e', 's', 't' }; 
        public void change(String str, char ch[]) { 
            str = "test ok";  
            ch[0] = 'b'; 
    } 
    public static void main(String[] args) { 
        StringTest ex = new StringTest(); 
        ex.change(ex.str, ex.ch); 
        System.out.print(ex.str + " and ");// 
        System.out.println(ex.ch); 
    } 
}

在这里插入图片描述
在这里插入图片描述

③面试题:
对比String、StringBuffer、StringBuilder:

	String(JDK1.0):不可变字符序列 
    StringBuffer(JDK1.0):可变字符序列、效率低、线程安全 
   StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全 

④【面试题】程序输出:

String str = null; 
		StringBuffer sb1 = new StringBuffer(); 
		sb1.append(str); 
		System.out.println(sb1.length());//4
		System.out.println(sb1);// null
		StringBuffer sb2 = new StringBuffer(str); 
		System.out.println(sb2);//NullPointerException

⑤【面试题】程序输出:
在这里插入图片描述
在这里插入图片描述

2、集合

①、ArrayList:
1.【 面试题】

@Test
public void testListRemove() {
    List list = new ArrayList();
    list.add(1);
    list.add(2);
    list.add(3);
    updateList(list);
    System.out.println(list);//
}
private static void updateList(List list) {
    list.remove(2);
}

输出: 1 2
remove方法中传入的是索引

2.面试题:
请问ArrayList/LinkedList/Vector的异同? 谈谈你的理解? ArrayList底层是什么?扩容机制?Vector和ArrayList的最大区别
①ArrayList和LinkedList的异同
二者都线程不安全,相对线程安全的Vector,执行效率高。
此外, ArrayList是实现了基于动态数组的数据结构, LinkedList基于链表的数据结构。对于随机访问get和set, ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add(特指插入)和remove, LinkedList比较占优势,因为ArrayList要移动数据。
恶ArrayList和Vector的区别
Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack

3、面试题:Set集合中 判断元素是否重复的机制是什么?
在set中判断元素是否重复 使用equals()方法
如果两个对象的equals方法返回true 则他们的hashcode值应该也是相等的
换句话来说 :如果两个对象的equals返回是true 但是hashcode不一致 则也会认为元素不重复

面试题:

HashSet set = new HashSet();
Person p1 = new Person(1001,"AA");
Person p2 = new Person(1002,"BB");
set.add(p1);
set.add(p2);
p1.name = "CC";//1
set.remove(p1);//2
System.out.println(set);
set.add(new Person(1001,"CC"));//3
System.out.println(set);
set.add(new Person(1001,"AA"));//4
System.out.println(set);

其中Person类中重写了hashCode()和equal()方法
分析:
第一处:当修对象p1的name属性时,修改了对应堆内具体对象的值。而集合中存放的是对象的引用,所以在当修改后集合中的值也会被修改。但是在HashSet底层是HashMap实现的,而p1对象所占的hash桶任然是未修改前的对象的hash值所对应的桶。
第二处:此时p1对象已经被修改了,remove()是根据修改后的对象的hash值,找对应的位置,因此此时删除时对应的位置没有值,所以此时没有认出任何数据。
第三处:当加入new Person(“CC”,“1001”)对象时,虽然此对象与p1对象值完全相等,但是添加时,添加到了该对象所对应的hash桶,而此时的位置与p1不是同一个位置,因为p1是根据修改之前的hash值放入对应的has桶内的,因此他们不冲突。
第四处:当加入new Person(“AA”,1001)时,该值与未修改前的p1值完全相等,所以对应的hash桶也是同一个位置,添加时找到对应的桶位置后,发现已经有一个对象,然后用equals方法比较值,此时值不相等,因此不产生冲突,依然可以加入到HashSet中。
(此处说明引用:https://blog.csdn.net/qq_37964379/article/details/99689389)

③面试题(hashmap)
谈谈你对HashMap中put/get方法的认识?如果了解再谈谈HashMap的扩容机制?默认大小是多少?什么是负载因子(或填充比)? 什么是吞吐临界值(或阈值、 threshold)?
面试题:负载因子值的大小,对HashMap有什么影响?
负载因子的大小决定了HashMap的数据密度。
负载因子越大密度越大,发生碰撞的几率越高,数组中的链表越容易长,造成查询或插入时的比较次数增多,性能会下降。
负载因子越小,就越容易触发扩容,数据密度也越小,意味着发生碰撞的几率越小,数组中的链表也就越短,查询和插入时比较的次数也越小,性能会更高。但是会浪费一定的内容空间。而且经常扩容也会影响性能,建议初始化预设大一点的空间。
按照其他语言的参考及研究经验,会考虑将负载因子设置为0.7~0.75,此时平均检索长度接近于常数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值