1.JVM的定义。描述一下JVM加载class文件的原理机制?

JVM是Java虚拟机。它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机功能。JVM有自己完善的硬件架构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。
JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。

2.JDK,JRE和JVM之间有什么区别?

JDK是整个Java的核心,它包括了Java运行环境、一堆Java工具和Java基础的类库。
JRE是Java程序运行所必需的环境集合,主要由Java虚拟机、Java平台核心类和若干支持文件组成。
JVM是Java运行环境的最核心部分,是运行Java程序的最基本环境。
可以看出,三者之间是包含关系,范围由大到小依次是JDK、JRE和JVM。JDK中包含JRE,JRE中包含JVM。

3.GC是什么? 为什么要有GC?有什么办法主动通知虚拟机进行垃圾回收?并考虑2种回收机制。

GC是垃圾收集机制(Gabage Collection)。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。但是可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会立刻执行。回收机制分为代复制垃圾回收、标记垃圾回收和增量垃圾回收。

4.说出一些常用的类,包,接口,请各举5个

常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer;
常用的包:java.lang java.awt java.io java.util java.sql;
常用的接口:Collection List Map Runnable NodeList Iterator

5.&和&&的区别。

按位与:a&b是把a和b都转换成二进制数然后再进行与的运算;
逻辑与:a&&b就是当且仅当两个操作数均为true时,其结果才为true;

6.简述逻辑操作(&,|,^)与条件操作(&&,||)的区别。

区别:a.条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型b.逻辑操作不会产生短路。

7.==和equals()都可以用于比较两个操作数是否相等,它们有什么区别?

==是一个关系运算符,用于判断两个简单变量的值是否相等,或两个引用变量的引用地址是否相等。
equals()是一个方法,用于判断引用变量引用地址指向的存储内容是否相等。

8.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

会执行,在return前执行。

9.在JAVA中,如何跳出当前的多重嵌套循环?

用break return 方法。
补充:break的作用是可以结束其所在的switch语句或者循环语句的执行。return的作用是让代码执行到此处终止。continue的作用是终止本次循环,进入下次循环。

10.作用域public,private,protected,以及不写时的区别。

作用域 当前类 同包 子孙类 其他
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly

11.数组的排序算法有哪些?如何实现?

在实现数组元素的排序算法时,排序算法有很多,例如选择排序法、冒泡排序法、插入排序法以及快速排序法等。
选择排序法:将要排序的数组分为两部分,一部分是从小到大已经排好序的,一部分是无序的,从无序的部分取出最小的数值,放到已经排好序的部分的最后。代码如下:

public static int[] xuanze(int[] arr){
    int t;
    for (int i = 0; i < arr.length; i++) {
        int m=i;
        for (int j = i+1; j < arr.length; j++) {
            //如果j元素比m元素小,将j赋值给m
            if(arr[j]<arr[m]){
                m=j;
            }
        }
        //交换m和i两个元素的位置
        if(i!=m){
            t=arr[i];
            arr[i]=arr[m];
            arr[m]=t;
        }
    }
    return arr;
}

冒泡排序法:从数组开始扫描待排序的元素,在扫描过程中依次对相邻元素进行比较,将数值大的元素后移。没经过一趟排序后,数值最大的元素将移到末尾,此时记下该元素的位置,下一趟排序只需要比较到此的位置为止,直到所有的元素都已经有序排列。代码如下:

public static int[] maopao(int[] arr){
        int t;
        for (int i = 0; i < arr.length; i++) {
            //循环比较相邻两个元素大小
            for (int j = 0; j < arr.length-i-1; j++) {
                //比价相邻元素大小,小的前移,大的后移
                if(arr[j]>arr[j+1]){
                    t=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=t;
                }
            }
        }
        return arr;
}

插入排序:将要排序的数组分成两部分,每次从后面的数组部分中取出索引最小的数组元素,插入到前面数组部分的适当位置中。通常在开始排序时,讲数组的第一个元素作为一组,后面的所有元素被当成另一组。代码如下:

