Java面试题

一. Java基础
1.1.如何看待Java:
    面向对象,底层由C语言开发,可以实现跨平台使用(得益于其JVM机制),运行时库.区别于C#[C#        类似于Java,其仅支持Windows(微软开发)和Linux(mono开发),在Linux也是将代码转换成Java执行]
1.2.名词JVM/JDK/JRE/JavaSE/JavaEE/JavaME/GC:
1.3.JVM能有几个实例:
    每个Java程序运行时都会创建一个JVM,所以JVM的个数取决与同时执行的程序个数
1.4.Java跨平台是如何实现的?
    java利用JVM(Java虚拟机)实现跨平台(Jvmtest.java源码经过Java编译器编译成Java字节码Jvmtest.class,字节码由不同平台的JVM解释具体平台的指令并执行,所以可以说Java的字节码是跨平台的 )
1.5.TCP与UDP协议的区别

比较项TCPUDP
是否可连接面向连接面向非连接
传输可靠性可靠的不可靠
应用场合传输量大的数据少量数据
速度
1.6.说一下类/方法/变量/包/常量的命名规则
    避免保留字段/驼峰命名法则/常量命名时一般全大写[WORK_MUFENG]
1.7.Java有几种注释方法:    //Not, /*Not*/, /**Not*/
1.8.如何增加代码的清晰度和可读性:
   1)添加注释,2)命名规范,3)缩进排版,4)添加异常处理,5)资源的释放,6)垃圾回收
1.9.void与null的区别:
    void仅用于无返回值的函数上: public void test(){}
    null表示该对象/变量为空: String str = null;
        [ 变量str未被实例化]
1.10.Java结构化程序设计有 哪三种 基本流程,分别是? 顺序/选择/循环
    1)从上而下按先后顺序执行
    2)if(){} else if(){}else{},swith(){case 1: ...}
    3)for(){},while(){},do{}while()
1.11.&和&&的区别
    1)均表示逻辑关系判断[与/且]
    2) &逻辑表达式全部计算计算完,而&&会出现短路现象
1.12.Java中的 8种原始类型及其长度
    byte/short/int/long/double/char/boolean
1.13.JVM加载class文件的原理机制
    JVM中类的装载是由ClassLoader和他的子类完成的,Java_ClassLoader是一个重要的Java运行时系统组件,它负责运行时查找和转入类文件中的类.
1.14.对迭代的理解,以及迭代的含义:
    可行性分析->需求分析->概要设计->详细设计->编码->测试->部署->维护
1.15.什么是进程?
    进程是操作系统结构的基础,是一个计算机中正在运行的程序实例,可以分配给处理器并被处理器执行的一个实体,由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元
1.16.GC,什么是垃圾回收?什么时候触发垃圾回收?如何降低垃圾回收的触发频率?这样能保证程序有足够的可用内存吗?
    1)GC是Java语言的一个重要特性,释放不再被使用的内存
    2)GC由系统进行管理,在系统认为需要的时候自动启动一个线程来处理
    3)尽量减少垃圾内存,也就是新建对象的数量,可以降低垃圾回收的频率
    4)垃圾回收机制不能保证有足够的内存
 [ 注:Java通过new为对象分配内存,且这些内存空间都在堆上,而GC会监控每个对象的状态(申请/引用/被引用/赋值),根本原则就是对象不会再被使用(对象赋值null,未被使用,给对象赋新值重新分配内存空间)]
1.17.Java中存在内存泄漏吗?请简要描述?
     存在,一些确实不会再被使用的对象, 在GC看来是不能释放的 ,导致内存泄漏
    eg: List list = new ArrayList();
        for(int i = 0; i < 10; i++){
            Object obj = new Object();
            list.add(obj);
            obj=null;
            //此处释放了obj引用,但是其指向的new Object对象还被list所指向GC不释放
        }                
     将对象设置为null属于什么?是通知GC这个对象的内存我不用快来回收吗?
            ( 设置为null,是为了在下次GC执行时强制回收这部分内存
1.18.Java源文件中是否可以包含多个类?有什么限制?
    可以包含多个类,每个源文件中至多有一个public类,且这个类的类名必须和源文件名称一致(一般建议一个源文件只写一个Java类)
1.19.列举常用的JDK包: java.lang/java.io/java.net/java.sql/java.util
1.20. 何为递归?
    函数/过程/子过程,中某条分支向着结束函数的方向发展,而某条分支确直接或间接调用函数本身,所产生的重入现象
    运用在以下三种情况:
        1)数据的定义是按递归定义的[Fibonacci(斐波那契)函数]
        2)问题解法按递归实现[回溯]
        3)数据的结构形式是按递归定义的[数的遍历,图的搜索]
    //根据输入的起始日期a,当前日期b,周期v
    public Date getNextDate(Date a,Date b,int v){
        Date newDate = a + v;
        if(newDate < b){
            newDate = getNextDate(newDate, b, v);
        }
        retrun newDate;
    }
