面试题真题解析(2)BJ Subway

北京地铁 Beijing Subway JAVA 开发面试题

简答题

一、请简述接口与抽象类的区别

相同:

1.不能够实例化(即不能new新对象)
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类

不同:

构造器: 抽象类中可以定义构造器。 接口中不能定义构造器

方法: 抽象类可以有抽象方法和具体方法。
接口中方法全部都是抽象方法,方法定义默认为public abstract修饰。

修饰词: 抽象类中的成员可以由 private、默认、 protected、public来修饰。
接口中的成员全都是 public 的。

成员变量: 抽象类中可以定义成员变量。
接口中定义的成员变量实际上都是常量,默认为 public static final修饰

抽象方法: 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。
接口中全是抽象方法。(JDK8后可以有普通方法,但是必须由default修饰)

静态方法: 抽象类中可以包含静态方法。接口中不能有静态方法 。

继承与实现: 一个类只能继承一个抽象类。一个类可以实现多个接口。

二、请简述方法重载(overload)与重写(override)的区别

重载(Overload) 表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写(Override) 表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

三、请按顺序写下判断输出结果

     1  Integer i = new Integer(100);Integer j = new Integer(100);System.out.println(i==j);  2  Integer i2 = new Integer(199);int j2 = 199;System.out.println(i2==j2);  3  Integer i3 = new Integer(100);Integer j3 = 100;System.out.println(i3 == j3);  4  Integer i4 = 100;Integer j4 = 100;System.out.println(i4 == j4);  5  Integer i5 = 299;Integer j5 = 299;System.out.println(i5 == j5); 

正确答案:false、true、false、true、false

Integer、new Integer() 和 int 的比较:

1、两个 new Integer() 变量比较,永远是 false。
原因:因为new生成的是两个对象,其内存地址不同。

2、Integer 变量 和 new Integer() 变量比较,永远为 false。
原因:因为 Integer 变量 指向的是 java 常量池 中的对象,而 new Integer() 的变量指向 堆中 新建的对象,两者在内存中的地址不同。

3、两个 Integer 变量比较,如果两个变量的值在区间 -128 到 127 之间,则比较结果为 true,如果两个变量的值不在此区间,则比较结果为 false 。
原因:java 对于 -128 到 127 之间的数,会直接从缓存中取,不会 new了。

4、int 变量 与 Integer、 new Integer() 比较时,只要两个的值是相等,则为true。
原因:因为包装类 Integer 和 基本数据类型 int 比较时,java会自动拆包装为 int ,然后进行比较,实际上就变为两个 int 变量的比较。

四、一下代码可以正确运行么,如果可以,运行结果是什么,如果不可以,为什么?

    public static final class Person{private String name;private String sex;public Person(String name, String sex) {this.name = name;this.sex = sex;}}public static class Man extends Person{private String name;private String sex;public Man(String name, String sex) {super(name, sex);}}public static void main(String[] args) {Person person = new Man("zhangsan","nan");System.out.println(person.getName());}

正确答案:

能否运行? 不能
1、static final 修饰的类不能被继承:Man 类无法继承 Person 类。
2、上面 Person 类中没有 get 方法。

五、以下代码可能输出的结果是什么?

    private static volatile int count = 0;private static class AddCount extends Thread {@Overridepublic void run(){for (int i = 0; i<10000; i++){count++;}}}public static void main(String[] args) throws InterruptedException {AddCount addCount1 = new AddCount();AddCount addCount2 = new AddCount();addCount1.start();addCount2.start();Thread.sleep(2000);System.out.println(count);}

正确答案:

可能输出的结果:20000
两个线程同步运行,每个线程各加10000次,所以结果20000。

六、以下代码中,spring 应用定义了一个 init 函数,请问这里有必要加锁么,为什么?

/*** 用户信息缓存* @author dali*/
@Service
public class AdminUserStorage{/*** 缓存系统管理员用户信息,key:userId,value:User*/private Map<String,User> adminUserMapCache = new ConcurrentHashMap<>();@PostConstructpublic void init(){synchronized(this){getAdminUserFromDbAndCacheIt();}}......
}

正确答案:不懂

七、请写出以下代码运行后输出内容

