• Java基础100问


    1、重写与重载的区别

    重载Overload:在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。它的特点就是与返回值类型无关,只看参数列表。

    重写Override:子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中定义的方法,这相当于把父类中定义的那个完全相同的方法给覆盖掉了。

    2、抽象类和接口的区别

    a抽象类通过 public abstract class 抽象类名字 {成员变量1…n; puclic abstract 返回类型 抽象方法名1…n(参数类型、参数名字1…n){};}来定义。

         接口通过public interface 接口名字{public static final 成员变量1…n;public abstract 返回类型 方法名1…n(参数类型、参数名字1…n){};}来定义。

    b、抽象类可以有构造方法,接口不能有构造方法。

    c、抽象类可以有普通成员变量,接口不能有普通成员变量(变量修饰符是public static final)。

    d、抽象类可以包含非抽象的普通方法,接口中的所有方法必须是抽象的。

    e、抽象类中的抽象方法的访问类型可以是public、ptotected,接口的抽象方法只能是public,默认的就是public abstract。

    f、抽象类中可以包含静态方法,接口不能包含静态方法。

    g、抽象类和接口都可以有静态的成员变量,但抽象类的静态成员变量的访问类型可以是任意的,而接口的静态成员变量的访问类型只能是 public static final.

    h、一个类只能继承一个抽象类,但可以实现多个接口。

    3、编写出一个java 类为 Singleton 的例子(单例)

    //把 Singleton 实例放在一个静态内部类中,这样就避免了静态实例在 Singleton 类加载的时候就创建对象,
    // 并且由于静态内部类只会被加载一次,所以这种写法也是线程安全的。
    public class Singleton {
        private static class Holder{
            private static Singleton INSTANCE = new Singleton();
        }
        public Singleton()
        {
    
        }
        public static Singleton getInstance()
        {
            return  Holder.INSTANCE;
        }
    }

    4、写出java语言中public, private ,protected三个关键字的区别

    public 公有的,可以被任意类访问

    private 私有的,只能在本类里面访问

    protected 受保护的,只能在本类和子类里面访问

    5、列举出java 的三个特性并说明?

    1. 封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
    2. 继承:继承就是子类继承父类的特征和行为,使的子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使的子类具有父类相同的行为。
    3. 多态:多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。继承是多态的基础。

    6、列出你在编程过程中常见的异常,以及处理方式。

    1. java.lang.nullpointerexception 解释是"程序遇上了空指针",就是调用了未经初始化的对象或者是不存在。
    2. java.lang.classnotfoundexception 解释是"指定的类不存在",这里主要考虑一下类的名称和路径是否正确即可。
    3. java.lang.arrayindexoutofboundsexception 解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围。
    4. FileNotFoundException 解释是“文件未找到异常”。
    5. IOException 解释是”输入输出流异常“。
    6. NoSuchMethodException 解释是"方法未找到异常"

    7、说出ArrayList,Vector, LinkedList的存储性能和特性

    ArrayList 和Vector他们底层的实现都是一样的,都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。

    Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。

    LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。    

    8、sleep() wait() 有什么区别?

    1,sleep方法是Thread类的静态方法,wait()是Object超类的成员方法

    2,sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。

    在调用sleep()方法的过程中,线程不会释放对象锁。

    而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备

    3,sleep方法需要抛异常,wait方法不需要

    4,wait方法只能在同步方法和同步代码块中使用

    9、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么。

    java中多线程的实现方法有两种:1.继承thread类;2.实现runnable接口。

    在线程中实现同步的方法主要有三种:1.用synchronized修饰需要同步的方法;2. 用synchronized块包围需要同步的语句;3.使用java.util.concurrent包中的各种同步锁

    10、String StringBufferStringBuilder的区别?

    String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
    StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。
    StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。

    11、Collection Collections的区别。

    java.util.Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。
    Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
    java.util.Collections是一个包装类(工具类/帮助类)。它包含有各种有关集合操作的静态多态方法。
    此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。

    12、HashMapHashtable的区别

     1、线程安全

    Hashtable 是线程安全的,HashMap 不是线程安全的。

    Hashtable 所有的元素操作都是 synchronized 修饰的,而 HashMap 并没有。

    2、性能方面

    既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。

    3、空值问题NULL

    Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null

    4、继承的父类不同

    Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

    5、遍历方式不同

    HashtableHashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

    HashMapIteratorfail-fast迭代器。当有其它线程改变了HashMap的结构(增加,删除,修改元素),将会抛出ConcurrentModificationException

    不过,通过Iteratorremove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM

    JDK8之前的版本中,Hashtable是没有fast-fail机制的。在JDK8及以后的版本中 ,Hashtable也是使用fast-fail的。

    6、初始容量不同

    Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1n为上一次的长度)

    HashMap的初始长度为16,之后每次扩充变为原来的两倍

    创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。

    7、计算哈希值的方法不同

    为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置

    Hashtable直接使用对象的hashCodehashCodeJDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用除留余数发来获得最终的位置。 然而除法运算是非常耗费时间的。效率很低

    HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。

    13、final, finally, finalize的区别

    final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)

    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终一定被执行,经常被用在需要释放资源的情况下。

    finalizeObject类中的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收,例如关闭文件等。

    需要注意的是,一旦垃圾回收器准备好释放对象占用的空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存

    14、什么是反射API?它是如何实现的?

    反射是指在运行时能查看一个类的状态及特征,并能进行动态管理的功能。

    这些功能是通过一些内建类的反射 API 提供的,比如 Class,Method,Field,Constructors 等。

    使用的例子:使用Java反射API的getName方法可以获取到类名。

    15、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?及其原因?

      可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同。

      然而知其然,更要知其所以然,这样才能够让我们更加深刻的去理解。

      问题一:为什么类之中只能有一个public的类?

      每个编译单元(文件)都只有一个public 类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public 类,编译器就会报错。 并且public类的名称必须与文件名相同(严格区分大小写)。 当然一个编译单元内也可以没有public类。在PUBLIC类中找程序的入口 main函数 你想想如果很多PUBLIC 类,那程序从何运行!

      问题二:public 类的名称为什么要与文件名相等?

      首先Java是被解释执行的。它在运行时并不是将所有的class文件全都放到内存中。而是在遇到import的时候才去相应的文件目录找相应的class文件。对于一个public类,它是可以被项目中任何一个类所引用的,只需在使用它前import一下它所对应的class文件即可。将类名与文件名一一对应就可以方便虚拟机在相应的路径(包名)中找到相应的类的信息。如果不这么做的话,就很难去找,而且开销也会很大。

  • 相关阅读:
    ngx-bootstrap使用04 carousel组件
    ngx-bootstrap使用03 Alerts组件、利用Object.assign复制对象
    ngx-bootstrap使用02 Accordion组件的使用
    ngx-bootstrap使用01 安装ngx-bootstrap和bootstrap及其使用、外部样式引入
    SpringBoot11 读取properties文件、发送邮件
    SpringBoot10 整合JSP
    SpringBoot09 自定义servlet、注册自定义的servlet、过滤器、监听器、拦截器、切面、webmvcconfigureradapter过时问题
    红帽系统制作yum本地源
    利用python数据分析panda学习笔记之基本功能
    利用python数据分析panda学习笔记之DataFrame
  • 原文地址:https://www.cnblogs.com/TaoYuanJieYi/p/11951092.html
Copyright © 2020-2023  润新知