1.21.写出n!的算法?
    public int doFactorial(int num){
        if(num < 1){
            return 0;
        }else if(num == 1 || num ==2){
            return num;
        }else{
            return num * doFactorial(num - 1);
        }
    }
1.22.排序有几种方法?
    插入排序[直插,希尔]/交换排序[冒泡,快速]/选择排序[直接选择,堆]/归并排序/分配排序[箱,基数]
1.23.写一个排序方法排列10个0-100之间的随机数
1.24.写一下冒泡排序程序
  ~  编程案例
1.50.
二. OOP面向对象编程
2.1什么是OOP?什么是OOAD?如何实现?
    1)OOP:Object-Orientation Programming 面向对象编程.
    2)OOAD:Object-Orient Analysis and Design 面向对象的分析与设计
    3)设计与实现时,尽可能的接近现实世界,用UML建模语言创建系统的分析与设计模型来是实现OOAD
2.2. 类以及对象有几种创建模式? 分别叙述它们?
    共有 五种创建模式: 单例/工厂方法/抽象工厂/建造者/原型,其中工厂方法为类创建模式,其余四种为对象创建模式.
    1)单例模式[Singleton, 对象创建模式]:保证一个类只有一个实例,而且自动实例化并向整个系统提供这个实例
    2)工厂方法模式[Factory Method, 类创建模式]:该类不负责所有的产品(类)的创建,而是将具体的创建工作交给具体的子类去做,仅负责提供具体工厂类必须实现的接口,而不接触某个产品实例化的细节
    3)抽象工厂模式[Abstract Factory, 对象创建模式]:
    4)建造者模式[Builder, 对象创建模式]:
    5)原型模式[Prototype, 对象创建模式]:
    附件 绍类或对象的创建
2.3.什么时候需要改写hashCode()方法?为什么?
    类在改写了Object的equals方法时需要改写hashCode(),否则该类会违反Object类的hashCode方法的通用约定,将不能与其他类结合在一起正常工作.
2.4.继承和重载的区别?
    1)继承:是指子类对象继承父类对象的成员属性和成员方法, 只允许单继承,继承过程中子类重写(覆盖)从父类继承来的同名方法( 此时子类中该方法的签名必须保持一直,且方法的访问权限不能比父类高,否则该方法将视为子类自有的成员方法),当子类对象调用该方法时都是调用的自己重写后的方法,除非使用super关键字或父类类名为前缀时,才调用的是父类的该方法.
    2)重载:同一个类中两个或多个方法名相同,参数列表不同,返回值类型没有限制
    3) 子类中与父类方法名相同,但是参数列表不同的方法,属于子类自有的成员方法?
2.5.public/protected/default/private访问域

作用域
当前类
同一package
子孙类
其它
public
protected

default


private
 



2.6.抽象类(abstract class)和接口(interface)的区别?
    1)抽象类中可以有自己的成员变量以及非抽象的方法,既有自己的行为实现,而接口中一般不定义成员变量且所有的方法都必须是抽象方法,既所有方法都不能有自己的行为
    2)从编程角度分析,抽象类在Java中表示一种继承关系,一个类只能继承一个抽象类,但可以实现多个接口
    3)从问题域角度分析,抽象类M所派生(继承)出的新类N(子类),原则上应该是"N is a M",既N与M从概念上应该是相同的,而接口的实现类仅仅实现了接口所定义的契约而已.
     注意:抽象类派生出的子类如果不是抽象类时,子类必须全部实现父类的所有抽象方法,然而一个类实现某个接口时却不必全部实现该接口的所有 (abstract) 抽象方法
2.7.面向对象的 3个基本特征: 封装,继承,多态
2.8.面向对象有那4大特征:抽象,继承,封装,多态
    1)抽象:忽略掉与当前主体无关的那些方面,既不求解决全部问题,只实现部分细节,包含 抽象属性和抽象方法
    2)继承:表示一种承接关系,新类称为派生类(子类),原始类称为新类的基类(父类),派生类可以修改或增加新的方法使新类更适合特殊的需求
    3)封装:指把过程和数据包围起来,对数据的访问只能通过已定义的界面(对象),面向对象设计始于这个基本概念
    4)多态:多态指的是允许不同类的对象对统一消息做出不同的响应,是类的多种表现方式(如同名不同参)
2.9.一个子类(subClass)如何调用父类(supperCalss)中的方法(MyMethod)和构造函数?
    1)子类对象可以直接调用为被重写的父类方法,若该方法在子类中重写了则在子类中通过"super.MyMethod()"调用父类中的该方法
    2)在创建子类对象时,默认调用父类的无参构造方法(函数),若想要调用父类的有参构造方法,可以在子类的构造方法第一行通过"super(参数)"形式调用
