java基础面试题总结

来源:互联网 发布:条形码生成软件 编辑:程序博客网 时间:2024/06/14 09:29

count(*)、count(字段)、count(distinct 字段)的区别?

      •count(*):表示统计出表的行数;

       •count(字段):表示如果字段中有数据为空则不统计;

       •count(distinct 字段):表示统计不重复字段。

CLASSPATH和PATH的区别?

         ·PATH为系统环境变量,主要定义可执行程序的路径;

         ·CLASSPATH是Java虚拟机在解释java程序的时候设置的加载路径。

public class 和class 的区别?

         · publicclass定义的类要求文件名称与类名称保持一致,在一个*.java文件里面只允许有一个publicclass,如果一类需要被不同包所访问,那么就必须用public class定义;

                  |-在正规开发之中一个*.java里面只会有一个类,这个类都使用public class声明,很少会使用class定义(除非内部类);

         · class定义的类文件名称可以与类名称不一致,并且在一个*.java文件里面可以定义出多个class,编译后会形成不同的*.class文件,这些类只允许在本包内访问,不允许外包访问;

 

请解释“&”和“&&”、“|”和“||”的关系?

         · 在逻辑运算之中:主要是若干个布尔值或布尔表达式的结果连接;

                   |- 逻辑与操作:

                            |- “&”:若干个判断条件都要进行判断;

                            |- “&&”:若干个判断条件如果前面有条件返回了false,则后续判断不再执行,最终结果为false;

                   |- 逻辑或操作:

                            |- “|”:若干个判断条件都要进行判断;

                            |- “||”:若干个判断条件只要有一个判断条件返回了true,后续的判断将不再执行,最终结果就是true。

         · 在位运算之中:指的是直接进行两个数字的操作

                   |- “&”:如果进行操作的两位之间有一位是0最终的结果就是0,如果全部为1,结果才为1;

                   |- “|”:如果进行位操作的之间有一位是1,则最终的结果为1,如果全为0结果才为0。

 

请编写一个数组排序操作(冒泡排序法)

for (intx = 0; x < data[].length ;x++) {

    for (inty = 0; y < data[].length - 1 -x; y++) {

        if (data[][y] >data[][y + 1]) {

            inttemp = data[][y];

            data[][y] =data[][y + 1];

            data[][y + 1] =temp;

        }

    }

}

 

请解释在字符串相等的判断中“==”和“equals()”的区别?

         · “==”是Java提供的关系运算符,主要功能是进行数值相等判断的,如果用在了String对象上表示的是内存地址数值的比较 ;

         · “equals”是由String提供的一个方法,此方法专门负责进行字符串内容的比较。

 

请解释String类对象两种实例化方式的区别?

         ·直接赋值(Stringstr = "字符串" ; ): 只会开辟一块堆内存空间,并且会自动保存在对象池之中以供下次重复使用;

         · 构造方法(String str = new String("字符串") ; ) :会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会入池,但是用户可以使用intern()方法手工入池。


  比较this与super的区别?

No.

区别

this

Super

01

功能

调用本类构造。本类方法、本类属性

子类调用父类结构、父类方法、父类属性

02

形式

先查找本类中是否存在有指定的调用结构,如果有则直接调用,如果没有调用父类定义

不查找子类,直接调用父类操作

03

特殊

表示本类的当前对象

-

 请解释重载与覆写的区别?(请解释Overloading与Override的区别?)

No.

区别

重载

覆写

01

英文单词

OverLoading

Override

02

定义

方法名称相同、参数类型或个数不同

方法名称、参数类型和个数、返回值都相同

03

权限要求

没有权限的定义要求

被覆写的方法不能拥有比父类更严格的权限

04

适用范围

一个类之中

继承关系类

         在进行方法重载时返回值类型允许不同,但是考虑到程序的标准化,不建议返回类型不同。

 

抽象类与接口的区别?

No.

区别

抽象类

接口

01

定义关键字

abstract class 类名称

interface 接口名称

02

组成

普通方法、构造方法、抽象方法、常量、属性

全局常量、抽象方法

03

权限

可以使用各种权限

全部都是public 访问权限

04

子类定义

子类使用extends 关键字只能继承一个抽象类

子类使用implements可以实现多个接口

05

关系

抽象类允许实现多个接口

接口不允许继承抽象类,但是接口却可以使用extends继承多个父接口

06

使用

