Java面试题总结-Day1

Java面试题总结-Day1

Java面试题总结-Day1

0.1 心情

今天第一次电话面试,被面试官问了几个很简单的问题,原理答得很迷糊,算法部分还算说得明白,但是语言表达能力稍有欠缺,而且对面试题不熟悉,让我在这次面试中发挥不好吧.有点担忧,又有点激动,毕竟是第一次电话面试, 发现了自己很多的不足吧,基础也很薄弱.因为这些缘故,现在每天要坚持写面试题的汇总,并对各种面试题进行深入了解和分析,坚持吧,加油!写给以后的自己.

1 今天自己面试遇到的题目

1.1 请说说cookie与session的区别

  1. cookie采用的是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。
  2. session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上(这是默认情况,可以用memcache把这种数据放到内存里面)当客户端向服务器发出请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没有 session_id ,是否过期。如果有这样的 session_id 的话,服务器端会根据cookie里的 session_id 把服务器的session检索出来。如果没有这样的 session_id 的话,服务器端会重新建立一个。PHPSESSID是一串加了密的字符串,它的生成按照一定的规则来执行。同一客户端启动二次 session_start 的话, session_id 是不一样的。
  3. 区别:Cookie保存在客户端浏览器中,而Session保存在服务器上。Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

1.2 ArrayList扩容的原理

  1. 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中值传递和引用传递

  1. Java只有按值传递,没有按引用传递
  2. 对象传递(数组,类,接口)是传递的是地址值
  3. 原始数据类型(整型,浮点型,字符型,布尔型)传递是值

2.2 ==与equals

  1. == 的作用是判断两个对象的地址是不是相等,即,判断两个对象是不是同一个对象.
    • 基本数据类型 == 比较的是值
    • 引用数据类型 == 比较的是内存地址
  2. equals():它的作用也是判断两个对象是否相等.但它一般有两种使用情况
    • 类没有覆盖equals方法.使用equals()比较两个对象时,等价于 == 来比较两个对象的内存地址.
    • 类覆盖了equals方法.一般我们都覆盖equals方法来对两个对象的内容的相等性进行比较.
  3. 例子
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介绍

  1. hashCode的作用是获取哈希码,也称为散列码
  2. 它实际上是返回一个int整数.这个哈希码的作用是确定对象在哈希表中的索引位置.
  3. 散列表存储的是键值对(key-value),它的特点是:能根据"键"快速的检索出对应的"值".这其中就利用到了散列码,能快速的找到所需要的对象.

2.3.2 为什么要有hashCode(以HashSet为例)

  1. 当你把对象加入HashSet时,HashSet会先计算对象的hashCode对象的值来判断对象加入的位置,同事也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现.
  2. 如果发现由相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同.
    • 如果两者相同,HashSet不会让其加入操作成功.
    • 如果不相同,就会重新散列到其他位置.

2.3.3 hashCode()与equals()的相关规定

  1. 如果两个对象相等,则hashcode一定也是相同的.
  2. 两个对象相等,对两个对象分别调用equals方法都返回true.
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
  5. 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还是根据内存地址来生成,就会出现相等的对象具有不同的散列码的情况。

Date: 2018-10-30 23:11

Author: devinkin

Created: 2018-10-31 三 23:01

Validate

posted @ 2018-10-30 23:19  EmacsDevinkin  阅读(191)  评论(0编辑  收藏  举报