2.10.构造器Constructor是否可被Override?    
    构造器不能被继承,因此不能被重写Override,但是可以被重载Overload
2.11.是否可以继承String类?
    不能,String类是final类,故final类不能被继承
2.12.阐述一下static关键字的作用?
    表示"静态"的意思,修饰成员变量和成员方法,形成静态代码块,这个类被加载后,Java虚拟机就可以根据类名在运行时数据区的方法区内找到它们,因此static成员可以在他的类创建任何对之象前访问,无需应用任何对象
    1)修饰成员变量:该成员变量不属于对象的数据结构,而属于类的变量可以通过类名来访问该变量,该成员变量与累的信息一起存放在方法区,并不是存在堆中,一个类的static成员变量无论创建多少个对象都只有一份
    2)修饰方法:该方法不需要针对某些对象进行操作,运行结果只与传入参数有关,调用时直接用类名引用, 由于static方法在调用时没有具体的对象,所以在static方法中不能对非static的成员(成员对象)进行访问,一般用于提供一些"工具方法"和"工厂方法"
    3)修饰块:属于累的代码块,在类加载时执行的代码,且只执行一次,可以用来在软件中加载静态资源.
2.13.解释Java关键字的含义以及用法?
    1)abstract:用于修饰类和方法,有abstract方法的类必然是abstract类,abstract方法主要是为了让子类继承实现
    2)extends:表示继承,子类通过继承父类来添加变量和方法,或者覆盖父类的方法,子接口继承父接口来田间变量和方法( 子类继承abstract父类时,需全部实现父类的抽象方法,子接口继承父接口时则不需要)
    3)final/finally:fianl用于定义常量(public final String THE_STR = "THEFINALSTR"),finally则用来执行一段代码(try{}catch(Exception e){}finally{}),不管try-catch是否抛错或者运行是发生错误,均执行finally代码块
    4)implements:在类的声明中可选,表示当前类实现的接口
    5)import:在源文件开始的部分,用来指明需要引用的一个类或整个包
    6)instanceof:判断其指向对象的实际类型
    7)synchronized:修饰代码块,防止多个线程同时访问该类的synchronized块
    8)throw/throws:throw允许用户抛出一个Exception对象或任何实现throwable的对象,throws用在方法的声明中来说明那些异常该方法是不处理的,而是提交到程序的更高一层
    eg:
        public String getStr(){
            try{
                
            }catch(SQLException e){
                throw e;
            }finally{
                
            }
        }
        //
        public int getInt() throws SQLException{
            
        }
2.14.静态变量和实例变量的区别?
    静态变量称为类变量,属于类,不依赖某个具体对象,可以通过类名直接访问,相反实例变量必须依存于某个实例对象,只能通过对象才能访问
     备注:区别 全局变量,局部变量,类变量(静态变量),实例变量    
2.15.何为GC,为何要GC
2.16.简述GC的有点和原理,并例举2种回收机制? --1)增量收集器,2)分代收集器
2.17.接口是否可继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
    答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承实体类(只要该抽象类有自己的抽象方法即可)
2.18.public class myString extends String{}有什么错?
2.19.子类B继承父类A,B b = new B();则父类A构造函数,父类A静态代码块,父类A非静态代码块,子类B构造函数,子类B静态代码块,子类B非静态代码块,它们的执行顺序是什么?
    父类A静态代码块->子类B静态代码块->父类A非静态代码块->父类A构造函数->子类B非静态代码块->子类B构造函数
2.20.简述类(class),类库(class library),包(package),jar文件之间的联系?
    1)类:某种类型的对象定义变量和方法的原型,
    2)类库:用来实现各种功能的类的集合
    3)包:类的容器,用于分割类名空间
    4)jar文件:用于发布和使用类库,可被编译器和JVM直接使用
2.21.面向对象的程序在运行时会创建多个对象,这些对象之间通常可以相互"发送消息",谈谈你对"对象之间发送消息"的理解,并编写几句Java代码展示对象之间发送消息的实现方法?
2.22.重写Clazz类的equals方法:
2.23.堆(heap)和栈(stack)的区别?
    都是用来在内存中存放数据的地方    
    1)栈用来存放基本类型和对象引用,超过作用域时释放,堆用于存放new出来的对象和数组
    2)堆可以动态分配内存大小(存取速度慢),生存期可以不事先告诉编译器,且GC会自动收走那些不再使用的数据.而存放在栈中的数据大小和生存期必须是确定的(存取速度快,仅次于CPU的寄存器),缺乏灵活性
    3)栈数据可以共享,堆不能
    4)栈是一种线形集合,按照后进先出的方式处理.堆是不连续的,可随机访问
