问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java基础面试题有哪些?

发布网友 发布时间:2022-04-23 19:17

我来回答

3个回答

懂视网 时间:2022-05-03 03:08

1. 内存模型以及分区,需要详细到每个区放什么。
JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面,
class 类信息常量池(static 常量和 static 变量)等放在方法区
new:
方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字
节码)等数据
堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要
在堆上分配
栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操
作数栈,方法出口等信息,局部变量表存放的是 8 大基础类型加上一个应用类型,所
以还是一个指向地址的指针
本地方法栈:主要为 Native 方法服务
程序计数器:记录当前线程执行的行号

2. 堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。
堆里面分为新生代和老生代(java8 取消了永久代,采用了 Metaspace),新生代包
含 Eden+Survivor 区,survivor 区里面分为 from 和 to 区,内存回收时,如果用的是复
制算法,从 from 复制到 to,当经过一次或者多次 GC 之后,存活下来的对象会被移动
到老年区,当 JVM 内存不够用的时候,会触发 Full GC,清理 JVM 老年区
当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survice
区,然后进行垃圾清理。因为如果仅仅清理需要删除的对象,这样会导致内存碎
片,因此一般会把 Eden 进行完全的清理,然后整理内存。那么下次 GC 的时候,
就会使用下一个 Survive,这样循环使用。如果有特别大的对象,新生代放不下,
就会使用老年代的担保,直接放到老年代里面。因为 JVM 认为,一般大对象的存
活时间一般比较久远。

3. 对象创建方法,对象的内存分配,对象的访问定位。
new 一个对象

4. GC 的两种判定方法:
引用计数法:指的是如果某个地方引用了这个对象就+1,如果失效了就-1,当为 0 就
会回收但是 JVM 没有用这种方式,因为无法判定相互循环引用(A 引用 B,B 引用 A)
的情况
引用链法: 通过一种 GC ROOT 的对象(方法区中静态变量引用的对象等-static 变
量)来判断,如果有一条链能够到达 GC ROOT 就说明,不能到达 GC ROOT 就说明
可以回收

5. SafePoint 是什么
比如 GC 的时候必须要等到 Java 线程都进入到 safepoint 的时候 VMThread 才能开始
执行 GC,

  1. 循环的末尾 (防止大循环的时候一直不进入 safepoint,而其他线程在等待它进入
    safepoint)
  2. 方法返回前
  3. 调用方法的 call 之后
  4. 抛出异常的位置

技术图片

6. GC 的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用
在什么地方,如果让你优化收集方法,有什么思路?
先标记,标记完毕之后再清除,效率不高,会产生碎片
复制算法:分为 8:1 的 Eden 区和 survivor 区,就是上面谈到的 YGC
标记整理:标记完毕之后,让所有存活的对象向一端移动

7. GC 收集器有哪些?CMS 收集器与 G1 收集器的特点。
并行收集器:串行收集器使用一个单独的线程进行收集,GC 时服务有停顿时间
串行收集器:次要回收中使用多线程来执行
CMS 收集器是基于“ 标记— 清除”算法实现的,经过多次标记才会被清除
G1 从 整体来看是基于“ 标记— 整理”算法实现的收集器,从 局部(两个 Region 之间)
上来看是基于“ 复制”算法实现的

8. Minor GC 与 Full GC 分别在什么时候发生?
新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC

9. 几种常用的内存调试工具:jmap、jstack、jconsole、jhat
jstack 可以看当前栈的情况,jmap 查看内存,jhat 进行 dump 堆的信息
mat(eclipse 的也要了解一下)

10. 类加载的几个过程:
加载、验证、准备、解析、初始化。然后是使用和卸载了
通过全限定名来加载生成 class 对象到内存中,然后进行验证这个 class 文件,包括文
件格式校验、元数据验证,字节码校验等。准备是对这个对象分配内存。解析是将符
号引用转化为直接引用(指针引用),初始化就是开始执行构造器的代码
技术图片

