记录第一次面试不会问题

1.自定义的对象重写equals()之外,为什么还有重写hashcode()方法?

hashcode()和equals()是协同完成对象是否相等的判断的

第一步先计算hashcode()值是否相等?不相等的话直接返回false,不再进行equals()比较!

如果不重写自定义对象hashcode()方法,默认使用Object类的hashcode()方法,即比较的是对象在内存中的空间地址是否相等,这样比较久出现了问题,所以重写equals()的同时要重写hashcode()方法.

1>.为了提高效率
采取重写hashcode方法,先进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用。

我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。

2>.Set无法去重问题
自定义类作为HashSet的泛型,自定义类重写equals()不重写hashCode()

Person p1 = new Person("eee", 100);
Person p2 = new Person("eee", 100);

System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode());

//结果
p1.equals(p2) : true; p1(2133927002) p2(1836019240)


问题:上面的程序中,重写了Person的equals(),但是,HashSet中仍然有重复元素:p1 和 p2。为什么会出现这种情况呢?

回答:因为虽然p1 和 p2的内容相等,但是它们的hashCode()不等(默认使用Object类的hashcode()方法,即比较的是对象在内存中的空间地址是否相等),不再进行equals()比较,从而导致存储HashSet存储重复元素。

2.Springboot配置文件的加载顺序 :(项目外部配置文件>项目内部配置文件)

shell脚本指定参数(命令行参数)

>bootstrap.*>application.* 然后(application>yml>yaml)(config目录下的优先级高于目录外的)

3.java的stream()处理完成后收集collect()时能开线程发邮件吗?怎么合并在一起?

要实现collect(Collector接口的实现类),通过重写Collector接口的实现类来实现!

4.文件上传的前端enctype是什么

5.jdk11新特性

1.字符串API增强

repeat(n)
按照给定的次数重复串联字符串的内容:

 String str = "HELLO";
 // 空字符
 String empty = str.repeat(0);
 // HELLO
 String repeatOne = str.repeat(1);
 // HELLOHELLO
 String repeatTwo = str.repeat(2);

2.ZGC垃圾回收器
据说这是JDK11最为瞩目的特性,没有之一,是最重磅的升级,那么ZGC的优势在哪里呢?

GC暂停时间不会超过10毫秒
既能处理几百兆的小堆,也能处理几个T的大堆
和G1相比,应用吞吐能力不会下降超过15%
为未来的GC功能和利用colord指针以及Load barriers优化奠定了基础
ZGC是一个并发、基于region、压缩型的垃圾收集器,只有root扫描阶段会STW(strop the world,停止所有线程),因此ZGC的停顿时间不会随着堆的增长和存活对象的增长而变长。用法:-XX:UnlockExperimentalVMOptions -XX:+UseZGC虽然功能如此强大,但很遗憾的是,在Windows系统的JDK中并没有提供ZGC,所以也就没有办法测试了

6.jdk8新特性  JDK8的新特性_jdk8新特性有哪些_梦@回忆的博客-CSDN博客

1. lambda表达式
2. 函数式接口
3. 方法引用。
4. Stream流
5. 日期时间类

第三次:4399

1.Spring 注解中 @Configuration 和 @Component 的区别:

        @Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Component 注解并没有通过 cglib 来代理@Bean 方法的调用,每实例化一次就会创建一个新的对象。

2.nginx如何解决跨域问题

 3.linux查询文件夹下某个文件位置

# find在指定目录下查找

1>
find path -name fileName
find /  -name nginx
find /  -name nginx* #模糊匹配 
find /  -mmin -20  #最近20分钟内修改的文件
find /  -mtime -1  #最近1天内修改的文件

2>

#linux系统每天至少自动扫描一次文件,将结果保存到数据库,locate查的是数据库(/var/lib/mlocate/mlocate.db)记录。locate查询比find要快,但最新文件如果在数据库中没有记录,是需要手动更新(updatedb)

locate nginx

4.select ..... for update加的是行锁还是表锁

如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。

如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。

5.控制项目某个接口只被某个公司(ip)访问

给方法加aop/或者直接获取ip/请求头/验证信息等进行判断,获取请求的ip等信息然后校验,控制是否可以访问;

6.Lambda表达式forEach如何跳出循环

方法一:可以使用anyMatch()方法,anyMatch()里接收一个返回值为boolean类型的表达式,只要返回true就会终止循环,这样可以将业务逻辑写在返回判断结果前。
代码如下:

public class ForEachDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        list.stream().anyMatch(i -> {
          if (i == 3) return true;
            System.out.println(i);
          return false;
        });
    }
}

方法二:可以使用filter()方法,思路是一样的,其中findAny表示只要找到满足的条件时停止。
代码如下:

public class ForEachDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);

        list.stream().filter(i -> {
          if (i == 3) return true;
            System.out.println(i);
          return false;
        }).findAny();
    }
}

方法三:抛自己抛异常

7.mysql索引的底层数据结构为什么用b+树而不用b树?

1、B+树可以更好地利用磁盘预读特性
在数据库中,数据通常都存储在磁盘上。而磁盘的读写速度比内存慢很多,因此需要尽量减少磁盘I/O操作。B+树相对于B树来说,其内部节点只存储键值信息,而不存储数据信息,这样可以让每个节点能够存储更多的键值信息,从而使得查询同一层次的所有数据时,能够一次性读入更多的数据块,减少磁盘I/O操作。

2、B+树能够更快地进行范围查询
由于B+树的非叶子节点只存储键值信息,而不存储指向数据的指针,因此当进行范围查询时,只需要遍历B+树的叶子节点即可,而不需要遍历非叶子节点,大大加快了查询速度。

3、B+树更适合于数据库索引
B+树的叶子节点形成了一个有序链表,使得范围查询更加容易实现。而B树则不支持高效的范围查询,并且为了保持平衡需要维护指向所有数据的指针,导致其空间利用率较低。
 



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值