三. JAVA SE
3.1.int与Integer的区别
3.2.程序
    String str1 = "Hello";
    String str2 = "Hello";
    String str3 = new String("Hello");
    String str4 = new String("Hello");
    System.out.println(str1 == str2);//true
    System.out.println(str3 == str4);//false
    为何结果不一样?
    答:由于1)"Hello"是一个字符串常量,存放在常量池中,str1创建此对象后,str2在创建对象时,首先会会到常量池中检查是否存在字符串"Hello",若存在直接引用,否则创建.所以str1==str2为true,2)而str3和str4是通过new关键字创建的,会在堆中分别创建,这两个引用分别指向不同的两个对象,"=="两个变量同时指向同一个对象时才返回true.
    注意:"=="和"equals"的区别?
            "=="比较的是对象的引用,"equals"比较的是对象的值
3.3.如何将int类型转换成String类型?如何将String类型转换成int类型
    1)String str = String.valueOf(i) ,2)int i = Integer.parseInt(str)
3.4.加法运算符"+"可以用在原始数值类型(int)的变量,但我们发现一些对象类型的变量,也支持"+"运算符,如:
    Integer i1 = 100;
    Integer i2 = 200;
    System.out.println(i1 + i2);//输出结果: 300
    答: Java1.5以后提供了自动装箱和自动拆箱功能,所以当执行代码:   
        Integer i1 = 100;
       时,系统实际执行的是代码:
        Integer i1 = new Integer(100);// 自动装箱
       而在执行代码:
        System.out.println(i1 + i2);
       时,系统实际执行的是代码:
        System.out.println(i1.intValue() + i2.intValue());// 自动拆箱
3.5.正则表达式?
3.6.身份证的正则表达式:^\d{15}(\d{2}[0-9xX])?$
3.7.Java中字符串转换到数字的API?
    String str ;
    Byte.parseByte(str);//
    Short.parseShort(str);//
    Integer.parseInt(str);//
    Long.parseLong(str);//
    Float.parseFloat(str);//
    Double.parseDoublestr();//
3.8.Anonymous Inner Calss(匿名内部类)是否可以继承(extends)其他类?是否可以实现(implements)接口(interface)?
    内部类可以继承其他类和实现其他接口 ,Java编程中常用此方式.
3.9.内部类可以引用外部类的成员吗?有什么限制?
    可以,非静态内部类没有限制,而静态内部类(匿名内部类)中只能访问外部类的静态成员
3.10.内部类的实现方式?[内部类和匿名内部类的区别?]
3.11.Checked Exception和UnChecked Exception是什么以及它们的区别?
    1)Checked Exception:这类异常都是Exception的子类;
    2)UnChecked Exception:Error和RuntimeException及其子类是unchecked Exception;
    3)二者区别在于,checked Exception是需要强制catch的异常,在调用该方法时,若没有捕获这个异常,那么编译器会报错( 程序会终止或者继续执行后续代码?),如IOException/SQLException而UnCheckedException是由自己错误或者内存耗尽等严重错误,是不可抗拒的,没有捕捉的必要,也无法捕捉,如NullPointerException(空指针异常)/IndexOutOfBoundsException(数组越界异常)
3.12.Java中如何引发异常,异常的2种处理途径是什么?
    答:可以用throw关键字来引发异常,2种处理途经分别是:1)用throws抛出异常,2)使用try{}catch(){}来捕获异常.
3.13.异常(Exception)分为几种类型?分别举例?
    答:2种
    1)运行时异常(RuntimeException):
    NullPointerException:
    NumberFormatException:
    ClassCastException:
    ArrayIndexOutOfBoundsException:
    2)非运行时异常:
    SQLException:
    IOException:
    ClassNotFoundException:
3.14.简单说明Java异常处理机制原理?
3.15. 如代码:
    try{ CodeA.. return;}catch(Exception e){}finally{CodeB}
    其中CodeB是否会执行?若会在什么时候执行?
    答:会被执行,在return之前执行.
3.16.使用多个catch语句捕获异常时,Java规定捕获Exception的catch语句必须排在最后,为什么?
    try{...}
    catch(NullPointerException ex){...}
    catch(IOException ex){...}
    ...
    catch(Exception ex){...}
    答:Exception是所有异常的父类,不在所有catch最后的话try块产生的异常,不可能会被catch(Exception ex){...}后的cactch语句捕获,即不会被执行,会出现编译错误,异常之间有继承关系,子异常在前父异常在后