1. 数据库三范式是什么?

  1. 第一范式(1NF):字段具有原子性,不可再分。(所有关系型数据库系
    统都满足第一范式数据库表中的字段都是单一属性的,不可再分)
  2. 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足
    第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每
    个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储
    各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
  3. 满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三
    范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关
    键字信息。 >所以第三范式具有如下特征: >>1. 每一列只有一个
    值 >>2. 每一行都能区分。 >>3. 每一个表都不包含其他表已经包含
    的非主关键字信息。

2. 有哪些数据库优化方面的经验?

  1. 用 PreparedStatement, 一般来说比 Statement 性能高:一个 sql
    发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存。
  2. 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,
    那在设计数据库时就去掉外键。
  3. 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
  4. UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结
    果集中不包含重复数据且不需要排序时的话,那么就使用 UNION
    ALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为一
    个,但这两者从使用和效率上来说都有所不同。 >1. 对重复结果的处
    理:UNION 在进行表链接后会筛选掉重复的记录,Union All 不会去除
    重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进行排
    序;UNION ALL 只是简单的将两个结果合并后就返回。

3. 请简述常用的索引有哪些种类?

  1. 普通索引: 即针对数据库表创建索引
  2. 唯一索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值
    必须唯一,但允许有空值
  3. 主键索引: 它是一种特殊的唯一索引,不允许有空值。一般是在建表的
    时候同时创建主键索引
  4. 组合索引: 为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。
    即将数据库表中的多个字段联合起来作为一个组合索引。

4. 以及在 mysql 数据库中索引的工作机制是什么?
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更
新数据库表中数据。索引的实现通常使用 B 树及其变种 B+树

5.MySQL 的基础操作命令:

  1. MySQL 是否处于运行状态:Debian 上运行命令 service mysql
    status,在 RedHat 上运行命令 service mysqld status
  2. 开启或停止 MySQL 服务 :运行命令 service mysqld start 开启服
    务;运行命令 service mysqld stop 停止服务
  3. Shell 登入 MySQL: 运行命令 mysql -u root -p
  4. 列出所有数据库:运行命令 show databases;
  5. 切换到某个数据库并在上面工作:运行命令 use databasename; 进入
    名为 databasename 的数据库
  6. 列出某个数据库内所有表: show tables;
  7. 获取表内所有 Field 对象的名称和类型 :describe table_name;
    技术图片

6.mysql 的复制原理以及流程。
Mysql 内建的复制功能是构建大型,高性能应用程序的基础。将 Mysql 的数据
分布到多个系统上去,这种分布的机制,是通过将 Mysql 的某一台主机的数据
复制到其它主机(slaves)上,并重新执行一遍来实现的。 * 复制过程中一
个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将
更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志
可以记录发送到从服务器的更新。 当一个从服务器连接主服务器时,它通知主
服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生
的任何更新,然后封锁并等待主服务器通知新的更新。 过程如下 1. 主服务器
把更新记录到二进制日志文件中。 2. 从服务器把主服务器的二进制日志拷贝
到自己的中继日志(replay log)中。 3. 从服务器重做中继日志中的时间,
把更新应用到自己的数据库上。

7.mysql 支持的复制类型?

  1. 基于语句的复制: 在主服务器上执行的 SQL 语句,在从服务器上执行
    同样的语句。MySQL 默认采用基于语句的复制,效率比较高。 一旦发
    现没法精确复制时,会自动选着基于行的复制。
  2. 基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执
    行一遍. 从 mysql5.0 开始支持
  3. 混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法
    精确的复制时,就会采用基于行的复制。

8.mysql 中 中 varchar 与 与 char 的区别以及 varchar(50) 中的 50 代表的涵
义?

  1. varchar 与 char 的区别: char 是一种固定长度的类型,varchar 则是
    一种可变长度的类型.
  2. varchar(50)中 50 的涵义 : 最多存放 50 个字节
  3. int(20)中 20 的涵义: int(M)中的 M indicates the maximum
    display width (最大显示宽度)for integer types. The maximum
    legal display width is 255.

