美文网首页
那些经常被遗忘的面试题,你知道几个?

那些经常被遗忘的面试题,你知道几个?

作者: 游戏原画设计 | 来源:发表于2019-02-22 14:18 被阅读64次

    静态类和静态方法

    如果一个类被声明为静态的,那么只有一种情况,即静态内部类。

    静态内部类实际上与普通类(即类名必须与文件名相同的顶级类)相同,但静态内部类是在特定类的内部定义的。因为它们是类,所以如果要使用它们,就必须对它们进行实例化。从概念上讲,它不同于静态变量和静态方法。不要被“静态”这个词混淆(不要认为任何静态的东西都可以不通过实例化直接使用,静态的内部类是不同的),只有静态的内部类,但是没有静态类的概念(顶级类)。

    例如。

    public class Singleton{

     private Singleton{

    }

     private static class SingletonHolder{

         private final static Singleton instance; 

            } public Singleton getInstance{ 

                return SingletonHolder.instance;

         }

     }

    静态方法只能访问静态成员,实例方法可以访问静态成员和实例成员。不允许静态方法访问实例成员变量的原因是实例成员变量属于对象,而静态方法在执行时不一定具有对象。关键字this不能在静态方法中使用。

    倒排索引

    倒排索引

    如果转换成一个转置的索引可能更好地理解,它将相当于做矩阵转置。

    倒排索引是一种索引方法,用于存储全文搜索下文档或文档组中单词存储位置的映射。

    反射

    反射API中提供的动态代理也是一个非常强大的函数,可以在AOP中本地实现方法拦截函数。正如英语单词反射所暗示的,使用反射API就像在水中查看Java类的反射。一旦知道Java类的内部结构,就可以与它进行交互,包括在对象中创建新对象和调用方法。

    这种交互与直接在源代码中使用它有相同的效果,但还提供了运行时灵活性。使用反射的最大缺点之一是性能差。对于同一个操作,使用反射API比直接使用它所花费的时间要少一到两个数量级。然而,在当前的JVM实现中,反射操作的性能得到了很大的提高。

    Java反射API的第一个主要作用是在运行时捕获程序的内部结构。

    多路归并算法

    合并排序也是一种使用分而治之方法的有效排序算法。它是由现代计算机的创始人约翰·冯·诺依曼于1945年发明的。

    在许多排序算法中,合并排序不仅稳定而且高效。同时,合并排序不仅可以用于内部排序,还可以用于外部排序。

    合并排序的思想如下(以双向合并为例):

    该阵列分为两个子阵列。

    对两个单词数组排序;

    合并两个单词的排序数组。

    所谓的n向合并是指将数组划分为n个子数组,对单词数组进行排序,然后将它们合并。因此,双向合并是最常见的合并排序方式。

    例如。

    传说

    def msort(array): length = len(array) if length == 1: return array else: mid = length / 2

     left = msort(array[0: mid]) right = msort(array[mid: length]) return merge(left, right)

    非递归

    def msort(array): length = len(array) step = 1 while step < length: for left in range(0, length - step, 2 * step): result = merge(array[left:left + step], array[left + step: min(left + 2 * step, length)]) array = array[0:left] + result + array[min(left + 2 * step, length)] step = step * 2 return array

    def merge(left, right): llen = len(left) lcur = 0 rlen = len(right) rcur = 0 result =  while lcur < llen and rcur < rlen: lone = left[lcur] rone = right[rcur] result.append(min(lone, rone)) if lone < rone: lcur += 1 else: rcur += 1 result += left[lcur:] result += right[rcur:] return result

    枚举类型

    枚举类型

    枚举类型不支持构造公共修饰符和受保护修饰符,因此构造函数必须是私有的或友好的。因此,不能通过直接调用枚举对象的构造函数在程序中初始化枚举对象。

    由于枚举类型值实际上由运行时构造的对象表示,因此每个虚拟机在集群环境中构造一个同义的枚举对象。因此,重要的是要注意,如果直接使用等号(“==”)运算符,则这些看似相同的枚举值不能相同,因为这不是同一对象实例。

    多线程

    在Java中实现多线程的方法有两种:继承线程类和实现可运行接口。只要在程序开发中使用多线程,可运行接口将始终是主要的,因为与继承线程类相比,实现可运行接口有以下优点:

    1。它可以避免Java的单继承特性所造成的局限性。

    2。增强程序的鲁棒性,代码可以由多个线程共享,代码和数据是独立的;

    三。适用于多个相同程序代码的线程处理同一资源的情况。

    下面是一个通过实现可运行接口实现的多线程程序。代码如下:

    class MyThread implements Runnable{

     private int ticket = 5;

     public void run{

     for (int i=0;i<10;i++) {

     if(ticket > 0){ 

    System.out.println("ticket = " + ticket--);

                 } 

            }

         }

     } public class RunnableDemo{ 

    public static void main(String[] args){

     MyThread my = new MyThread; 

    new Thread(my).start;

     new Thread(my).start; 

    new Thread(my).start;

         } 

    }

    相关文章

      网友评论

          本文标题:那些经常被遗忘的面试题,你知道几个?

          本文链接:https://www.haomeiwen.com/subject/dckeyqtx.html