public class ParentBean {static {System.out.println("父类静态块");}{System.out.println("父类非静态块");}
}
public class ChildBean extends ParentBean {static {System.out.println("子类静态块");}{System.out.println("子类非静态块");}public ChildBean () {System.out.println("子类构造方法");}public static void main(String[] args) {ChildBean childBean = new ChildBean();}
}

正确答案:

“父类静态块”

“子类静态块”

“父类非静态块”

“子类非静态块”

“子类构造方法”

八、假设这是基于 mysql 数据库的一条建表语句,数据表中已有大量数据

CREATE TABLE `user` (`id` int(11) DEFAULT NULL COMMENT '姓名',`name` varchar(2) DEFAULT NULL COMMENT '性别',`sex` varchar(3) DEFAULT NULL COMMENT '年龄',`id_card_num` varchar(20) DEFAULT NULL COMMENT '身份证号',`password` varchar(20) DEFAULT NULL COMMENT '密码',`nick_name` varchar(20) DEFAULT NULL COMMENT '昵称',KEY `index_id_card` (`id_card_num`,`name`) USING BTREE,KEY `index_age` (`age`) USING BTREE
)   ENGINE=InnoDB DEFAULT CHARSET=utf8

请问,下面的查询语句,会走索引么,为什么?

1.
select * from `user` where `name` = '张三';
2.
select * from `user` where id_card_num = '123123199911019283';
3.
select * from `user` where age > 10;

正确答案:

1、不会,没有创建 name 的索引
2、会,根据最左特性 index_id_card 索引中默认加载了 id_card_num
3、会,已加载 age 索引

九、反转一个单链表

示例:

输入:1->2->3->4->5->NULL

输出:5->4->3->2->1->NULL

答案参考:

class Solution {public ListNode reverseList(ListNode head) {ListNode cur = head;ListNode newHead = null;ListNode prev = null;while (cur!=null) {ListNode curNext = cur.next;if (curNext==null) {newHead = cur;}cur.next = prev;prev = cur;cur = curNext;}return newHead;}
}

十、给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:
输入:s = "abcd" , t = "dcba"
输出:true示例 2:
输入:s = "rat" , t = "car"
输出:false字母异位词就是说,两个字符串 s,t 中所包含的字母与字母出现的次数完全一样,
就像示例 1 中,s 与 t 中出现的字母都只有 abcd ,且这些字母都只出现了 1 次。你可以假设字符串只包含小写字母。

思路:

  • 首先用户输入要比较的字符 s 和 t。

  • 我们设定一个 int 数组,大小为 26,对应英文中的 26 个英文字母。

  • 将 s 和 t 字符串转成 char 数组,之后分别遍历两个数组。

  • 遍历 s 时,每当一个英文字母出现时就在该字母在 int 数组所对应的值 +1。

  • 遍历 t 时,每当一个英文字母出现时就在该字母在 int 数组所对应的值 -1。

  • 这样判断以后,遍历 int 数组判断是否有非 0 数字:

    若有,则证明存在没有被正负抵消的字母,即 s,t 不是字母异位词。

    若没有,则证明所有字母都被正负抵消,即 s,t 是字母异位词。

答案示例:

    public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("s:");String s = scanner.nextLine();System.out.println("t:");String t = scanner.nextLine();int[]arr = new int[26];char[]sChar = s.toCharArray();char[]tChar = t.toCharArray();for (int i=0;i<s.length();i++){arr[sChar[i]-97] += 1;}for (int j=0;j<t.length();j++){arr[tChar[j]-97] -= 1;}for (int k=0;k<arr.length;k++){if (arr[k]!=0){System.out.println("不不不是字母异位词!");return;}}System.out.println("是是是是字母异位词!");}

吐槽:(不愧是北京地铁,真勾八难啊)