9. 表中有大字段 X (例如:text 类型),且字段 X 不会经常更新,以读为
为主,将该字段拆成子表好处是什么?
如果字段里面有大字段(text,blob)类型的,而且这些字段的访问并不多,这
时候放在一起就变成缺点了。 MYSQL 数据库的记录存储是按行存储的,数据
块大小又是固定的(16K),每条记录越小,相同的块存储的记录就越多。此
时应该把大字段拆走,这样应付大部分小字段的查询时,就能提高效率。当需
要查询大字段时,此时的关联查询是不可避免的,但也是值得的。拆分开后,
对字段的 UPDAE 就要 UPDATE 多个表了

10.MySQL 中 中 InnoDB 引擎的行锁是通过加在什么上完成(或称实现)
的?
InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与
Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这
种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级
锁,否则,InnoDB 将使用表锁!

20道BAT面试官最喜欢问的JVM+MySQL面试题(含答案解析)

标签:构建   数据库索引   查看内存   ice   esc   顺序   status   通知   工作   

热心网友 时间:2022-05-03 00:16

下面是10道java基础面试题,后附答案

1.什么是 Java 虚拟机?为什么 Java 被称作是“平台无关的编程语言”?

Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。

Java 被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2.“static”关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是static 的方法?

“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

Java 中 static 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而 static 方法是编译时静态绑定的。static 方法跟类的任何实例都不相关,所以概念上不适用。

3.JDK 和 JRE 的区别是什么?

Java 运行时环境(JRE)是将要执行 Java 程序的 Java 虚拟机。它同时也包含了执行 applet 需要的浏览器插件。Java 开发工具包 (JDK)是完整的 Java 软件开发包,包含了 JRE,编译器和其他的工具(比如:JavaDoc,Java 调试器),可以让开发者开发、编译、执行 Java 应用程序。

4.是否可以在 static 环境中访问非 static 变量?

static 变量在 Java 中是属于类的,它在所有的实例中的值是一样的。当类被 Java 虚拟机载入的时候,会对 static 变量进行初始化。如果你的代码尝试不用实例来访问非 static 的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

5.Java 支持的数据类型有哪些?什么是自动拆装箱?

Java 语言支持的 8 中基本数据类型是:

byte

short

int

long

float

double

boolean

char

自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把 int 转化成 Integer,double 转化成 double,等等。反之就是自动拆箱。

6.Java 支持多继承么?

不支持,Java 不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。

7.Java 中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java 编译器会为这个类创建一个默认的构造函数。

Java 中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。

Java 不支持像 C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java 不会创建默认的复制构造函数。

8.Java 中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

Java 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会*它所覆盖的方法的访问。

9.接口和抽象类的区别是什么?

Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。

类可以实现很多个接口,但是只能继承一个抽象类

类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。

抽象类可以在不提供接口方法实现的情况下实现接口。

Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。

Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private, protected 或者是 public。

接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。

10.什么是值传递和引用传递?

对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。

对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。

最后祝你面试顺利!

热心网友 时间:2022-05-03 01:34

1.面向对象和面向过程的区别

面向过程

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源。比如单片机、嵌入式开发、Linux/Unix,等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

面向对象

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

缺点:性能比面向过程低

2.Java语言有哪些特点

1.简单易学;

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

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

4.可靠性;

5.安全性;

6.支持多线程(C++语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而Java语言却提供了多线程支持);

 

7.支持网络编程并且很方便(Java语言诞生本身就是为简化网络编程设计的,因此Java语言不仅支持网络编程而且很方便);

8.编译与解释并存;

3.关于JVMJDK和JRE最详细通俗的解答

JVM

Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。