3.17.Java中如何处理异常,关键字throws/throw/try/catch/finally分别代表什么?在try语句块中可以抛出异常吗?
    Java是通过面向对象的方法进行异常处理,Java中每个异常都是一个对象,他们是Throwable类或者其他子类的实例,若该对象的方法出现并抛出异常时,关键字try,catch,throw,throws,finally对异常进行处理.
    1)try:用来指定需要预防异常的程序块;
    2)catch:跟在try之后用来指定需要捕获的异常类型;
    3)throw:用来明确的抛出异常
    4)throws:用来标明一个成员方法可能抛出的各种异常
    5)finally:确保一段代码不管发生任何异常都会被执行,
    6)可以在一个对象方法调用外加trycatch语句,该对象方法也可以使用trycatch语句
3.18.final,finall,finalize的区别?
    1)final:一个修饰符,若一个类被final修饰,则该类不能派生出新的子类,既不能作为父类被继承,一个类不能即被abstract修饰又被final修饰,而final修饰的成员变量和方法时,说明该成员在使用中不被改变,且final变量必须初始化,只能引用不能修改,final方法只可使用,不能重载.
    2)finally:用在异常处理中,用于关闭(清除)一些对象,始终会执行,若有return语句则在return之前被执行.
    3)finalize:为方法名,Java允许finalize()在垃圾收集器将对象从内存中清除之前做必要的清理工作,它在Object类中定义,所以所有类都继承了该方法.
3.19.画出集合的框架图?
    
3.20.编写一段程序,用来创建和迭代一个List?
    什么是迭代?
    public void dieDaiList(){
        List names = new ArrayList<String>();
        names.add("LiuTao")
        names.add("Tom");
        names.add("Jack");
        for(int i = 0; i < names.size(); i++){
            String name = names.get(i);
            System.out.println(name);
        }
    }
3.21.Collection和Collections的区别?
    Collection是java.util下的接口,是各种集合的父接口,继承于他的接口主要有Set/List;
而Collections是java.util下的类,是针对集合的帮助类,提供一系列的静态方法,实现对集合的搜索/排序/线程安全等等.
44页
3.22.说说java集合类:HashMap是如何设计的,是如何解决什么冲突的?
    1)HashMap是基于哈希表的Map接口的非同步实现,Java编程中,最基本的机构就2种,一是数组,另一种是模拟指针(引用),所有的数据结构都可以用这两种基本结构来表示,HashMap实际上是一个"链表数组"的数据结构,HashMap底层就是一个数组结构,而这些数组中的每一项又是一个链表,新建一个HashMap时,就会初始化一个数组,Entry就是数组中的元素,每一个Map.Entry就是一个key-value对,它持有一个指向下一个元素的索引.这就构成了链表.
    2)HashMap的存储,往HashMap中put元素时,先根据key的HashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(下标),若该位置上已经存有其他元素了,那么这个位置上的元素将以链表的形式存放,新加入的存在链头,先存入的存在链尾,若该位置没有元素,则直接将元素存放在此数组的该位置上.
    3)HashMap的读取,从HashMap中get元素时,通过计算key的HashCode值,找到数组中对应的位置上的某一元素,通过key的equals方法在对应位置的链表中找到需要的元素.
    4)HashMap的resize(reHash),当数组中的元素越来越多时,Hash冲突的几率就越来越高,由于数组的长度是固定的,为了提高效率,这时就需要对HashMap进行扩容,
3.23.简述HashTable的原理,以及它和HashMap的区别?
    1)HashTable是基于哈希表的实现,通过put(Object key,Object value)方法把两个对象进行关联,需要时用get(Objet key )取得与key关联的值对象,Java的每个对象缺省都有一个通过Object的HashCode()方法获得的哈希码,HashTable就是通过这个hash码实现快速查找键对象的
    2)HashMap和HashTable都实现了Map接口,将唯一键映射到特定的值上,他们的区别在于:
        ①.HashMap没有排序,允许一个null键和多个null值,而HashTable不允许.
        ②.HashMap把HashTable的contains方法去掉了,改成了containsvalue和containskey,
    因为contains方法容易让人误会.
        ③.HashTable是继承Dictionary类,而HashMap是Java1.2引进的Map接口的实现.
        ④.HashTable的方法是synchornize的,而HashMap不是,在多个线程访问HashTable时,
    不需要自己为他的方法实现同步,而HashMap必须为之提供.
3.24.HashMap和HashSet有什么关系?
    HashSet底层是采用HashMap实现的
3.25.Vector和ArrayList有什么差异?
    1)同步性:Vector是线程安全的(同步),而ArrayList不是;
    2)扩容:扩容时Vector默认是增长一倍,而ArrayList是增长一半.
3.26.List,Set和Map是否继承于Collection?
    List和Set是继承自Collection接口,而Map没有继承Collection接口
