当前位置: 首页 > biancheng >正文

Java基础面试题1

instanceof的具体应用
instanceof的具体应用

枚举的应用

锁:锁

JAVA Lambda表达式:JAVA Lambda表达式

设计模式:设计模式

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

3、JVM、JRE和JDK的关系

在这里插入图片描述

JDK : (Java开发工具包)。JDK是整个JAVA的核心,包括了Java运行环境(JRE),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。
JRE:(java运行时环境)。也就是我们说的JAVA平台,所有的Java程序都要在JRE下才能运行。包括JVM和JAVA核心类库和支持文件。与JDK相比,它不包含开发工具——编译器、调试器和其它工具。
JVM:Java Virtual Mechinal(JAVA虚拟机)。JVM是JRE的一部分,它是一个虚构出来的计算机,是通过仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 的主要工作是解释自己的指令集(即字节码)并映射到本地的 CPU 的指令集或 OS 的系统调用。

4、Java语言有哪些特点?
简单易学(Java语言的语法与C语言和C++语言很接近)

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

平台无关性(Java虚拟机实现平台无关性:不同的OS(操作系统)都有与之对应的JVM)

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

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

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

安全性

5、Java 8的接口新增了哪些特性?
lambada表达式

Lambda 表达式是一个匿名函数,是一种没有声明的方法,即没有访问修饰符,返回值声明和名称,但它有参数列表、函数主体、返回类型。
Lambda 表达式举例:
(int a, int b) -> {  return a + b; }
创建对象
()-> new apple();

//使用Lambda
Runnable r1 = () -> System.out.println("Hello World 1");
//打印 "Hello World 1"

函数式接口

方法引用

默认方法

Stream API

Optional

Date Time API(如LocalDate)

重复注解

Base64

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

6、ArrayList和LinkedList有什么区别?

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

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

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

8、抽象类和接口有什么区别?
抽象类要被子类继承,接口要被子类实现。

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

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

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

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

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

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

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

9、静态代理和动态代理的区别?

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

10、JDK动态代理和CGLIB动态代理的区别

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

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

12、Java中IO流分为几种?

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

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

13、final 在 java 中有什么作用?

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

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

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

14、java 中的 Math.round(-1.5) 等于多少?

等于 -1。

15、String 属于基本的数据类型吗?
String 不属于基本类型,基本类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

16、String str="i"与 String str=new String(“i”)一样吗?

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

17、多线程有什么好处?

多线程最大的好处就是:

更好地利用CPU
简单的程序设计
程序更多的响应
多任务下CPU资源分配公平性

19、arraylist和linkedlist区别?

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

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

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

20、java 中操作字符串都有哪些类?它们之间有什么区别?

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

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

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

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

21、== 和 equals 的区别是什么?

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

22、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

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

因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

23、int和Integer有什么区别,为什么要使用包装类?

数据类型不同:int 是基础数据类型,而 Integer 是包装数据类型;
默认值不同:int 的默认值是 0,而 Integer 的默认值是 null;
内存中存储的方式不同:int 在内存中直接存储的是数据值,而 Integer 实际存储的是对象引用,当 new 一个 Integer 时实际上是生成一个指针指向此对象;
实例化方式不同:Integer 必须实例化才可以使用,而 int 不需要;
变量的比较方式不同:int 可以使用 == 来对比两个变量是否相等,而 Integer 一定要使用 equals
来比较两个变量是否相等。

答:为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型,比如int的包装类就是Integer,Java 为每个原始类型提供了包装类型:

  • 原始类型: boolean,char,byte,short,int,long,float,double
  • 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

24、抽象类(abstract class)和接口(interface)有什么区别?

1)、抽象类和接口都不能够实例化、不能有构造方法
2)、接口用interface来修饰
3)、类能实现一个或多个接口,但只能继承一个抽象类
4)、接口里的方法只能是抽象方法、类方法或者默认方法,接口里的方法不能有方法实现,但类方法、默认方法都必须要实现。
5)、用抽象类是为了重用。减少编码量,降低耦合性。

25、面向对象的三个特征是什么?什么是 封装、继承、多态?

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

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

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

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

26、列出一些你常见的运行时异常?

答:- ClassNotFoundException(类找不到异常)

  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • IndexOutOfBoundsException (下标越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)

27、常用数据结构

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

28、Comparator 与Comparable 有什么不同?

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

29、Java 中堆和栈有什么区别?

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

30、JVM分为哪些区,每一个区是干嘛的?

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

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

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

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

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

32、同步和异步有何异同,在什么情况下分别使用他们?举例说明

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

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

33、sleep()和 wait()的区别?

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

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

34、Java 中实现多态的机制是什么?

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

35、List、Map、Set 三个接口,存取元素时,各有什么特点?

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

37、如果去掉了main方法的static修饰符会怎样?

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

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

40、Java支持哪种参数传递类型?

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

41、get 和 post请求的区别

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

42、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

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

43、程序中可以允许多个类同时拥有都有main方法吗?

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

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

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

47、为什么需要hashCode?

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

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

48、Super与this表示什么?

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

This表示当前类的对象

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

51、谈谈对Java中多态的理解?

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

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

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

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

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

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

52、Integer内部缓存?

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

53、什么是拆装箱?

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

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

54、接口有什么特点?

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

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

接口是没有构造方法的

接口也不能直接实例化

接口可以多继承

相关文章:

  • 牛客练习赛#84 F 莫比乌斯反演+杜教筛+技巧+斐波那契数列和gcd的结论+矩阵快速幂
  • ZZNUOJ_用C语言编写程序实现1342:支配值数目(附完整源码)
  • java毕业设计后勤管理系统餐饮评价监督系统(附源码、数据库)
  • 前端基础学习笔记
  • 【TS】联合类型--类型断言--类型推断
  • 谈笑风声的秘密
  • QT影城网上售票系统
  • NetCDF数据在ArcMap中的使用
  • 打怪升级(考验思路)
  • 持续精进,改变自己