什么是字节码?采用字节码的好处是什么?

在Java中,JVM可以理解的代码就叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java

语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

Java程序从源代码到运行一般有下面3步:

我们需要格外注意的是.class->机器码这一步。在这一步jvm类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的,也就是所谓的热点代码,所以后面引进了

JIT编译器,JIT属于运行时编译。当JIT编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于Java解释器的。这也解释了我们为什么经常会说Java是编译与解释共存的语言。

HotSpot采用了惰性评估(LazyEvaluation)的做法,根据二八定律,消耗大部分

系统资源的只有那一小部分的代码(热点代码),而这也就是JIT所需要编译

的部分。JVM会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK9

引入了一种新的编译模式AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了

JIT预热等各方面的开销。JDK支持分层编译和AOT协作使用。但是,AOT编译器的编译质量是肯定比不上JIT

编译器的。

总结:Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译,随处可以运行”的关键所在。

 

JDK和JRE

JDK是JavaDevelopmentKit,它是功能齐全的JavaSDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。JRE是Java运行时环境。它是运行已编译Java程序所需的所有内容的集合,包括Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。如果你只是为了运行一下Java

程序的话,那么你只需要安装JRE就可以了。如果你需要进行一些Java编程方面的工作,那么你就需要安装JDK

了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,仍然

需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务器中运行Java程序。那为什么需要JDK呢?因为应用程序服务器会将JSP转换为Javaservlet,并且需要使用JDK来编译servlet.

4.OracleJDK和OpenJDK的对比

可能在看这个问题之前很多人和我一样并没有接触和使用过OpenJDK。那么Oracle和OpenJDK之间是否存在重大差异?下面通过我通过我收集到一些资料对你解答这个被很多人忽视的问题。对于Java7,没什么关键的地方。OpenJDK项目主要基于Sun捐赠的HotSpot源代码。此外,OpenJDK被选为Java7的参考实现,由Oracle工程师维护。关于JVM,JDK,JRE和OpenJDK之间的区别,Oracle博客帖子在2012年有一个更详细的答案:

问:OpenJDK存储库中的源代码与用于构建OracleJDK的代码之间什么区别?

答:非常接近-我们的OracleJDK版本构建过程基于OpenJDK7构建,只添加了几个部分,例如部署代码,其中包括Oracle的Java插件和JavaWebStart的实现,以及一些封闭的源代码派对组件,如图形光栅化器,一些开源的第三方组件,如

Rhino,以及一些零碎的东西,如附加文档或第三方字体。展望未来,我们的目的是开源OracleJDK的所有部分,除了我们考虑商业功能的部分。

总结:

1.OracleJDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次;

2.OpenJDK是一个参考模型并且是完全开源的,而OracleJDK是OpenJDK的一个实现,并不是完全开源的;

3.OracleJDK比OpenJDK更稳定。OpenJDK和OracleJDK的代码几乎相同,但OracleJDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择OracleJDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK可能会遇到了许多应用程序崩溃的问题,但是,只需切换到OracleJDK就可以解决问题;

4.顶级公司正在使用OracleJDK,例如AndroidStudio,Minecraft和IntelliJIDEA开发工具,其中OpenJDK不太受欢迎;

5.在响应性和JVM性能方面,OracleJDK与OpenJDK相比提供了更好的性能;

6.OracleJDK不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本获得支持来获取最新版本;

7.OracleJDK根据二进制代码许可协议获得许可,而OpenJDK根据GPLv2许可获得许可。

5.Java和C++的区别

我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来!

    都是面向对象的语言,都支持封装、继承和多态

    Java  不提供指针来直接访问内存,程序内存更加安全

    Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。

    Java有自动内存管理机制,不需要程序员手动释放无用内存

6.什么是Java程序的主类应用程序和小程序的主类有何不同

一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。

7. Java 应用程序与小程序之间有那些差别