3.27.List底层是如何实现的?双向链表和数组的区别? 
    答:    
    1)Java中List是一个接口,继承自Collection,并定义添加/删除/取出元素等对集合操作的抽象方法;
    2)数组必须事先定义固定的长度(int[] arr = new int[5]),不能适应数据动态的增减,可以根据下标直接存取元素, 链表则可以动态的进行存储分配,插入/删除数据方便,但是插入/删除数据时,需要移动其他数据,非常繁琐.?
3.28.说说ArrayList,Vector,LinkedList的存储性能和特性?
    ArrayList和Vector都是使用数组方式存储数据,此数组元素个数都大于实际存储的数据,以便增加和插入元素,都可以直接按序号索引元素,但由于插入元素时要涉及数组元素的移动,所以索引数据快而插入数据慢,Vector使用了synchroized方法(线程安全),性能比ArrayList差,LinkedList使用双向链表实现存储,按序号索引时,需要进行向前和向后遍历,插入时只需记录前后项即可,故插入快索引慢.
3.29. Set里的元素是不重复的,用什么方法来区分是否重复呢?"=="?"equals()"?他们有什么区别?
    用equals方法和HashCode方法来区分是否重复, equals方法和HashCode方法是用来判断两个对象是否是同一个对象,而"=="判断地址是否相等,用来决定引用值是否指向同一对象.
3.30.什么是线程安全?
    若一个类或一个程序提供的接口对线程来说是原子操作或者多线程之间的切换不会导致该接口的执行结果出现二义性,一般线程安全问题是由静态变量或全局变量引起的,若每个线程对这个全局变量只有读的操作,而没有写操作,则这个全局变量是线程安全的,如果多个线程同时执行写操作,就要考虑线程同步了.否则就会影响线程安全.
3.31.为什么要使用多线程编程?
    方便有效的使用处理器和用户时间
3.32.启动一个线程是用run()还是start()?
    启动一个线程使用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行,但并不意味着线程就会立马执行,run()方法可以产生必须退出的标志来停止一个线程.
3.33.sleep()和wait()有什么区别?[sleep和yield的区别]
    1)sleep()方法是线程类的方法,令此线程暂停执行指定时间,把机会留给其他线程,但仍处于监控状态,时间到后自动恢复,且不会释放对象锁,sleep()方法会进入Blocked状态,等待时间结束事件发生,才能进入Runnable状态并参与到CPU时间片
    2)而wait()是Object类的方法,调用时导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获取对象锁进入运行状态.
    3)yield方法只是让出分配给自己的CPU时间片,并立即进入Runnable状态并参与到CPU时间片的竞争中去
3.34.当一个线程进入到一个对象的synchronized方法后,其他线程是否可以记录该对象的其他方法?
    其他线程只能访问该对象的其他非同步方法!
3.35.说出你知道的线程同步方法?
    1)同步方法,public void synchronized testSynchronized(){}
    2)同步块,synchronized(obj)
3.36.同步和异步有何异同?在什么情况下使用?举例说明!
    若数据将在线程间共享,使用同步编程,而当应用程序在一个对象上调用一个方法要花很多时间,并且不希望等待方法返回时,使用异步编程.
3.37.简述synchornized和java.util.concurrent.locks.Lock的异同?
    1)相同点:都可以实现线程同步
    2)不同点:Lock比synchronized有更精确的线程语义和更好的性能,且synchronized可以自动释放锁,而Lock必须程序员手工释放,还必须在finally块中释放.
3.38.什么是线程池?(pool)
    如果在一个程序中创建大量线程,并在任务结束时销毁,会给系统带来资源的过度消耗,以及过度切换线程的危险,所以我们先创建一些线程,他们的集合称为线程池,当服务器接收到一个请求时,从线程池中取一个空闲的线程,来处理这个请求,处理完成后该线程不销毁,而是还会到线程池中去,类似与操作系统的CPU提供的时间片.
3.39.什么是Java序列化?如何实现序列化?
    所谓序列化就是一种用来处理对象流(将对象内容进行流化)的机制,可以对流化后的对象进行读写操作,需要序列化的类或对象需要实现serializable接口,而serializable接口没有需要实现的方法,implements serializable只是标注该对象可以实例化,然后用一个输出流来构造一个对象,接着用writeObject(Object obj)方法将对象写出,要恢复的话就要用输入流(反序列化)
3.40.Java中有几种类型的流?JDK为每种流提供了一些抽象类以供继承,请说出他们分别是?
    Java中只有字节流和字符流
    字节输入流的父类为:InputStream,字节输出流的父类为:OutputStream;
    字符输入流的父类为:Reader,字符输出流的父类为:Writer
3.41.字节流和字符流的区别?
    字节流是最基本的,所有InputStream和OutputStream的子类用于处理二进制数据,按字节处理的,而字符流以字符为单位读写数据的.