public static int[] charu(int[] arr){
    //把第一个元素看做一部分,第二个元素看做另一部分
    //从第二部分中依次取元素插入到第一部分中
    for (int i = 1; i < arr.length; i++) {
        int tmp=arr[i];
        int j=i-1;
        //依次和i前面元素比较,寻找合适插入位置、
        while(tmp<arr[j]){
            arr[j+1]=arr[j];
            j--;
            if(j==-1){
                break;
            }
        }
        //将插入元素插入到合适位置
        arr[j+1]=tmp;
    }
    return arr;
}

快速排序法:将一个大的数组的排序问题,分解成2个小的数组的排序,而每个小的数组的排序又可以继续分解成更小的2个数组,这样一直递归下去,直到数组的大小最大为2.代码如下:

public static int[] kuaisu(int[] arr){
    return quicksort(arr, 0, arr.length-1);
}
public static int[] quicksort(int[] arr,int left,int right){
    int t;
    if(left<right){
        int s=arr[left];
        int i=left;
        int j=right+1;
        while(true){
            //向右找大于s的数的索引
            while(i+1<arr.length&&arr[++i]<s);
            //向右找小于s的数的索引
            while(j-1>-1&&arr[--j]>s);
                //如果i>=j,退出循环
                if(i>=j){
                    break;
                }else{
                    //交换i和j位置的位置
                    t=arr[i];
                    arr[i]=arr[j];
                    arr[j]=t;
                }
            }
            arr[left]=arr[j];
            arr[j]=s;
            //对左边进行递归
            quicksort(arr, left, left-1);
            //最右边进行递归
            quicksort(arr, j+1, right);
        }
    return arr;
 }

12.用最有效率的方法算出2乘以8等於几?

2 << 3

13.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。

14.同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

15.是否可以从一个static方法内部发出对非static方法的调用?

不可以,如果其中包含对象的method();不能保证对象初始化.

16.Static Nested Class 和 Inner Class的不同?

Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。

17.什么时候用assert?

assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

18.Java有没有goto?

Goto是java中的保留字,但是现在没有在java中使用。

19.什么是UML?

标准建模语言UML。主要包括用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图。

20.Java常用的设计模式?说明工厂模式。

Java中的23种设计模式:Factory(工厂模式),Builder(建造模式), Factory Method(工厂方法模式),Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),Observer(观察者模式),State(状态模式),Strategy(策略模式),Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)。
工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

21.WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

Web ServiceWeb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。
JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。
WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。
SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

22.Java程序怎么优化。

提高JAVA的性能,一般考虑如下的四个主要方面:
(1) 程序设计的方法和模式
(2) JAVA布署的环境。
(3) JAVA应用程序的实现
(4) 硬件和操作系统 为了提高JAVA程序的性能,需要遵循如下的六个步骤。 a) 明确对性能的具体要求 b) 了解当前程序的性能 c) 找到程序的性能瓶颈 d) 采取适当的措施来提高性能 e) 只进行某一方面的修改来提高性能 f) 返回到步骤c,继续作类似的工作,一直达到要求的性能为止。

23.java的调试如何进行。

jdb 是java 的调试器,类似于 UNIX系统的调试器 dbx,jdb 使用 Java调试器应用程序接口来完成对本地或远程的Java调试器的调用工作。一般是在要测试的代码段想控制台打印消息。

24.堆栈的概念

java中的内存分为两种,一种叫做栈内存,一种叫做堆内存。
在函数中定义的一些基本数据类型的变量和对象的引用变量都在函数的栈内存中分配;当一段代码块定义一个变量的时候,java就在栈中为这个变量分配内存空间,当超过变量的作用域之后,java会自动释放掉为该变量所分配的内存空间,改内存空间可以立即被另作他用;堆内存用来存放new创建的对象和数组;在堆内存中分配的内存,由java虚拟机的自动垃圾回收器来管理:数组和对象在没有引用变量指向它的时候,才会变成垃圾,不能再被使用,但是任然占内存,在一个不确定的时间被垃圾回收器释放掉,也是java比较占内存的原因,实际上,栈中的变量指向对内存中的变量,这就是java的指针;

25.heap堆和stack栈有什么区别。

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素。