简单说应用程序是从主线程启动(也就是 main() 方法)。applet 小程序没有main 方法,主要是嵌在浏览器页面上运行(调用 init()线程或者 run()来启动),嵌入浏览器这点跟 flash 的小游戏类似。

8. 字符型常量和字符串常量的区别

1. 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符

2. 含义上: 字符常量相当于一个整形值( ASCII 值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)

3. 占内存大小 字符常量只占 2 个字节 字符串常量占若干个字节(至少一个字符结束标志) (注意: char 在 Java 中占两个字节) 

9. 构造器 Constructor 是否可被 override

在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构造函数的情况。

10. 重载和重写的区别

重载: 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写: 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符

范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

11. Java 面向对象编程三大特性: 封装 继承 多态

封装

封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供法给外界访问。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。

继承

继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码。

关于继承如下 3 点请记住:

1. 子类拥有父类非 private 的属性和方法。

2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。

3. 子类可以用自己的方式实现父类的方法。

多态

所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。在 Java 中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。

12. String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的

可变性

简单的来说:String 类中使用 final 关键字字符数组保存字符串,privatefinal char value[],所以 String 对象是不可变的。而 StringBuilder 与StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串 char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。

StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是

AbstractStringBuilder 实现的,大家可以自行查阅源码。

AbstractStringBuilder.java

abstract class AbstractStringBuilder implements Appendable, CharSequence {

char[] value;

int count;

AbstractStringBuilder() { 

}

AbstractStringBuilder(int capacity) {

value = new char[capacity];

}

线程安全性

String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

性能

每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

对于三者使用的总结:

1. 操作少量的数据 = String

2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder

3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer

13. 自动装箱与拆箱

装箱:将基本类型用它们对应的引用类型包装起来;

拆箱:将包装类型转换为基本数据类型;

14. 在一个静态方法内调用一个非静态成员为什么是非法的

由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。

15. 在 Java 中定义一个不做事且没有参数的构造方法的作用

Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

16. import java 和 javax 有什么区别

刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展API 包来说使用。然而随着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准 API 的一部分。所以,实际上 java 和 javax 没有区别。这都是一个名字。

17. 接口和抽象类的区别是什么

1. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法

2. 接口中的实例变量默认是 final 类型的,而抽象类中则不一定

3. 一个类可以实现多个接口,但最多只能实现一个抽象类

4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定

5. 接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。

18. 成员变量与局部变量的区别有那些

1. 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰;

2. 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存

3. 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

4. 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰的成员变量也必须显示地赋值);而局部变量则不会自动赋值。

19. 创建一个对象用什么运算符?对象实体与对象引用有何不同?

new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。

20. 什么是方法的返回值?返回值在类的方法里的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

21. 一个类的构造方法的作用是什么 若一个类没有声明构造方法,该程序能正确执行吗 ?为什么?

主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

22. 构造方法有哪些特性

1. 名字与类名相同;

2. 没有返回值,但不能用 void 声明构造函数;

3. 生成类的对象时自动执行,无需调用。

23. 静态方法和实例方法有何不同

1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此*.

24. 对象的相等与指向他们的引用相等,两者有什么不同?

对象的相等,比的是内存中存放的内容是否相等。而引用相等,比较的是他们指向的内存地址是否相等。

25. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

帮助子类做初始化工作。

26. == 与 equals(重要)

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

 情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

 情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。

举个例子:

