Java面试题总结-Day1
Java面试题总结-Day1
Table of Contents
0.1 心情
今天第一次电话面试,被面试官问了几个很简单的问题,原理答得很迷糊,算法部分还算说得明白,但是语言表达能力稍有欠缺,而且对面试题不熟悉,让我在这次面试中发挥不好吧.有点担忧,又有点激动,毕竟是第一次电话面试, 发现了自己很多的不足吧,基础也很薄弱.因为这些缘故,现在每天要坚持写面试题的汇总,并对各种面试题进行深入了解和分析,坚持吧,加油!写给以后的自己.
1 今天自己面试遇到的题目
1.1 请说说cookie与session的区别
- cookie采用的是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。
- session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上(这是默认情况,可以用memcache把这种数据放到内存里面)当客户端向服务器发出请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没有
session_id
,是否过期。如果有这样的session_id
的话,服务器端会根据cookie里的session_id
把服务器的session检索出来。如果没有这样的session_id
的话,服务器端会重新建立一个。PHPSESSID是一串加了密的字符串,它的生成按照一定的规则来执行。同一客户端启动二次session_start
的话,session_id
是不一样的。 - 区别:Cookie保存在客户端浏览器中,而Session保存在服务器上。Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
1.2 ArrayList扩容的原理
- ArrayList底层使用数组实现,默认初始容量为10,当超出后,会自动扩容为原来的1.5倍,实现原理是通过
新容量=旧容量+旧容量>>1
,然后将旧数组的内容拷贝(Arrays.copyOf为浅拷贝)到新数组中,代码如下
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); }
2 网上学习的面试题
2.1 Java中值传递和引用传递
- Java只有按值传递,没有按引用传递
- 对象传递(数组,类,接口)是传递的是地址值
- 原始数据类型(整型,浮点型,字符型,布尔型)传递是值
2.2 ==与equals
==
的作用是判断两个对象的地址是不是相等,即,判断两个对象是不是同一个对象.- 基本数据类型
==
比较的是值 - 引用数据类型
==
比较的是内存地址
- 基本数据类型
- equals():它的作用也是判断两个对象是否相等.但它一般有两种使用情况
- 类没有覆盖equals方法.使用equals()比较两个对象时,等价于
==
来比较两个对象的内存地址. - 类覆盖了equals方法.一般我们都覆盖equals方法来对两个对象的内容的相等性进行比较.
- 类没有覆盖equals方法.使用equals()比较两个对象时,等价于
- 例子
public class test1 { public static void main(String[] args) { // a为一个引用 String a = new String("ab"); // b为另一个引用,对象的内容一样 String b = new String("ab"); // 放在常量池中 String aa = "ab"; // 在常量池中查找 String bb = "ab"; if (aa == bb) { //true System.out.println("aa=bb"); } if (a == b) { // false,非同一对象 System.out.println("a=b"); } if (a.equals(b)) { System.out.println("aEQb"); } if (42 == 42.0) { // true System.out.println("true") } } }
2.3 hashCode()与equals()
2.3.1 hashCode介绍
- hashCode的作用是获取哈希码,也称为散列码
- 它实际上是返回一个int整数.这个哈希码的作用是确定对象在哈希表中的索引位置.
- 散列表存储的是键值对(key-value),它的特点是:能根据"键"快速的检索出对应的"值".这其中就利用到了散列码,能快速的找到所需要的对象.
2.3.2 为什么要有hashCode(以HashSet为例)
- 当你把对象加入HashSet时,HashSet会先计算对象的hashCode对象的值来判断对象加入的位置,同事也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现.
- 如果发现由相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同.
- 如果两者相同,HashSet不会让其加入操作成功.
- 如果不相同,就会重新散列到其他位置.
2.3.3 hashCode()与equals()的相关规定
- 如果两个对象相等,则hashcode一定也是相同的.
- 两个对象相等,对两个对象分别调用equals方法都返回true.
- 两个对象有相同的hashcode值,它们也不一定是相等的
- 因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
- hashCode()的默认行为是对堆上的对象产生独特值.如果没有重写hashCode方法,则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
2.3.4 相关规定的详解
- 下面是约定的内容,摘自Object规范[JavaSE6]:
- 在应用程序的执行期间,只要对象的equals方法所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法都必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
- 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。
- 如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中的任意一个对象的hashCode方法,则不一定要产生不同的整数结果。但是程序员应该知道,给不相同的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。
- 如果覆盖equals没有覆盖hashCode,将会违反上面的第2条:相等的对象必须具有相等的散列码(hashCode)。Object类里面的默认eqals方法是比较内存地址是否相等,默认的hashCode方法则是根据内存地址产生一个整数,所以Object类本身当然是符合上面规则的。当你覆盖了equals后,内存地址不同的对象可能会相等,而如果这时你没有覆盖hashCode方法的话,hashCode还是根据内存地址来生成,就会出现相等的对象具有不同的散列码的情况。