依靠对象多态性的向上转型特点,通过子类进行对象的实例化处理

         抽象类本身由于存在有单继承局限,所以在实际的设计开发过程之中,优先考虑接口,毕竟接口没有单继承局限,可是随着慢慢的开发深入,你会发现,抽象类的控制要比接口更加复杂。

 

请编写单例设计模式,并解释Singleton程序的特点?

 

class Singleton{

    private static final Singleton INSTANCE=new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {

        return INSTANCE;

    }

    public void print() {

        System.out.println("hello world!");

    }

}

public class SingletonTest {

    public static void main(String[] args) {

        Singleton s=Singleton.getInstance();

        s.print();

    }

}

 

程序特点:构造方法私有化,在类的内部定义static属性和方法,利用static方法取得本类的实例化对象,这样一来不管外部会产生多少个Singleton类的对象。但是本质上永远只有唯一的一个实例化对象。

         在单例设计模式上有两种形式:饿汉式、懒汉式。

         以上的是饿汉式。

请解释Error与Exception的区别?

·Error:程序现在还没有执行,JVM出错了,程序没执行,异常无法处理;

·Exception:程序执行过程中产生的异常,用户可以处理。

请解释throw与throws的区别?

·throw:是写在方法之中的,表示进行异常的抛出;

·throws:是在方法声明上的编写的,表示此方法不处理异常,交给调用处进行处理,同时也为了清楚的告诉调用处,可能产生的种种异常。

请解释Java中的异常处理流程?

         ·当程序执行过程之中产生了异常之后,那么会由JVM自动的创建一个指定异常类型的实例化对象;

         ·当产生了异常的实例化对象之后就需要判断当前代码里面是否存在有异常处理语句(try语句是否包裹住了这个异常对象),如果没有异常处理语句,那么这个时候将采用默认的处理形式完成,即:直接输出异常的完整信息,随后程序在异常产生处进行中断,并且结束运行;

        ·而如果说现在程序之中存在有异常处理语句,则会使用try语句捕获该异常类的实例化对象(同时产生异常之后的语句将不再执行,try语句范围的);

        ·当try语句捕获到异常之后要进行catch的匹配,如果与某一个指定的catch匹配成功,则表示该catch语句可以进行异常处理,但是如果没有匹配成功,则继续向后续的catch匹配,如果都没有匹配成功,这个时候会进行一个操作的记录(匹配失败);

        ·如果现在catch匹配成功了,则向后继续执行finally程序代码,由于此时已经匹配异常成功,所以证明该异常已经被处理了,则继续执行后续代码,一直到程序最终执行完毕;

        ·如果没有进行catch成功匹配也要执行finally中的代码,而由于异常没有处理,则执行完finally代码之后,程序将采用默认的方式进行异常处理(输出异常信息、中断程序执行)。

请解释Exception与RuntimeException的区别?请列出几个常见的RuntimeException的异常子类。

         ·Exception:标注的异常必须强制性处理;

         ·RuntimeException:是Exception的子类,RuntimeException异常不需要强制处理,由用户自己选择处理。

常见RuntimeException异常子类:ClassCaseException、NullPointerException、NumberFormatException等

请解释enum与Enum的区别?

         ·enum是JDK1.5后追加的关键字,使用enum可以定义枚举,相当于定义一个类继承自Enum父类。

Thread与Runnable的区别

         •Thread类是Runnable接口的子类,使用Runnable接口实现多线程可以避免单继承局限;

         •Runnable接口实现的多线程可以比Thread类实现的多线程更清楚的描述数据共享的概念。

 

 

请解释Runnable与Callable区别?

         ·Runnable是java.lang包中提供的,里面只有一个run()方法,并且无返回值;

         ·Callable是java.util.concurrent包中提供的,只有一个call()方法,线程执行完毕后可以返回数据。

请解释sleep()与wait()区别?

         ·sleep()是在java.long.Thread类里定义的,进行短暂的休眠,休眠时间一到,自动唤醒

         ·wait()是在java.long.Object类里定义的,表示进行等待,最初必须通过notify()、notifyAll()才可以唤醒,但是后面的设计考虑到有可能会出现死锁的情况,也为其追加了一个等待的超时时间。

 

请解释String、StringBuffer、StringBuilder区别?

         ·String的内容不可以修改,StringBuffer 和StringBuilder都可以修改;

         ·StringBuffer与StringBuilder功能都一样,唯一的区别是StringBuffer中的方法都是同步方法,属于线程安全操作,而StringBuilder是异步处理操作,属于非线程安全操作类。

 

