• Java面试基础知识(1)


    1、final, finally, finalize的区别
    final:修饰符(关键字)如果一个类被声明为final,没有子类也不能被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后不可修改。被声明为final的方法也同样只能使用,不能重载
    finally:再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
    finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
     
    2、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)
     匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
     
    3、&和&&的区别。
     &是位运算符。&&是布尔逻辑运算符。&&左边为真右边就不执行了,&一直执行完毕。
     
    4、HashMap和Hashtable的区别。
    都属于Map接口的类,以键值对的形式存储数据。
    HashMap 无序,它允许为空
    Hashtable 类似于 HashMap,但是不允许空,它也比 HashMap 慢,因为它是同步的。
     
    5、ArrayList和Vector的区别
    同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
    数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
     
    6、Collection 和 Collections的区别。
    Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
    Collection是集合类的上级接口,继承与他的接口主要有Set 和List。
     
    7、GC是什么? 为什么要有GC? 。
    GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。要请求垃圾收集,可以调用下面的方法之一:System.gc() Runtime.getRuntime().gc()
    System.gc();
    Runtime.getRuntime().gc();

    8、String s = new String("xyz");创建了几个String Object?

    两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

     
    9、Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
    Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
     
    10、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
     
    11、sleep() 和 wait() 有什么区别?
    他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步锁  
    还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果时间不到你只能调用interreput()来强行打断;wait()可以用notify()直接唤起.
    sleep是Thread类的静态方法。
    wait是Object的方法,也就是说可以对任意一个对象调用wait方法,调用wait方法将会将调用者的线程挂起,直到其他线程调用同一个对象的notify方法才会重新激活调用者
     
    12、数组有没有length()这个方法? String有没有length()这个方法?
    数组没有length()这个方法,有length的属性。  String有有length()这个方法。
     
    13、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
    方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重(Overloading)。Overloaded的方法是可以改变返回值的类型。
     
    14、"=="和equals方法究竟有什么区别?
    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
    equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
    String a=new String("foo");
    String b=new String("foo");
    两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
     
    15、error和exception有什么区别?
    error 表示很难恢复的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况
    Exception表示程序需要捕捉和处理的的异常;
    Error表示系统级别的错误和程序无需处理的。
     
    16、List, Set, Map是否继承自Collection接口?  
      List,Set是     Map不是
     
    17、abstract class和interface有什么区别?
    声明方法的存在而不去实现它的类被叫做抽象类(abstract class)(只声明不实现,在子类实现。可以有实现的方法和私有的方法)
    接口(interface)是抽象类的变体。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。某个类实现了接口,就必须实现接口里的所有方法。
    1.抽象类可以有构造方法,接口中不能有构造方法。
    2.抽象类中可以有普通成员变量,接口中没有普通成员变量
    3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
    4. 抽象类中的抽象方法的访问类型可以是public,protected和默认,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
    5. 抽象类中可以包含静态方法,接口中不能包含静态方法
    6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
    7. 一个类可以实现多个接口,但只能继承一个抽象类。
     
    18、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
    接口可以继承接口。抽象类可以实现(implements)接口,抽象类可以继承实体类,但前提是实体类必须有明确的构造函数。
     
    19、构造器Constructor是否可被override?
    构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
     
    20、是否可以继承String类?  
     String类是final类故不可以继承。
     
    21、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
    不能,一个对象的一个synchronized方法只能由一个线程访问。
     
    22、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
    会执行,在return前执行。
     
    23、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
     不对,有相同的hash code。(先判断hashcode如果hashcode相等再判断equals,所以如equals相等那么hashcode一定相等)
     
    24、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
     
    25、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
    switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
     
    26、String与StringBuffer的区别。
    String的长度是不可变的,StringBuffer的长度是可变的。StringBuffer内容是可以修改的,String是不可修改的修改后就产生一个新的对象。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
    1.如果要操作少量的数据用 String
    2.单线程操作字符串缓冲区 下操作大量数据 StringBuilder
    3.多线程操作字符串缓冲区 下操作大量数据 StringBuffer(线程安全,速度比StringBuilder慢)
     
    27、int 和 Integer 有什么区别
    Java 提供两种不同的类型:引用类型和原始类型(或内置类型),Int是java的原始数据类型,Integer是java为int提供的封装类。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关
     
    28、说出ArrayList,Vector, LinkedList的存储性能和特性
    ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
     
    29、heap和stack有什么区别
    stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
    stack空间有限,heap的空间是很大的自由区。
    在Java中,若只是声明一个对象,则先在栈内存中为其分配地址空间,若再new一下,实例化它,则在堆内存中为其分配地址。
    如:Object a =null; 只在栈内存中分配空间
           Object b =new Object(); 则在堆内存中分配空间
     
    30、静态变量和实例变量的区别?
    static i = 10; //常量
    class A a;  a.i =10;//可变
     
    31、什么是java序列化,如何实现java序列化?
    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
    序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream( 对象流)对象,接着使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即 保存其状态),要恢复的话则用输入流。
     
    32、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
    字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
     
     33、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
    如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
     
    34、请说出你所知道的线程同步的方法。
    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
     
    35、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
    多线程有两种实现方法,分别是继承Thread类与实现Runnable接口,同步的实现方面有两种,分别是synchronized,wait与notify
     
    36、线程的基本概念、线程的基本状态以及状态之间的关系
    线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。 Java中的线程有四种状态分别是:运行、就绪、挂起、结束
     
    37、简述synchronized和java.util.concurrent.locks.Lock的异同
    主要相同点:Lock能完成synchronized所实现的所有功能
    主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
     
    38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收
    对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方 式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些 对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java 语言规范并不保证GC一定会执行。
     
    39、运行时异常与一般异常有何异同
    Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
     
     40、Java中的异常处理机制的简单原理和应用
    当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发N ullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。
     
    41、编程题: 写一个Singleton出来。
    Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
    一般Singleton模式通常有几种种形式:
     第一种形式:
    1 public class Singleton {
    2     private Singleton(){}
    3 private static Singleton instance = new Singleton();
    4 public static Singleton getInstance() {
    5 return instance;
    6 }}
    View Code
    第二种形式:
    1 public class Singleton {
    2   private static Singleton instance = null;
    3  
    4   public static synchronized Singleton getInstance() {
    5   if (instance==null)
    6     instance=new Singleton();
    7 return instance;   
    8 }
    9 }
    View Code
     
  • 相关阅读:
    python使用matplotlib的savefig保存时图片保存不清晰以及不完整的问题
    EventBus 讲解挺详细的例子
    webpack构建优化的一些点
    webpack tree-shaking 优化
    vue 自定义指令示例 v-prop
    webpack loader 开发实战 px-rpx-vw-loader
    Google商店
    前端 机器学习 pipcook
    object-fit 设置背景(内容)填充
    postMessage iframe 跨域通信
  • 原文地址:https://www.cnblogs.com/zhangjinru123/p/7224548.html
Copyright © 2020-2023  润新知