3.42.String str = new String("abc")创建了几个String Object?
    若在执行该代码之前已经定义了"abc"这个对象了,那么执行本代码时,创建了1个String Object(str/new String("abc")),否则创建了2个("abc"/str/new String("abc"))
3.43.说说"=="和equals()方法的区别?
    答:equals()方法判断是否为同一个对象,"=="判断索引是否指向同一个对象
3.44.数组有没有length()方法?String有没有length()方法?
    数组没有length()方法,担忧length属性,String有length()方法.
3.45.String,StringBuffer,StringBuilder的区别?
    1)String长度是不可变的,而StringBuffer是可以变的,若对字符串中的内容经常进行修改,使用StringBuffer,若最后需要String,这使用StringBuffer的toString()方法
    2)StringBuffer是线程安全的,但应优先使用StringBuilder(速度快)
3.46.简述class.forName(String className)的功能?
    若没有加载className对应的类,却想要加载这个类,然后返回与带有给定字符串名的类或接口相关联的Class对象.?
3.47.谈谈对反射技术的理解?
    反射技术是Java的一种自我管理机制,通过反射可以实现:
        1)在运行时判断任意对象所属的类
        2)在运行时构造任意一个类的对象,
        3)在运行时判断一个对象所具有的成员变量和方法
        4)在运行时调用任意一个对象的方法
3.48.如何获取当前日期?
    Date date = new Date();Calender calender = Calender.getInstance();
3.49.如何将日期格式转换成自己想要的格式?
    SimpleDateFormate sdf = new SimpleDateFormate("yyyyMMdd");
3.50.什么是标识接口(Mark InterFace)?它与接口有什么区别?列举你知道的标识接口.
    标识接口是没有任何属性和方法的接口
3.51.Java类实现序列化的方法?在Collection框架中,实现比较需要实现什么接口?
    1)Java类实现序列化需要实现java.io.Serializable接口
    2)需要实现Comparable或者Comparator接口.
3.52.80页
3.53.
3.54.
四.数据库
4.1.什么是关系型数据库管理系统?
    由关系,数据,数据之间的约束三者组成的数据模型
4.2.简述几种主流的数据库以其商家
    1)Oracle:甲骨文
    2)MySQL:sun已被甲骨文收购
    3)DB2:IBM
    4)SQLServer:微软
4.3.简述结构化查询语言的分类?
    1)DDL:数据定义语言
    2)DML:操作语言
    3)TCL:事务控制语言
    4)DQL:数据查询语言
    5)DCL:数据控制语言
4.4.简述date和timestamp的区别?89
4.5.简述索引的原理以及创建索引的意义?
    索引是对表的一列或多列进行排序的结构,若一个表中的一个或多个列经常被作为搜索关键字,建议为该列创建索引,索引提供指针以指向存储在表中指定列的数据值,类似于书目录的作用.
4.6.简述视图的意义?
    视图的意义在于:1)简化复杂的查询,对某些复杂的查询作为视图,2)限制数据访问,视图本质上就是一句SELECT语句,所以当访问视图时,只能访问到视图对应的列,而基表中的数据是不会被访问的,很好的对其他列起到了安全和保密的作用.
4.7.触发器分为事前触发器和事后触发器,他们有什么区别?语句级触发和行级触发有何区别?
    1)事前触发器在事件之前被触发,事后触发器在事件之后触发,语句级触发器可以在语句执行前或者后执行,而行级触发器所影响的每一行都会触发一次,2)事前触发器用于验证一些条件或者做一些准备工作,在数据保存之前触发,语句级触发器在执行INSERT时,不管有多少句都是在最后触发一次,行级触发器在执行UPDATE时,没条UPDATE都会执行一次触发器
4.8.SQL语句中exists和in有什么区别?SQL语句优化有那些?
    两者区别如下:
    1)exists是用循环(loop)的方式,有outer表的记录数决定循环次数,对exists的影响最大,所以外表的记录少,适合用exists;
    2)in先执行子查询,子查询的返回结果去重后,在执行主查询,所以子查询的结果越少,使用in
    SQL语句的优化:
    1)避免使用非操作符,当在索引列上使用NOT,<>等非操作符时,数据库管理系统不会使用索引;
    2)避免对查询列的操作;
    3)避免不必要的数据类型转换
    4)增加查询的范围控制;
    5)合理使用in和exists:
    6)尽量去掉<>的使用,改为a>'';
    7)去掉WHERE子句中的IS NULL和IS NOT NULL,改为A>0或A>''
    8)尽量不使用前导模糊查询(like '%aaa%')
    9)SELECT语句中避免使用*
    10)规范SELECT,UPDATE,DELETE,FROM等大小写要一致,