什么是GC?如何控制?

         ·GC指的是垃圾收集器(Garbage Collector),是进行无用内存空间释放操作的;

         ·GC的处理有两种模式,一种是自动清除,另外一种是手工利用Runtime类中的gc()方法清除。

 

请解释final、finally、finalize的区别?

         ·final:是Java的关键字,定义不能被继承的类、不能被覆写的方法、常量、属于终结器;

         ·finally:是异常处理的统一操作接口;

         ·finalize:是Object类中的一个对象回收处理的方法。

请解释Comparable和Comparator区别?

         ·java.lang.Comparable是在一个类定义的时候默认实现好的排序接口,里面有一个compareTo()方法;

         ·java.util.Comparator是类定义完成之后的排序挽救处理,需要定义一个单独的排序规则类,里面有一个compare()方法,之后使用Arrays类提供的sort()方法完成对象比较。

请解释volatile与synchronized的区别?

         ·synchronized针对于多个线程的操作进行同步;

         ·volatile是在属性定义的时候表示属性内容直接与原始数据进行同步。

请编写一个Singleton程序

         ·先写出饿汉式和懒汉式的单例设计模式;

         ·分析懒汉式单例设计模式与多线程操作中的问题,以及volatile关键字的使用;

         ·对于单例设计模式与可以直接利用JVM底层的工具类:Unsafe来进行处理。

请解释ArrayLIst与LinkedList有什么区别?

         ·从继承结构来讲ArrayList属于List接口子类,而LinkedList不光实现了List接口还实现了Queue接口;

         ·ArrayList是对一个数组的包装,而LinkedList是对链表的包装,ArrayList的时间复杂度是1,而LinkedList时间复杂度是n(有多少位就有可能在查找的时候遍历多少次);

         ·ArrayList之中默认会开辟10个元素的数组,而后如果空间不足则继续进行新空间的开辟,如果频繁进行容量的扩充会产生大量的垃圾空间,则性能会受到严重影响,所以当不确定个数的时候,使用ArrayList就有可能带来垃圾的增长,建议使用LinkedList,则知道长度的时候使用ArrayList比较合适。

请解释ArrayList与Vector的区别?

No.

区别

ArrayList

Vector

01

推出时间

JDK1.2推出

JDK1.0推出

02

性能

采用异步处理,性能更高

采用同步处理,性能相对较低

03

安全性

非线程安全操作

线程安全操作

04

集合输出

Iterator、ListItreator、foreach

Iterator、ListItreator、foreach、Enumeration

 

       ArrayList与Vector都是针对数组的封装。在以后的开发里面,对于List子类首选ArrayList。

在进行HashMap的put()方法操作时,是如何进行容量扩充的?

         ·本题目主要的考核点在于对阙值得理解上,同时也要清楚扩充个数:实际上发现ArrayList类每一次也是可以进行个数的扩充的,它的扩充都是“*2”,所以在程序的处理上HashMap之中的扩充也是按照“*”做的,但是它是有触发点的。

         ·在HashMap进行无参构造设置的时候有如下一段代码:

    /**

     * Constructs an empty <tt>HashMap</tt> with the default initial capacity

     * (16) and the default load factor (0.75).

     */

    public HashMap() {

        this.loadFactor =DEFAULT_LOAD_FACTOR;// all other fields defaulted

    }

 

         主要是设置触发点精度,也就是说在存储数据的时候如果达到了数据存储的75%就会进行扩充的操作,在HashMap里面初始化的大小是:16

      /**

     * The default initial capacity - MUST be a power of two.

     */

    static final int DEFAULT_INITIAL_CAPACITY= 1 << 4; // aka 16

 

 

         初始化个数是16,也就是说达到了16*0.75(12个)元素的时候将进行扩充处理。这个时候会扩充两倍。

请解释HashMap的工作原理(JDK1.8)

       ·原理:当保存的Map个数达到了8个内容,那么将有链表(时间复杂度“n”、很高)保存为红黑树保存(类似于二分法)。

         ·在HashMap里面有一个转换的阙值:

    /**

     * The bin count threshold for using a tree rather than list for a

     * bin.  Bins are converted to trees when adding an element to a

     * bin with at least this many nodes. The value must be greater

     * than 2 and should be at least 8 to mesh with assumptions in

     * tree removal about conversion back to plain bins upon

     * shrinkage.

     */

    static final int TREEIFY_THRESHOLD = 8;

         红黑树的这种数据结构是一种均衡二叉树,它的基本原理:

                   ·取第一个数据为根节点,并且根节点必须是黑色的,而后第二层节点为红色,再下一层为黑色。