JAVA 面试题真题解析(2)BJ Subway相关推荐

  1. JAVA 面试题真题解析(5)DASHEN

    面试题真题解析(5)DASHEN 沈阳大神科技有限公司 简答题 1.面向对象的三个特性 封装.继承和多态 2.什么是函数的重载 函数重载是一个同名函数完成不同的功能,编译系统在编译阶段通过函数参数个数 ...

  2. java蓝桥杯凑算是,第七届蓝桥杯JAVA B组真题解析-凑算式(第三题)

    第七届蓝桥杯JAVA B组真题解析-凑算式(第三题) 凑算式 A+B/C+DEF/GHI =10 (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. ...

  3. 2020第十一届蓝桥杯国赛JAVA B组真题解析(带源码及解析)

    蓝桥杯历年真题及解析. 目录 蓝桥杯历年真题及解析. A: 美丽的 2 题目: 分析: AC代码: B: 扩散 题目: 分析: AC代码: C: 阶乘约数 题目: 分析: AC代码: D: 本质上升序 ...

  4. 2017第八届蓝桥杯省赛JAVA C组真题解析(带源码及解析)

    蓝桥杯历年真题及解析. 目录: 蓝桥杯历年真题及解析. A:外星日历(难度:★) 题目: 分析: 代码: B:兴趣小组(难度:★) 题目: 分析: 代码: C:纸牌三角形(难度:★★★) 题目: 分析 ...

  5. Java大厂面试真题解析大全,附详细答案解析

    01 如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验. 我们常见的高并发场景有:淘宝的双11.春运时的抢票 ...

  6. 2019 最全阿里天猫Java 3面真题,含面试题答案!

    1 阿里天猫Java一面 自我介绍 jvm GC原理,JVM怎么回收内存 ConcurrentHashMap是怎么解决并发问题的? HashMap怎么从链表转换为红黑树?如果存入的是null键,放在桶 ...

  7. 蓝桥杯Java大学C组近三年真题解析(三)——暴力、模拟题

    目录 第十届 求和 题目 题解 代码 矩形切割 题目 题解一 代码 代码 代码 题解二 代码 不同子串 题目 题解 代码 质数 题目 题解 代码 最大降雨量 题目 题解 代码 旋转 题目 题解 代码 ...

  8. 2019头条抖音Java 3面真题,含面试题答案!

    一面: hashmap,怎么扩容,怎么处理数据冲突?怎么高效率的实现数据迁移? Linux的共享内存如何实现,大概说了一下. socket网络编程,说一下TCP的三次握手和四次挥手 同步IO和异步IO ...

  9. 2023字节、腾讯、阿里等6家大厂Java开发面试真题+高频面试题总结

    又是一年求职面试旺季,不管你是新进职场小白还是职场老鸟,这些关于java程序员面试应准备的东西你都应该知道. 面试前需要准备 1. Java 八股文:了解常考的题型和回答思路: 2. 算法:刷100- ...

最新文章

  1. java 模拟时钟_java模拟时钟
  2. linux c:关联变量的双for循环
  3. 单片机c语言数码显示实验报告,单片机动态显示技术实验报告.doc
  4. android.mk ndk编译选项优化,Android NDK 编译脚本分析 之一
  5. 19、mysql中定时器的创建和使用
  6. USACO-Section1.5 Arithmetic Progressions(枚举)
  7. Linux学习之CentOS(五)----网卡的配置
  8. 石油-美元金融体系的形成
  9. JavaScript语言精粹笔记
  10. 解决重启VCSA 6.0提示:503 Service Unavailable错误
  11. Prototype使用$w()函数
  12. 数据库多表链接查询的方式
  13. Python3学习笔记十三
  14. 【RegNet】《Designing Network Design Spaces》
  15. 手游联运系统隐藏福利大揭秘
  16. 用友NCC产品API使用指南
  17. Linux安装数据库
  18. SpringBoot(一)——入门
  19. nodejs 判断是文件夹还是文件
  20. moby_如何使用Moby Dick探索以主题为主题的开源项目的深度

热门文章

  1. 根据银行卡卡号判断银行
  2. css修改element组件中el-date-picker中的placeholder样式失效
  3. 数字电子钟——期末数电大作业Multisim版
  4. Java实现 LeetCode 330 按要求补齐数组
  5. 线段树进阶之清风拂面
  6. 2013.12.26:4G
  7. Laravel 联合查询 count计数去重
  8. Advanced Installer16.9运行环境配置
  9. T100 开发笔记-210928
  10. 复选框的全选反选实现(即购物车的复选框实现)