笔记|Java实习面试题

【笔记|Java实习面试题】目前作为一名大三的在校生,过着百无聊赖日复一日的日子,于是萌生的实习的想法,想在暑假找一份工作锻炼着。于是开始海投简历,由于基数大,终于有面试官开始联系我。
我们是在电话里聊的,聊了大概40多分钟,到现在也过去不短了,凭着回忆,我把能想起来的面试题总结一下:
1.你常见的Java关键字有哪些?
这题答案想必在各位心中
2.final关键字的用法
修饰类表示不可继承,修饰方法不能被重写,修饰变量表示常量
3.如果final修饰的成员属性(对象),那么该对象的值能不能变呢?
能。final修饰的成员属性为某一对象时,则表示对该对象的引用无法改变,不能在指向其他对象,但该对象的内部属性还是可以改变的
4.定义一个 int a =1,double b = 1.0,判断a==b?
true。因为不同基本数据类型的自动转型,最后都会转成double
5.int 和 Integer的区别?
基本数据类型和包装类。int定义的是变量,Integer则为对象
6.八大基本数据类型和对应的内存占用
byte / boolean 1
short / char 2
int / float 4
long / double 8
7. == 和 equals的区别?
==比较的是地址,equals比较的是值,但是因为equals是Object类的方法,在Object中本质上用的还是= =(这里为了格式,不得不中间加了个空格),所以对于没有重写equals方法的类,他们之间的比较用= = 和equals比较的都是地址,但是对于重写的equals方法的类需要根据equals方法的逻辑进行判断了。
8.那常见的重写了equals方法的类有哪些?
String,Integer(8大包装类)
9.你用过的Java集合及其区别
List:有序集合,允许存放重复的元素,
常用实现类有ArrayList,LinkedList
Set:无序集合,不允许存放重复的元素,
常用实现类有HashSet,TreeSet
Map:K-V键值对存储,一个key对应一个value
常用实现类有HashMap,TreeMap
10.ArrayList和LinkedList的区别?
ArrayList底层是一个Object数组,LinkedList则就是双向链表;正因如此,ArrayList查询快增删慢,LinkedList增删快查询慢
11.ArrayList可以装下多少个元素?
ArrayList在new的时候可以通过构造函数传值,括号里是几就是几,默认值为10,以1.5倍的大小进行扩容,即10+int(10/2)=15;15+int(15/2)=22;。。。
12.什么是扩容?
就是当ArrayList元素存满了之后,从新new一个新的ArrayList对象,新对象的大小即底层数组的长度是原来的1.5倍,把原ArrayList的值遍历到新的ArrayList中,让原来的引用指向新的ArrayList对象。
13.那被替换的那个ArrayList对象去哪了呢?立即释放吗?
被替换的ArrayList对象失去了引用,会被Java的垃圾收集器标记成垃圾,不会被立即释放,等待垃圾回收时,才会被释放。
14.说一下IO流干什么用的
IO流是Java用来读写外部设备的一种机制,常见的有字符流和字节流,常用于和Socket编程结合,实现网络上的通信。
15.了解过线程吗,线程的几大状态
新建,就绪,运行,阻塞(延时阻塞),死亡
16.创建线程的几种方式
1.继承Thread类,
2.实现Runnable接口,
3.实现Callable接口,
4.从线程池里取(后悔插这一嘴了,毕竟线程池也不会)
17.你用过的几种线程池
当时回答的是项目里没有用到这个,只是了解一点。。(一下子就尬住了)
18.什么是死锁?如何避免?
死锁是多线程条件下线程资源争夺的问题,有t1,t2两个线程,A,B两个资源类t1线程执行方法中先锁A再锁B,t2则是先锁B再锁A,则会存在一种情况:t1锁住了A准备去锁B,t2锁住了B准备去锁A,此时AB都被上锁了,t1拿不到B,t2拿不到A,t1,t2两个线程互不相让,程序跑到这里卡死。死锁不是异常,是线程资源争夺的一种情况,是程序正常运行的结果,但会大大影响程序的效率。
如何避免:避免一个线程同时获得2个对象的锁。
19.String类常见的方法
substring()-----字符串截取
charAt()-----获取对应位置的字符
replace()-----字符串替换
toUpperCase()/toLowerCase()-----大小写替换
trim()-----去除两边的空格
20.String,StringBuilder,StringBuffer的区别
String是一个不可变字符串对象,底层是由char数组实现,每次对String的改变(包括+,substring() )都会生成一个新的String对象,并且原来的引用指向新的String对象。
StringBuilder和StringBuffer是可变字符串对象,通过append()等方法改变字符串时不会创建新的对象,而是在原来是对象上进行改变。
StringBuilder无法保证线程安全,StringBuffer的方法中加了synchronize关键字,因此可以实现多线程条件下的安全性。
21.String hello = new String(“hello”);创建了几个对象(“hello未被使用过”)?
2个。在方法区的字符串常量池中创建"hello"对象,在堆区中创建String对象并指向常量池中的hello对象.
22.如何对字符串进行反转?
1.暴力手段:倒序遍历字符串,新建一个char数组,遍历并插入。
2.通过StringBuilder:new StringBuilder(str).reverse().toString();
23.统计某一字符串各个字符出现的次数:
1.暴力遍历:新建一个数组,遍历字符串,每次出现都+1;
2.通过HashMap(当时没说出来):直接看代码

String str = "abcdabff"; Map map = new HashMap<>(); for (int i = 0; i < str.length(); i++) { if (map.containsKey(str.charAt(i))){ map.put(str.charAt(i),map.get(str.charAt(i))+1); }else { map.put(str.charAt(i),1); } } System.out.println(map);

24.Spring框架的作用
实现一个Spring容器,我们所创建的对象都封装到Spring容器中成为一个个的JavaBean,我们每次都从容器中获取对象,把对象交给Spring统一管理,这样也可以实现一定程度上的解耦
25.你这个项目中哪里用到了AOP
在事务方法的调用前后,日志处理的记载上(项目的话是一个SpringBoot单机的问卷调查系统,功能也比较简单,所幸面试官也看出了所以问的基础比较多)
26.你经常用的注解及其作用
@Service @Controller @RequestMapping @ResponseBody
@GetMapping @Mapper @ MapperScan @Test @Configuration
@bean @Component @ComponentScan @Autowired @PathVariable等
27.你项目开发中遇到过的异常
乍一下有点蒙,当时回答的不是很好?
ClassNotFound?。。。。。这也没有标准答案
28.RestFul风格的几种请求方式?
GET,PUT,POST,DELETE
当时回答的不好,只是回答了表面,对四种方式的了解不太深入
29.说一下Mybatis中 # 和 $ ’的区别?
#代表的是占位符,起到预编译的作用,使用Preparement替换,可以防止Sql注入的风险;$则只是字符串的替换,如果在字符串结尾使用恒成立的表达式诸如 " or 4 > 2"则存在Sql注入的风险。
29.Mysql的多表查询
现有学生表,分数表,课程,完成查询平均分数大于60的学生的信息(大概是这样的要求)
快过去3个星期了,当时回答的确实不太理想(问的问题肯定远远不止这些,这只是能记起来的),不过面试官也没有故意刁难,也拿到了offer,是一家小公司,虽然最后因为其他杂事没去成,写出来算是记录一下吧。

    推荐阅读