public class test1 {

public static void main(String[https://www.xiaoyuani.com/] args) {

String a = new String("ab"); // a 为一个引用

String b = new String("ab"); // b 为另一个引用,对象的内容一样

String aa = "ab"; // 放在常量池中

String bb = "ab"; // 从常量池中查找

if (aa == bb) // true

System.out.println("aa==bb");

if (a == b) // false,非同一对象

System.out.println("a==b");

if (a.equals(b)) // true

System.out.println("aEQb");

if (42 == 42.0) { // true

System.out.println("true");

}

说明:

 String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。

 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。

27. hashCode 与 equals(重要)

面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写 equals时必须重写 hashCode 方法?”

hashCode()介绍

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在 JDK 的 Object.java 中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。

散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)

为什么要有 hashCode

我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcode,HashSet 会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的 Java 启蒙书《Headfirst java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

hashCode()与 equals()的相关规定

1. 如果两个对象相等,则 hashcode 一定也是相同的

2. 两个对象相等,对两个对象分别调用 equals 方法都返回 true

3. 两个对象有相同的 hashcode 值,它们也不一定是相等的

4. 因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖

5. hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

 

28. 简述线程,程序、进程的基本概念。以及他们之间关系是什么

线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

29. 线程有哪些基本状态?

参考《Java 并发编程艺术》4.1.4 节。

Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态。

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。

30 关于 final 关键字的一些总结

final 关键字主要用在三个地方:变量、方法、类。

1. 对于一个 final 变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

2. 当用 final 修饰一个类时,表明这个类不能被继承。final 类中的所有成员方法都会被隐式地指定为 final 方法。

3. 使用 final 方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的 Java 实现版本中,会将final 方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的 Java 版本已经不需要使用 final 方法进行这些优化了)。类中所有的 private 方法都隐式地指定为 final。

31 Java 序列化中如果有些字段不想进行序列化 怎么办

对于不想进行序列化的变量,使用 transient 关键字修饰。

transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;

当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。

transient 只能修饰变量,不能修饰类和方法。

32 获取用键盘输入常用的的两种方法

方法 1:通过 Scanner

Scanner input = new Scanner(System.in);

String s = input.nextLine();

input.close();

方法 2:通过 BufferedReaderBufferedReader input = new BufferedReader(new InputStreamReader(System.in));

String s = input.readLine();

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... 养宠物的人遵守规则,是不是就能和别人平安相处呢? 企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 苹果7无通话声音,这个指令是什么意思? iphone7plus代码是多少? 我的苹果7快捷指令系统设置在那 苹果怎么找所有快捷指令方式 苹果7没有快捷指令吗 财信人寿保险公司怎么下载 农银人寿保险app下载? 如何把一台手机上的哔哩哔哩视频转移到另一台手机上? 怎样用手机哔哩哔哩上传视频?? 用手机录的视频传到电脑上,可以投稿到bilibili吗(๑> <๑) 怎么用手机上传自己录的视频到哔哩哔哩上,急,谢谢 如何录制视频,如何到哔哩哔哩上传 为什么vivo手机自带的录制不能上传到哔哩哔哩,显示错误 我在虎牙录了一个小视频,有虎牙直播的水印可以在哔哩哔哩上发布吗? 用手机可以在B站上传视频吗?如果能,怎么做?! 手机可以上传视频到b站吗? 枫树是国家保护树种吗? 枫树的特征是什么 枫树是不是红叶 什么是枫树的颜色? 初级java面试,面试官是如何出题的 学Java的面试都会问些什么? 请问各位JAVA面试都问一些什么问题? java面试,问性能调优从哪些方面着手 Java面试题:什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? java web面试 学习java有必要看 深入jvm 吗 软件测试员面试为什么还需要了解Java虚拟机 C++语言与Java语言的区别有哪些?(面试题) 哪里有java程序员面试题啊,谢谢 jvm会先去方法区中找有没有相应类的.class存在.如果有,就直接使用_百 ... 面试Java虚拟机 有什么用 深入java虚拟机,*和深入理解Java虚拟机:JVM高级特性与最佳实践。 梦见自己抱住大树差点掉海里 梦到要掉到海里,什么意思 梦到自己坐在船上,差点掉到海里?? 青少年做梦梦见自己下差点掉海里 昨天晚上梦见掉河里了,什么征兆呢? 梦见自己差点从桥上跳下海,海里还有鱼? 梦见自己差点被风刮进大海里