class Node {

         private boolean blackFlag ;

         private boolean blackFlag ;

         private Node left ;

         private Node right ;

}

 

         `如果某一个节点的叶子节点没有数据,则为黑色。

请解释HashMap与Hashtable的区别?

No.

区别

HashMap

Hashtable

01

推出时间

JDK1.2推出

JDK1.0推出

02

性能

采用异步处理,性能更高

采用同步处理,性能相对较低

03

安全性

非线程安全操作

线程安全操作

04

保存空

允许key、value保存null

key、value如果设置null出现“NullPointterException”异常

 

如果进行HashMap保存时出现了Hash冲突,HashMap是如何解决的?

         ·所谓的Hash冲突指的是计算后的Hash值,会在一个Hash位置上,则会将数据以链表的形式保存。

         ·在数据结构上Hash冲突的解决方案:定址法、再哈希法、链表保存法(HashMap就是链表保存)。

 

 

请解释Collection与Collections的区别?

         ·Collection是单值集合操作的最大父接口;

         ·Collections是一个集合操作的工具类。

请解释OOM问题?

         ·OOM:内存溢出、OutOfMemory。

请解释一下JVM的自动GC处理流程?

         当新对象创建的时候会依次判断年轻代(伊甸园区、存活区)、老年代的内存空间是否充足,如果空间充足则进行内存的开辟,如果空间不充足,那么在年轻代会首先进行MinorGC,如果MinorGC失败,则会在老年代触发MajorGC,如果都失败会出现OOM。

 

 

请解释JSP之中的两种包含的区别?

         ·静态包含:先包含后在一起进行处理;

                   |-静态包含语法:<jsp:include page="导入的路径"/>

         ·动态包含:会区分包含的页面是静态页面还是动态页面,如果是动态页面则先分别处理然后将结果包含进来,如果是静态页面,则直接进行包含,不处理任何的程序代码,利用动态包含可以向被包含页面传递若干参数。

                   |-动态包含语法:

<jsp:include page="导入的路径"

    <jsp:param name="参数名称" value="参数内容"/>

    <jsp:param name="参数名称" value="参数内容"/>

    ... ...

    <jsp:param name="参数名称" value="参数内容"/>

</jsp:include>

 

请解释JSP之中两种跳转的区别?

         ·服务器端跳转:跳转之后地址栏不发生改变,可以传递request属性范围,跳转操作之后的语句不再执行;

                   |-实现技术:<jsp:forward page="路径"/>;

         ·客户端跳转:跳转之后地址栏发生改变,不可以传递request属性范围,所有代码执行完毕后再进行跳转;

                   |-实现技术:

                            |- 可以使用超链接:<a href="路径">文字</a> 、window.locationd的JS程序;

                            |-response.sendRedirect()方法;

                            |- refresh头信息可以实现跳转;

请解释Session与Cookie的区别?

         ·Session的信息保存在服务器端,而Cookie的信息保存在客户端浏览器中;

         ·不同的用户依靠Cookie中保存的SESSIONID与服务器进行数据的交互;

         ·如果SESSION离开了Cookie,那么肯定无法操作,最初的时候由于浏览器之中经常被禁止Cookie的情况,那么就导致了Session无法使用,所以最初开发的时候如果要防止之类情况出现必须采用地址重写的方式手工传递JSESSIONID。

关于request请求编码与page的页面编码的区别?

         ·客户端发送给服务器端的数据信息如果要想正常被服务器端接收,则一定要设置好请求编码;

         ·如果服务器端要回应给客户端进行html代码显示的话,要使用page指令的pageEncoding设置编码。

请解释CountDownLatch与CyclicBarrier的区别?

         ·CountDownLatch:最大特征是进行一个数据减法的操作等待,所有的统计操作一旦开始就必须一直执行countDown()方法,如果等待个数不是0将被一直等待,并且无法重置;

         · CyclicBarrier:设置一个等待的临界点,并且可以有多个等待线程出现,只要满足了临界点触发了线程的执行代码后将重新开始进行计数处理操作,也可以直接利用reset()方法执行重置操作。

原创粉丝点击