您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168939

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

2021年3月29日 阿里菜鸟实习面试(一面)(含部分总结)


title: 2021年3月29号 阿里菜鸟实习面试(一面)
tags: 面经


2021年3月29日 阿里菜鸟实习面试(一面)

自我介绍
你为什么想做Java开发工程师
你还做了除了飞机大战,还做了什么Java的项目吗?
你讲讲你付出精力最多的项目,讲讲你做了什么工作以及达到什么效果呢?
讲讲你的飞机大战的多线程编程是如何编写的
你是如何实现多线程的呢?还有没其他的方式去实现线程安全呢?
介绍一下synchronized关键字以及底层实现原理
synchronized修饰这个类的时候,会对类中的实例对象加锁吗?
wait和sleep的区别
常见的集合类的你有看过吗?(list,set,map)
你能把这三者的整体框架说一下吗?就是这三者都有哪些实现子类啥的(见下文)
map的数据结构说一下(其实只要说一说hashmap即可)
看过hashmap的实现源码?它对null值支持吗?它是如何实现对null支持的呢?(见下文)
讲一下Java虚拟机的结构(方法区,堆区,虚拟机栈,本地方法栈,程序计数器)
定义 String s = new String(“abc”); 那它在虚拟机中整个的内存分配的过程是怎么样的?(见下文)
你用Java哪个版本呢?你了解lambda 表达式吗?(见下文)
项目的源码你有看过吗?比如说你看到过spring源码吗?
你平常会看哪些开源项目的源码呢?
你有没有做过一个这样一个Java项目呢?
你平常有去关注现在主流的一些框架吗?
反问环节

1.1你能把这三者的整体框架说一下吗?就是这三者都有哪些实现子类啥的

1.2 看过hashmap的实现源码?它对null值支持吗?它是如何实现对null实现的呢?(见下文)

肯定是支持null值。

实现过程:

HashMap在put的时候会调用hash()方法来计算key的hashcode值,可以从hash算法当中,当key==null时的返回值为0;因此key为null时,hash算法返回值为0,不会调用key的hashcode方法

这里可以补充一个知识点:***hashtable,对于null值会抛出异常,而对于null键,则会调用null.hashCode(),而导致空指针异常*,**concurrenthashmap则对于null键值对,直接抛出空异常****。

ConcurrentHashMap不能put null 是因为 无法分辨是key没找到的null,还是有key值为null,这在多线程里面是模糊不清的,所以压根就不让put null。

1.3 定义 String s = new String(“abc”); 那它在虚拟机中整个的内存分配的过程是怎么样的?(见下文)

参考博客:通过Java虚拟机理解String s=new String(“abc”);创建几个对象

当我们写上 String s = new String(“abc”); 时,这里会创建两个对象,一个存放在堆中的 new String(“abc”);**一个是存放在运行时常量池的中的“abc” **。之所以会有存放在常量池总的abc是因为字符串类型的元素会经常创建,如果又新创建一个对象,如String s2=“abc”,这里会直接指向常量池中的”abc“字符串,避免重复创建,提高效率。

1.4 你用Java哪个版本呢?你了解lambda 表达式吗?(见下文)

Lambda表达式:

Lambda 表达式在 Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->”,该操作符被称 为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:

  • 左侧:指定了 Lambda 表达式需要的所有参数
  • 右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能。

Lambda 表达式,也可称为闭包,它是推动Java 8 发布的最重要新特性。

Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。

使用 Lambda 表达式可以使代码变的更加简洁紧凑

使用 Lambda 表达式需要注意以下两点

  • Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。
  • Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

使用Lambda表达式的要求:

也许你已经想到了,能够使用Lambda的依据是必须有相应的 函数接口

函数接口,是指内部只有一个抽象方法的接口。这一点跟Java是强类型语言吻合,也就是说你并不能在代码的任何地方任性的写Lambda表达式。实际上Lambda的类型就是对应函数接口的类型。Lambda表达式另一个依据是类型推断机制,在上下文信息足够的情况下,编译器可以推断出参数表的类型,而不需要显式指名。

参考博客:面试官 | 什么是 Lambda?该如何使用?

在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进