Java基础面试题汇总(52道题)

栏目:远程教育  时间:2023-01-13
手机版

  编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。

  为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。

  Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。

  

  JVM

  Java Virtual Machine是Java虚拟机,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。

  JRE

  Java Runtime Environment包括Java虚拟机和Java程序所需的核心类库等。核心类库主要是java.lang包:包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包

  如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

  JDK

  Java Development Kit是提供给Java开发人员使用的,其中包含了Java的开发工具,也包括了JRE。所以安装了JDK,就无需再单独安装JRE了。其中的开发工具:编译工具(javac.exe),打包工具(jar.exe)等

  简单易学(Java语言的语法与C语言和C++语言很接近)

  面向对象(封装,继承,多态)

  平台无关性(Java虚拟机实现平台无关性)

  支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的)

  支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

  健壮性(Java语言的强类型机制、异常处理、垃圾的自动收集等)

  安全性

  lambada表达式

  函数式接口

  方法引用

  默认方法

  Stream API

  Optional

  Date Time API(如LocalDate)

  重复注解

  Base64

  JVM的新特性(如元空间Metaspace代替持久代)

  可以从它们的底层数据结构、效率、开销进行阐述哈

  ArrayList是数组的数据结构,LinkedList是链表的数据结构。

  随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于索引(index)的数据结构,可以直接映射到。

  插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。

  LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。

  作用范围:重写的作用范围是父类和子类之间;重载是发生在一个类里面

  参数列表:重载必须不同;重写不能修改

  返回类型:重载可修改;重写方法返回相同类型或子类

  抛出异常:重载可修改;重写可减少或删除,一定不能抛出新的或者更广的异常

  访问权限:重载可修改;重写一定不能做更严格的限制

  抽象类要被子类继承,接口要被子类实现。

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

  抽象类中可以有普通成员变量,接口中没有普通成员变量,它的变量只能是公共的静态的常量

  一个类可以实现多个接口,但是只能继承一个父类,这个父类可以是抽象类。

  接口只能做方法声明,抽象类中可以作方法声明,也可以做方法实现。

  抽象级别(从高到低):接口>抽象类>实现类。

  抽象类主要是用来抽象类别,接口主要是用来抽象方法功能。

  抽象类的关键字是abstract,接口的关键字是interface

  静态代理中代理类在编译期就已经确定,而动态代理则是JVM运行时动态生成,静态代理的效 率相对动态代理来说相对高一些,但是静态代理代码冗余大,一单需要修改接口,代理类和委 托类都需要修改。

  JDK动态代理只能对实现了接口的类生成代理,而不能针对类。

  CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。因为是继承, 所以该类或方法最好不要声明成final。

  按位与, a&b 表示把a和b都转换成二进制数,再进行与的运算;

  &和&&都是逻辑运算符号,&&又叫短路运算符

  逻辑与,a&& b ,a&b 都表示当且仅当两个操作数均为 true时,其结果才为 true,否则为false。

  逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true,整个表达式的值才是true。但是,&&之所以称为短路运算,是因为如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。

  Java中的流分为两种:一种是字节流,另一种是字符流。

  IO流分别由四个抽象类来表示(两输入两输出):InputStream,OutputStream,Reader,Writer。

  final 修饰的类叫最终类,该类不能被继承。

  final 修饰的方法不能被重写。

  final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

  等于 -1。

  String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

  不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

  多线程最大的好处就是:

  更好地利用CPU

  简单的程序设计

  程序更多的响应

  多任务下CPU资源分配公平性

  接口响应时间、错误率和Tps

  arraylist底层是 动态数据,查询快和插入数组最后面较快。

  注意:数据插入非尾部,涉及到下标index移位linkedlist底层是链表,插入和查询头部元素较快。

  注意:linkedlist如果查询头部元素还是比较快的。

  答:String、StringBuffer、StringBuilder可以操作拼接字符串

  区别:String是不可变的对象,对每次对String类型的改变时都会生成一个新的对象,StringBuffer和StringBuilder是可以改变对象的。

  对于操作效率:StringBuilder > StringBuffer > String

  对于线程安全:StringBuffer 是线程安全,可用于多线程;StringBuilder 是非线程安全,用于单线程

  答:==是操作符,是比较两个对象的地址或基本类型,equals是比较两个对象的内容,属于Object里的方法。

  答:不对!hashCode()相同,不代表两个对象就相同。hashCode值是从hash表中得来的,hash是一个函数,该函数的实现是一种算法,通过hash算法算出hash值,hash表就是hash值组成的,一共有8个位置。

  1)、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。2)、如果两个对象不equals,他们的hashcode有可能相等。3)、如果两个对象hashcode相等,他们不一定equals。4)、如果两个对象hashcode不相等,他们一定不equals。

  答:为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型,比如int的包装类就是Integer,Java 为每个原始类型提供了包装类型:- 原始类型: boolean,char,byte,short,int,long,float,double- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

  1)、抽象类和接口都不能够实例化、不能有构造方法

  2)、接口用interface来修饰

  3)、类能实现一个或多个接口,但只能继承一个抽象类

  4)、接口里的方法只能是抽象方法、类方法或者默认方法,接口里的方法不能有方法实现,但类方法、默认方法都必须要实现。

  5)、用抽象类是为了重用。减少编码量,降低耦合性。

  答:面向对象的三个基本特征:封装、继承、多态

  1)、封装(英语:Encapsulation)是指,一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。

  2)、继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等,继承可以理解为一个对象从另一个对象获取属性的过程。

  3)、多态是同一个行为具有多个不同表现形式或形态的能力。多态性是对象多种表现形式的体现。比如我们说"宠物"这个对象,它就有很多不同的表达或实现,比如有小猫、小狗、蜥蜴等等。那么我到宠物店说"请给我一只宠物",服务员给我小猫、小狗或者蜥蜴都可以,我们就说"宠物"这个对象就具备多态性。

  答:- ClassNotFoundException(类找不到异常)- ClassCastException (类转换异常)- IllegalArgumentException (非法参数异常)- IndexOutOfBoundsException (下标越界异常)- NullPointerException (空指针异常)- SecurityException (安全异常)

  答:集合,线性结构(数组,队列,链表和栈),树形结构,图状结构。

  答:Comparable 接口用于定义对象的自然顺序,是排序接口,而 comparator 通常用于定义用户定制的顺序,是比较接口。

  答:JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

  1)、方法区(method):被所有的线程共享。方法区包含所有的类信息和静态变量。

  2)、堆(heap):被所有的线程共享,存放对象实例以及数组,Java堆是GC的主要区域。

  3)、栈(stack):每个线程包含一个栈区,栈中保存一些局部变量等。

  4)、程序计数器:是当前线程执行的字节码的行指示器。

  答:Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。

  如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

  当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

  sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。

  wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

  方法的重写 Overriding 和重载 Overloading 是 Java 多态性的不同表现。重写 Overriding是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。

  List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存 key-value 值,value 可多值。

  答:Java程序会被编译成字节码组成的class文件,这些字节码可以运行在任何平台,因此Java是平台独立的。

  答:程序能正常编译。运行时会抛NoSuchMethodError异常。

  答:GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

  答:全局变量是全局可见的,Java不支持全局可见的变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突。

  答:Java参数都是进行传值。对于对象而言,传递的值是对象的引用,也就是说原始引用和参数引用的那个拷贝,都是指向同一个对象。

  答:get:1、请求的参数会附加在URL之后,多个参数用 & 连接。2、因为URL的长度限制,get 方式传输的数据大小有所限制。3、安全性低,因为传输的数据会显示在请求的URL中。post:1、将请求参数放置在 HTTP 数据包,发送给服务器。2、传送的数据量比较大3、安全性较高

  答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,然后在调用静态方法时可能对象并没有被初始化。

  答:可以。当程序运行的时候,我们会指定运行的类名。JVM只会在你指定的类中查找main方法。因此多个类拥有main方法并不存在命名冲突的问题。

  答:反射是指在运行时能查看一个类的状态及特征,并能进行动态管理的功能。这些功能是通过一些内建类的反射API提供的,比如Class,Method,Field, Constructors等。使用的例子:使用Java反射API的getName方法可以获取到类名。

  答:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?如果你重写了equals,比如说是基于对象的内容实现的,而保留hashCode的实现不变,那么很可能某两个对象明明是“相等”,而hashCode却不一样。这样,当你用其中的一个作为键保存到hashMap、hasoTable或hashSet中,再以“相等的”找另一个作为键值去查找他们的时候,则根本找不到。

  答:Final可以修饰类,修饰方法,修饰变量。

  修饰的类叫最终类。该类不能被继承。修饰的方法不能被重写。修饰的变量叫常量,常量必须初始化,一旦初始化后,常量的值不能发生改变。

  答:1.通过hashCode可以很快的查到小内存块。

  2.通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。

  答:Super表示当前类的父类对象

  This表示当前类的对象

  答:Cookie:是把数据保存在浏览器本地,并随着每一次请求发送到服务器。

  Session:是把用户数据保存在服务器端。

  答:1、IO是面向流的,NIO是面向缓冲区的。2、IO是阻塞的,NIO是非阻塞的。3、NIO有选择器机制,可以让一个线程来监视多个IO通道。NIO的优点:1、不需要使用 read() 或者 write() 就可以处理文件内容。2、NIO的处理效率很快。

  答:多态是指允许不同子类型的对象对同一消息作出不同的响应。

  多态包括编译时多态和运行时多态。

  方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。

  运行时多态是面向对象最精髓的东西,要实现运行时多态需要:

  方法重写:子类继承父类并重写父类中已有的或抽象的方法。

  对象造型:将父类型的引用指向子类型的对象,这样父类的引用调用同样的方法时即会根据子类对象的不同而表现出不同的行为。

  答:Integer类内部有一个staitic 的Integer数组,存储的是一些已经完成初始化的Integer对象,一般值为(-128~127),若用==比较,则有时候会因为值不在缓存中而返回false,所以应该用equals比较。

  拆箱:把包装类型转成基本数据类型

  装箱:把基本数据类型转成包装类型

  接口中声明全是public static final修饰的常量

  接口中所有方法都是抽象方法

  接口是没有构造方法的

  接口也不能直接实例化

  接口可以多继承

上一篇:40多岁生命线到哪了,生命线的长短真和寿命有关吗?
下一篇:2022届高考生注意!国内5所不错的军校,录取分数低有远大前途

最近更新远程教育