• 1.JDK 和JRE的区别是什么?
      JDK用于开发,是给开发人员用的,JRE 用于运行java程序,和JVM是给普通用户使用的。如果只是运行Java程序,可以只安装JRE,无序安装JDK。也就是说:使用JDK开发完成的java程序,交给JRE去运行。JDK包含了JRE,JDK 和 JRE 中都包含 JVM。也可以说JDK是JRE+Java的开发工具。JRE包含了JVM+Java语言的核心类库。
    • 2.”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?
      “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。Static表示静态的意思,可用于修饰成员变量和成员函数,被静态修饰的成员函数只能访问静态成员,不可以访问非静态成员。静态是随着类的加载而加载的,因此可以直接用类进行访问。 重写是子类中的方法和子类继承的父类中的方法一样(函数名,参数,参数类型,反回值类型),但是子类中的访问权限要不低于父类中的访问权限。重写的前提是必须要继承,private修饰不支持继承,因此被私有的方法不可以被重写。静态方法形式上可以被重写,即子类中可以重写父类中静态的方法。但是实际上从内存的角度上静态方法不可以被重写。
    • 3.创建线程有儿种不同的方式?
      • 第一种,通过继承Thread类创建线程类
      • 第二种,通过实现Runnable接口创建线程类
      • 第三种,通过Callable和Future接口创建线程
    • 4.什么是死锁(deadlock)?
      所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。死锁产生的4个必要条件:互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被 链中下一个进程所请求。排除方法:1、撤消陷于死锁的全部进程;2、逐个撤消陷于死锁的进程,直到死锁不存在;3、从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失;4、从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态。
    • 5.Java中的HashMap的工作原理是什么?
      Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。 这个问题都老掉牙了。有以下三方面:1.hashMap去掉了HashTable 的contains方法,但是加上了containsValue()和containsKey()方法。2.hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。3.hashMap允许空键值,而hashTable不允许
    • 6.简述一下GC的流程
      • 流程图游戏公司笔试题 - 图1
    • 7.ConcurrentModificationException异常出现的原因及其解决办法
      • ArrayList的remove方法, 删除元素, 会改变index的下标
      • 解决方法: 使用iterator的remove方法删除元素
    • 8.异常处理的时候,finally 代码块的重要性是什么?
      • 无论是否抛出异常,finally代码块总是会被执行。就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。最后要说的是,finally代码块主要用来释放资源,比如:I/O缓冲区,数据库连接。
    • 9.Stackoverflow 和outofmemory出现的原因
      • 内存溢出
        • 内存溢出原因
          一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行”+”就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。
        • 内存溢出解决方法
          1、 内存溢出的原因是什么, 内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出. 如果出现这种现象可行代码排查:一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串. 如public static int i = 0; //public static String str;二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)
      • 栈溢出
        • 栈溢出原因
          一)、是否有递归调用二)、是否有大量循环或死循环三)、全局变量是否过多四)、 数组、List、map数据是否过大五)使用DDMS工具进行查找大概出现栈溢出的位置
        • 栈溢出解决方法
    • 10.数据库连接池是什么意思?有什么好处?
      1. 基本原理:在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。如外部使用者可通过getConnection方法获取数据库连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时的连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。2.作用 ①资源重用 (连接复用) 由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,增进了系统环境的平稳性(减少内存碎片以级数据库临时进程、线程的数量) ②更快的系统响应速度 数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池内备用。此时连接池的初始化操作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。 ③新的资源分配手段 对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接技术。 ④统一的连接管理,避免数据库连接泄露 在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用的连接,从而避免了常规数据库连接操作中可能出现的资源泄露
    • 11.简述下排序算法,寻路算法,字符串匹配算法(屏蔽字检测)
      • 排序算法
      • 寻路算法
      • 字符串匹配算法
        • 方式1_遍历
          • 当然就是遍历,我们假设模式有m个字符,待匹配串有n个字符,那么我们一个个遍历n,匹配上了模式则记录下来,最后处理。。这个时间复杂度就是O(m*n)
        • 方式2_hash表
          • 我们这里如果仅仅是要找到需要的字符串,是很容易的,但是如果要找出最近的才需要删除呢?
          • 比如:模式love 字符串是:Ilolloveyou我们希望和谐的是Ilol**you 不是Illo**you这种,所以需要实现最短的
          • 我们这里需要借助一个哈希表来记录当前模式字符最新的位置在哪里,后面删除的时候用上就好了
          • 所以,match_hashtable这里记录的是模式对应最近的字符位置
    • 12.简述下设计模式,单例模式,观察者模式,工厂模式等
      • 单例模式
        • 最简单的例子就是线程池,我们希望线程池是复用的而不是每次去请求都会去创建,数据库连接池
      • 观察者模式
        观察者模式属于行为型模式,也叫发布订阅模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决一个对象状态改变给其他对象通知的问题,缺点是如果被观察者对象有很多的直接和间接观察者的话通知很耗时, 如果存在循环依赖的话可能导致系统崩溃,另外观察者无法知道目标对象具体是怎么发生变化的。ServletContextListener 能够监听 ServletContext 对象的生命周期,实际上就是监听 Web 应用。当 Servlet 容器启动 Web 应用时调用 contextInitialized 方法,终止时调用 contextDestroyed 方法。
      • 工厂模式
        • 简单工厂
          简单工厂模式指由一个工厂对象来创建实例,客户端不需要关注创建逻辑,只需提供传入工厂的参数。适用于工厂类负责创建对象较少的情况,缺点是如果要增加新产品,就需要修改工厂类的判断逻辑,违背开闭原则,且产品多的话会使工厂类比较复杂。Calendar 抽象类的 getInstance 方法,调用 createCalendar 方法根据不同的地区参数创建不同的日历对象。Spring 中的 BeanFactory 使用简单工厂模式,根据传入一个唯一的标识来获得 Bean 对象。
        • 工厂方法
          工厂方法模式指定义一个创建对象的接口,让接口的实现类决定创建哪种对象,让类的实例化推迟到子类中进行。客户端只需关心对应工厂而无需关心创建细节,主要解决了产品扩展的问题,在简单工厂模式中如果产品种类变多,工厂的职责会越来越多,不便于维护。Collection 接口这个抽象工厂中定义了一个抽象的 iterator 工厂方法,返回一个 Iterator 类的抽象产品。该方法通过 ArrayList 、HashMap 等具体工厂实现,返回 Itr、KeyIterator 等具体产品。Spring 的 FactoryBean 接口的 getObject 方法也是工厂方法。
        • 抽象工厂
          抽象工厂模式指提供一个创建一系列相关或相互依赖对象的接口,无需指定它们的具体类。客户端不依赖于产品类实例如何被创建和实现的细节,主要用于系统的产品有多于一个的产品族,而系统只消费其中某一个产品族产品的情况。抽象工厂模式的缺点是不方便扩展产品族,并且增加了系统的抽象性和理解难度。java.sql.Connection 接口就是一个抽象工厂,其中包括很多抽象产品如 Statement、Blob、Savepoint 等。
    • 13.定义 int i=0x1;j=OxF0; 计算“i<<2&j>>2” “i<<2|j>>2” 的结果
      • 位运算
    • 14.jstat -gcutil 命令使用
      • 命令格式 jstat -gcutil pid interval(ms)
      • 命令举例 jstat -gcutil 16361 1000
      • 示意图游戏公司笔试题 - 图2
      • 参数解析
        S0: 新生代中Survivor space 0区已使用空间的百分比S1: 新生代中Survivor space 1区已使用空间的百分比E: 新生代已使用空间的百分比O: 老年代已使用空间的百分比P: 永久带已使用空间的百分比YGC: 从应用程序启动到当前,发生Yang GC 的次数YGCT: 从应用程序启动到当前,Yang GC所用的时间【单位秒】FGC: 从应用程序启动到当前,发生Full GC的次数FGCT: 从应用程序启动到当前,Full GC所用的时间GCT: 从应用程序启动到当前,用于垃圾回收的总时间【单位秒】
    • 15.卡顿现象(已排除客户端问题),应该从哪些方面入手排查,性能调优的方法