小米二面(2023-6-26)

小米

一、HashMap和HashTable的区别

相同点:
①hashmap和hashtable都实现了map、clone、serializable三个接口
不同点
②jdk7的时候都是数组+链表,但是jdk8时hashmap加入了红黑树
③hashtable是不允许键或值为null的,hashmap的键值都可以为null
④hashmap的初始容量为16而hashtable的初始容量为11,负载因子都为0.75
⑤hashtable的synchronized的线程同步而hashmap是线程不安全的

二、HashMap的最大扩容量为多少

hashmap的最大容量为2^31-1,由于int是4个字节也就是32位,所以能移动31位置,但是第一个位置为符号位,所以只能移动31位置。

三、静态内部类和非静态内部类区别

①静态内部类不持有外部类的引用,在普通内部类中可以直接访问外部类的属性、方法、即时是private类型的也行,这是因为普通内部类持有外部类的引用,可以自由访问。而静态内部类只能访问外部类的静态方法和静态属性(private也可以访问)
②静态内部类不依赖于外部类,普通内部类和外部内部类相互依赖、同生共死,一起声明一起被回收。而静态内部类是可以独立存在的,即时外部消亡了静态内部类也是可以存在的。
③普通内部类不能声明static的方法和变量,静态内部类的方法和变量可以是静态的也可以是非静态的,没有限制。
④静态内部类不是外部内部类被加载的时候加载的,而是需要调用内部类的时候才会加载的。如果外部内需要调用内部类则必须要在外部类中创建一个内部类的对象作为一个属性。

四、Thread的run方法和start方法的区别

①start()方法来启动线程,真正实现了多线程的运行。这是无需等待run方法执行完毕就可以继续执行代码,当run方法执行完毕后就线程终止。
②run()方法当作普通方法调用,在主线程中执行,只有执行start()方法才算真正的线程执行。

五、强引用、软引用、弱引用、虚引用

①new关键字的实例化对象就是强引用,即时JVM报OOM内存泄露也不会清理强引用的对象。
②软引用在内存空间足够的时候就不会清除,在JVM虚拟机内存空间不够了就会垃圾清除掉软引用对象。
③弱引用不管JVM内存空间是否足够,只要被垃圾回收器扫描到就会被清除掉。
④虚引用。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用主要用来跟踪对象被垃圾回收的活动。

六、三种最熟悉的设计模式

①简单工厂设计模式。工厂类通过接收的参数的不同来返回不同的对象实例,不修改代码的话,是无法扩展的。

②一般工厂设计模式。一抽象工厂类派生出多个具体工厂类;每个具体工厂类只能创建一个具体产品类的实例。即定义一个创建对象的接口(即抽象工厂类),让其子类(具体工厂类)决定实例化哪一个类(具体产品类)。“一对一”的关系。

③抽象工厂设计模式。多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系。

④代理设计模式。代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用,代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性。

⑤单例设计模式。实例化全局唯一的实例对象。

七、多线程的场景题

//下面代码输出的结果为?
//①The meaning of 42--->t1先执行完后执行t2
//②Not the meaing of answer--->t2先于t1执行完毕
//③The meaning of 0--->t1执行的时候"JVM指令重排导致answer和answerReady的顺序交换"(t1-answerReady-t2)
class Example extends Thread{
	static int answer = 0;
	static boolean answerReady = false;

	public static void mian(String arg[]){
		Thread t1 = new Thread(()->{
			answer = 42;
			answerReady = true;
		});

		Thread t2 = new Thread(()->{
			if(answerReady){
				System.out.println("The meaning of "+answer);
			}else{
				System.out.println("Not the meaning of answer");
			}
		});

		t1.start();
		t2.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
	}
}

八、最长不含重复字符的子字符串(算法题)

public int lengthOfLongestSubstring (String s) {
        //滑动窗口,出现重复则left和right一起右移动,否则只移动right
        int left = 0;//左指针
        int right = 0;//右指针,每次先右移动
        int maxLength = 0;//计数最大无重复字符串长度
        int currentLength = 0;
		char ch = s.charAt(right);

        HashSet<Character> set = new HashSet<>();//set去重复,记录字符元素出现的次数    

        while(right<s.length()){
            ch = s.charAt(right);//拿到最右边的字符
            if(set.contains(ch)){//如果包含该字符
                while(s.charAt(left) != ch){//当头尾字符不同到时候
                    set.remove(new Character(s.charAt(left++)));
                }
                left++;
                currentLength = right-left+1;
            }else{//如果不包含该字符
                currentLength++;
                set.add(ch);
            }
            maxLength = Math.max(currentLength,maxLength);//得到无重复子串最大长度
            right++;
        }

        return maxLength;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值