4.9.说说你对数据库事务隔离级别的理解?
    数据库事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度,两个事务同时对数据库访问时,可能出现以下错误:
    1)幻读,2)不可重复读取,3)脏读
    数据库提供了以下几种事务隔离级别:
    1)READ UNCOMMITTED,2)READ COMMITTED,3)REPEATABLE READ,4)SERIALIZABLE

 幻读不可重复读取脏读
READ UNCOMMITTED
READ COMMITTED 
REPEATABLE READ  
SERIALIZABLE   

4.10.条件查询时,速度变慢,如何优化?
    1)为经常出现在WHERE子句中的列创建索引,为经常出现在ORDER BY和DISTINCT后的列创建索引
    2)减少表的关联
    3)优化SQL,不让SQL查全表尽量使用索引,数据量大的排在前面
    4)简化查询字段
4.11.说明数据库主键,外键的作用?
    主键:保证设置为主键的列非空且唯一,系统自动为主键列创建索引
    外键:外键必须匹配父表中已有的值,与另一张表的列建立引用关系
4.12.索引的优点和缺点?
    优点:
    1)创建唯一索引,保证数据库表中的每一行数据的唯一性
    2)加快数据的检索速度
    3)加速表与表之间的连接,
    4)
    5)
    缺点:
    1)创建和维护索引费时
    2)占用物理空间
    3)对表数据增删查改时,也需要对索引进行动态维护
    4)若创建了不适合创建索引的列,不会提高性能
4.13.主键和索引的区别?
    1)主键是为了标识数据库的唯一性,不允许重复,不允许为空,一个特殊的索引
    2)数据表中只能有一个主键,可以有多个索引
    3)使用主键时,系统会自动创建主索引,也可以在非主键上创建索引
    4)索引可以提高查询速度,类似于书的目录
    5)主键可以由几个字段组成,称为复合主键,同时主键也是唯一索引
    6)唯一索引表示该索引值唯一,索引可由一个或多个字段组成,一个数据表可以有多个唯一索引
4.14.使用索引查询一定可以提高数据库的性能吗?为什么?
    不一定,比如创建了不合适的索引时,就不会提高性能
4.15.什么叫视图?
    是一个续表,由子查询的结果提供,
4.16.数据库事务是什么,并分别说明ACID?    
    事务:指单个逻辑工作单元执行的一系列操作,事务处理可保证除非事务性单元内的所有操作,都成功完成,简化错误恢复并使应用程序更加可靠
    ACID:
    1)原子性(Atomicity),2)一致性(Consistency),
    3)隔离性(Isolation),4)持久性(Durability)
4.17.简述TRUNCATE,DROP,DELETE的区别?
    1)TRUNCATE,删除表中数据不对表结构进行操作,自动COMMIT,数据不可回滚
    2)DELETE,属于数据操作语言(DML),需要手动COMMIT,
    3)DROP,属于数据定义语句(DDL),可以自动提交,用于删除数据表的结构,索引,触发器,约束
4.18.存储过程和触发器的区别?
    
4.19.存储过程和函数的区别?

五.JDBC
5.1.Java数据库编程包含哪些类和接口?Java数据库编程的基本过程是什么?
    Java数据库编程包含Connection,ResultSet,PreparedStatement,Statement,DriverManager
    其基本过程如下:
    1)注册驱动程序;2)建立连接;3)创建Statement;4)执行SQL语句;5)处理结果集;6)关闭连接;
5.2.Statement,PreparedStatement,CallableStatement的区别?
    1)Statement是PreparedStatement和CallableSatatement的父类
    2)Statement:直接发送SQL到数据库,不进行预编译,而PreparedStatement会进行预编译,当重复调用时,会直接调用预编译好的SQL语句,所以PreparedStatement的性能优于Statement
    3)PreparedStatement:在执行SQL时,会对传入的参数进行数据类型的转换,以保证数据格式和数据库底层的数据类型保持一致
    4)CallableStatement:适用与执行存储过程
5.3.Java中如何进行事务的处理?
    Connection中提供了三个事务处理方法:
    setAutoCommit(boolean autoCommit):设置是否自动提交事务
    commit():事务提交
    rollBack():事务回滚
5.4.写一段JDBC连接本机MYSQL数据库的代码
    Class.forName("com.mysql.jdbc.Driver");
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/lt",//
                                                    "root",//
                                                 "liutao");//
XML
5.5.xml文档定义有那几种形式,有何区别?
    两种,分别是DTD和Scheme,区别如下:
    1)Scheme是标准的xml文件,而DTD是使用自己特殊的语法,
5.6.Java中常用的xml解析技术有哪些,区别是什么?
    1)DOM解析
    2)SAX解析
六.WEB
6.1.145
七.Servlet和JSP
八.Ajax和JQuery
九.Spring
十.MyBatis
十一.Struts
十二.Hibernat











  
    











参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

loverGTO

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值