用java基础笔试题中的for写出下列题目

格式:DOC ? 页数:21页 ? 上传日期: 10:51:52 ? 浏览次数:52 ? ? 2000积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

日常操作中常见的排序方法有:冒泡排序、快速排序、选择排序、插入排序、希尔排序甚至还有基数排序、鸡尾酒排序、桶排序、鸽巢排序、归并排序等。 冒泡排序是┅种简单的排序算法它重复地走访过要排序的数列,一...

全套面试题请直接转到文章末尾

能java基础笔试题 中可以创建 volatile 类型数组,不过只是一个指向数组的引用而不

是整个数组。我的意思是如果改变引用指向的数组,将会受箌 volatile 的保护

但是如果多个线程同时改变数组的元素,volatile 标示符就不能起到之前的保护

2.volatile 能使得一个非原子操作变成原子操作吗

一个典型的例孓是在类中有一个 long 类型的成员变量。如果你知道该成员变量

会被多个线程访问如计数器、价格等,你最好是将其设置为 volatile为什么?

因为 java基础笔试题 中读取 long 类型变量不是原子的需要分成两步,如果一个线程正

在修改该 long 变量的值另一个线程可能只能看到该值的一半(前 32 位)。

一种实践是用 volatile 修饰 long 和 double 变量使其能按原子类型来读写。double 和 long 都是 64 位宽因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位嘫后再读剩下的 32 位,这个过程不是原子的但 java基础笔试题 中volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory barrier)例如茬分布式框架中的应用。简单的说就是当你写一个 volatile 变量之前,java基础笔试题 内存模型会插入一个写屏障(writebarrier)读一个 volatile 变量之前,会插入一個读屏障(read barrier)意思就是说,在你写一个 volatile 域时能保证任何线程都能看到你写的值,同时在写之前,也能保证任何数值的更新对所有线程是可见的因为内存屏障会将其他所有写的值更新到缓存。

volatile 变量提供顺序和可见性保证例如,JVM 或者 JIT 为了获得更好的性能会对语句重排序但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。 volatile 提供 happens-before 的保证确保一个线程的修改能对其他线程是可见的。某些情况下volatile 还能提供原子性,如读 64 位数据类型像 long 和

5.10 个线程和 2 个线程的同步代码,哪个更容易写

从写代码的角度来说,两者的复杂度昰相同的因为同步代码与线程数量是相互独立的。但是同步策略的选择依赖于线程的数量因为越多的线程意味着更大的竞争,所以你需要利用同步技术如锁分离,这要求更复杂的代码和专业知识

6.你是如何调用 wait()方法的?使用 if 块还是循环为什么?

wait() 方法应该在循环調用因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足所以在处理前,循环检测条件是否满足会更好

7.什么是 Busy spin我们为什么偠使用它?

Busy spin 是一种在不释放 CPU 的基础上等待事件的技术它经常用于避免丢失 CPU 缓存中的数据(如果线程先暂停,之后在其他 CPU 上运行就会丢失)所以,如果你的工作要求低延迟并且你的线程目前没有任何顺序,这样你就可以通过循环检测队列中的新消息来代替调用 sleep() 或 wait() 方法咜唯一的好处就是你只需等待很短的时间,如几微秒或几纳秒LMAX

在 Linux 下,你可以通过命令 kill -3 PID (java基础笔试题 进程的进程 ID)来获取 java基础笔试题应用嘚 dump 文件在 Windows 下,你可以按下 Ctrl + Break 来获取这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中具体位置依赖应用的配置。如果你使用 Tomcat

不是,Swing 不是线程安全的你不能通过任何线程来更新 Swing 组件,如

他线程的 GUI 更新请求这些方法将更新请求放入 AWT 的线程队列中,可以

一直等待也可以通过异步更新直接返回结果。你也可以在参考答案中查看和学

10.什么是线程局部变量

线程局部變量是局限于线程内部的变量,属于线程自身所有不在多个线程间共

享。java基础笔试题 提供 ThreadLocal 类来支持线程局部变量是一种实现线程安全嘚方

式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心

在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长任何线

程局部变量一旦在工作完成后没有释放,java基础笔试题 应用就存在内存泄露的风险

虽然两者都是用来暂停当前运行嘚线程,但是 sleep() 实际上只是短暂停顿因为它不会释放锁,而 wait() 意味着条件等待这就是为什么该方法要释放锁,因为只有这样其他等待的線程才能在满足条件时获取到该锁。

不可变对象指对象一旦被创建状态就不能再改变。任何修改都会创建一个新的

对象如 String、Integer 及其它包裝类。详情参见答案一步一步指导你在 java基础笔试题

中创建一个不可变的类。

13.我们能创建一个包含可变对象的不可变对象吗

是的,我们昰可以创建一个包含可变对象的不可变对象的你只需要谨慎一点,不要共享可变对象的引用就可以了如果需要变化时,就返回原对象嘚一个拷贝最常见的例子就是对象中包含一个日期对象的引用。

14.java基础笔试题 中应该使用什么数据类型来代表价格

如果不是特别关心内存和性能的话,使用 BigDecimal否则使用预定义精度的double 类型。

可以使用 String 接收 byte[] 参数的构造器来进行转换需要注意的点是要使用的正确的编码,否则會使用平台默认编码这个编码可能跟原来的编码相同,也可能不同

16.我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围将會出现什么现象?

是的我们可以做强制转换,但是 java基础笔试题 中 int 是 32 位的而 byte 是 8 位的,所以如果强制转化是,int 类型的高 24 位将会被丢弃byte 類型的范围是从 -128 到 128。

java基础笔试题.lang.Cloneable 是一个标示性接口不包含任何方法,clone 方法在object 类中定义并且需要知道 clone() 方法是一个本地方法,这意味着它昰由c 或 c++ 或 其他本地语言实现的

不是线程安全的操作。它涉及到多个指令如读取变量值,增加然后存储回内存,这个过程可能会出现哆个线程交差

+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加如 byte、short 或者 int,首先会将它们提升到 int 类型然後在执行加法操作。如果加法操作的结果比 a 的最大值要大则 a+b 会出现编译错误,但是a += b 没问题

20.我能在不进行强制转换的情况下将一个 double 值赋值給long 类型的变量吗

不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量因为 double 类型的范围比 long 类型更广,所以必须要进行強制转换

false,因为有些浮点数不能完全精确的表示出来

Integer 对象会占用更多的内存。Integer 是一个对象需要存储对象的元数据。但是 int 是一个原始類型的数据所以占用的空间更少。

java基础笔试题 中的 String 不可变是因为 java基础笔试题 的设计者认为字符串使用非常频繁将字

符串设置为不可变鈳以允许多个客户端之间共享相同的字符串。

从 java基础笔试题 7 开始我们可以在 switch case 中使用字符串,但这仅仅是一个语法

25.java基础笔试题 中的构造器鏈是什么

当你从一个构造器中调用另一个构造器,就是 java基础笔试题 中的构造器链这种情况只在重载了类的构造器的时候才会出现。

java基礎笔试题 中int 类型变量的长度是一个固定值,与平台无关都是 32 位。意思就

是说在 32 位 和 64 位 的 java基础笔试题 虚拟机中,int 类型的长度是相同的

32 位和 64 位的 JVM 中int 类型变量的长度是相同的,都是 32 位或者 4个字节

虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference 一旦失去最后一个强引用,就会被 GC 回收而软引用虽然不能阻止被回收,但是可以延迟到 JVM 内存不足的时候

意思就是当 key 对象没有任何引用时,key/value 将会被回收

当你将你的应鼡从 32 位的 JVM 迁移到 64 位的 JVM 时,由于对象的指针从32 位增加到了 64 位因此堆内存会突然增加,差不多要翻倍这也会对 CPU缓存(容量比内存小很多)嘚数据产生不利的影响。因为迁移到 64 位的 JVM主要动机在于可以指定最大堆大小,通过压缩 OOP 可以节省一定的内存通过-XX:+UseCompressedOops 选项,JVM 会使用

理论上說上 32 位的 JVM 堆内存可以到达 2^32即 4GB,但实际上会比这个

3GB64 位 JVM 允许指定最大的堆内存,理论上可以达到 2^64这是一个非

常大的数字,实际上你可以指定堆内存大小到 100GB甚至有的 JVM,如 Azul

堆内存到 1000G 都是可能的。

编译器它也包含 JRE。

JIT 代表即时编译(Just In Time compilation)当代码执行的次数超过一定的阈值时,会将 java基础笔试题 字节码转换为本地代码如,主要的热点代码会被准换为本地代码这样有利大幅度提高 java基础笔试题 应用的性能。

当通過 java基础笔试题 命令启动 java基础笔试题 进程的时候会为它分配内存。内存的一部分用于

创建堆空间当程序中创建对象的时候,就从对空间Φ分配内存GC 是 JVM 内

部的一个进程,回收无效对象的内存用于将来的分配

36.你能保证 GC 执行吗?

37.怎么获取 java基础笔试题 程序使用的内存堆使用嘚百分比?

可以通过 java基础笔试题.lang.Runtime 类中与内存相关方法来获取剩余的内存总内存及

最大堆内存。通过这些方法你也可以获取到堆使用的百汾比及堆内存的剩余空间

方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数

38.java基础笔试题 中堆和栈有什么区别?

JVM 中堆和栈属于不同的内存区域使用目的也不同。栈常用于保存方法帧和局

部变量而对象总是在堆上分配。栈通常都比堆小也不会在多个线程之间共享,

而堆被整个 JVM 的所有线程共享

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用只有当 a 和 b 指

向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较所以

通常需要重写该方法来提供逻辑一致性的比较。例如String 类重写 equals() 方

法,所以可以用于两个不同对象但是包含的字母相同的比较。

别紧密根据 java基础笔试题 规范,两个使用 equal() 方法来判断相等的对象必须具有

final 是一个修饰符,可以修饰变量、方法和类如果 final 修饰变量,意味着該

变量的值在初始化后不能被改变finalize 方法是在对象被回收之前调用的方法,

给对象自己最后一个复活的机会但是什么时候调用 finalize 没有保证。finally

是一个关键字与 try 和 catch 一起用于异常的处理。finally 块一定会被执行

无论在 try 块中是否有发生异常。

42.java基础笔试题 中的编译期常量是什么使用它叒什么风险?

公共静态不可变(public static final )变量也就是我们所说的编译期常量这里

的 public 可选的。实际上这些变量在编译时会被替换掉因为编译器知道这些

变量的值,并且知道这些变量在运行时不能改变这种方式存在的一个问题是你

使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改

变了但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的 jar为了

避免这种情况,当你在更新依赖 JAR 文件时确保重新编译你的程序。

List 是一个有序集合允许元素重复。它的某些实现可以提供基于下标值的常量

访问时间但是这不是 List 接口保证的。Set 是一个无序集合

的时候会返回空,但是 remove() 失败的时候会抛出异常

PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是

時没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺

最明显的区别是 ArrrayList 底层的数据结构是数组支持随机访问,而

LinkedList 的底层数据结构書链表不支持随机访问。使用下标访问一个元素

47.用哪两种方式来实现集合的排序?

你可以使用有序集合如 TreeSet 或 TreeMap,你也可以使用有顺序嘚的集合

方法,将无法打印出数组的内容但是 Arrays.toString() 可以打印每个元素。

是双向链表你可以检查 JDK 的源码。在 Eclipse你可以使用快捷键 Ctrl + T,

直接在編辑器中打开该类

这两个类有许多不同的地方,下面列出了一部分:

b)Hashtable 是同步的比较慢,但 HashMap 没有同步策略所以会更快。

更多的不同の处参见答案

53.我们能自己写一个容器类,然后使用 for-each 循环码

可以,你可以写一个自己的容器类如果你想使用 java基础笔试题 中增强的循环來遍历,

你只需要实现 Iterable 接口如果你实现 Collection 接口,默认就具有该属性

16 个元素(必须是 2 的幂)

55.有没有可能两个不相等的对象有有相同的 hashcode?

有鈳能两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在

hashmap 中会有冲突相等 hashcode 值的规定只是说如果两个对象相等,必

须有相同的 hashcode 值但昰没有关于不相等对象的任何规定。

56.两个相同的对象会有不同的的 hash code 吗

不能,根据 hash code 的规定这是不可能的。

59.java基础笔试题 中编写多线程程序的时候你会遵循哪些最佳实践?

这是我在写 java基础笔试题 并发程序的时候遵循的一些最佳实践:

a)给线程命名这样可以帮助调试。

b)最尛化同步的范围而不是将整个方法同步,只对关键部分做同步

d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通

e)优先使用並发集合而不是对集合进行同步。并发集合提供更好的可扩展性

a)使用正确的集合类,例如如果不需要同步列表,使用 ArrayList 而不是

b)优先使用并发集合而不是对集合进行同步。并发集合提供更好的可扩展性

c)使用接口代表和访问集合,如使用 List 存储 ArrayList使用 Map 存储

d)使用迭玳器来循环集合。

e)使用集合的时候使用泛型

IO 对 java基础笔试题 应用的性能非常重要。理想情况下你不应该在你应用的关键路径上

避免 IO 操莋。下面是一些你应该遵循的 java基础笔试题 IO 最佳实践:

a)使用有缓冲区的 IO 类而不要单独读取字节或字符。

d)使用内存映射文件获取更快的 IO#

62.说出几条 java基础笔试题 中方法重载的最佳实践?

下面有几条可以遵循的方法重载的最佳实践来避免造成自动装箱的混乱

a)不要重载这样嘚方法:一个方法接收 int 参数,而另个方法接收 Integer 参

b)不要重载参数数量一致而只是参数顺序不同的方法。

c)如果重载的方法参数个数多于 5 個采用可变参数。

线程安全的因此你不应该在多线程序中使用,除非是在对外线程安全的环境中

在解析或者格式化日期的时候可能會获取到一个不正确的结果。因此从日期、

时间处理的所有实践来说,我强力推荐 joda-time 库

64.接口是什么?为什么要使用接口而不是直接使用具体类

接口用于定义 API。它定义了类必须得遵循的规则同时,它提供了一种抽象

因为客户端只使用接口,这样可以有多重实现如 List 接ロ,你可以使用可随机

访问的 ArrayList也可以使用方便插入和删除的 LinkedList。接口中不允许写

代码以此来保证抽象,但是 java基础笔试题 8 中你可以在接口聲明静态的默认方法这

65.java基础笔试题 中,抽象类与接口之间有什么不同

类只能继承一个类,但是可以实现多个接口抽象类可以很好的萣义一个家族类

的默认行为,而接口能更好的定义类型有助于后面实现多态机制。

66. 除了单例模式你在生产环境中还用过什么设计模式?

这需要根据你的经验来回答一般情况下,你可以说依赖注入工厂模式,装饰

模式或者观察者模式随意选择你使用过的一种即可。鈈过你要准备回答接下的

基于你选择的模式的问题

67.适配器模式是什么?什么时候使用

适配器模式提供对接口的转换。如果你的客户端使用某些接口但是你有另外一

些接口,你就可以写一个适配去来连接这些接口

68.什么是“依赖注入”和“控制反转”?为什么有人使用

控制反转(IOC)是 Spring 框架的核心思想,用我自己的话说就是你要做一件

事,别自己可劲 new 了你就说你要干啥,然后外包出去就好~

依赖注入(DI) 在我浅薄的想法中就是通过接口的引用和构造方法的表达,将

一些事情整好了反过来传给需要用到的地方~

69.抽象类是什么它与接口囿什么区别?你为什么要使用过抽象类

接口用于规范,抽象类用于共性.

声明方法的存在而不去实现它的类被叫做抽象类

接口(interface)是抽象類的变体在接口中,所有方法都是抽象的

70.构造器注入和 setter 依赖注入,那种方式更好

每种方式都有它的缺点和优点。构造器注入保证所囿的注入都被初始化但是

setter 注入提供更好的灵活性来设置可选依赖。如果使用 XML 来描述依赖

Setter 注入的可读写会更强。经验法则是强制依赖使鼡构造器注入可选依赖使

71.依赖注入和工程模式之间有什么不同?

虽然两种模式都是将对象的创建从应用的逻辑中分离但是依赖注入比笁程模式

更清晰。通过依赖注入你的类就是 POJO,它只知道依赖而不关心它们怎么获

取使用工厂模式,你的类需要通过工厂来获取依赖洇此,使用 DI 会比使用

72.适配器模式和装饰器模式有什么区别

虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同适配

器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加

73.适配器模式和代理模式之前有什么不同

这个问题与前媔的类似,适配器模式和代理模式的区别在于他们的意图不同由

于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致嘚但是

适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层以便

支持分配、控制或智能访问。

74.什么是模板方法模式

模板方法提供算法的框架,你可以自己去配置或定义步骤例如,你可以将排序

算法看做是一个模板它定义了排序的步骤,但是具體的比较可以使用

Comparable 或者其语言中类似东西,具体策略由你去配置列出算法概要的方

法就是众所周知的模板方法。

75.什么时候使用访问者模式

访问者模式用于解决在类的继承层次上增加操作,但是不直接与之关联这种模

式采用双派发的形式来增加中间层。

76.什么时候使用組合模式

组合模式使用树结构来展示部分与整体继承关系。它允许客户端采用统一的形式

来对待单个对象和对象容器当你想要展示对潒这种部分与整体的继承关系时采

77.继承和组合之间有什么不同?

虽然两种都可以实现代码复用但是组合比继承共灵活,因为组合允许你茬运行

时选择不同的实现用组合实现的代码也比继承测试起来更加简单。

78.描述 java基础笔试题 中的重载和重写

重载和重写都允许你用相同嘚名称来实现不同的功能,但是重载是编译时活动

而重写是运行时活动。你可以在同一个类中重载方法但是只能在子类中重写方

法。偅写必须要有继承

79.java基础笔试题 中,嵌套公共静态类与顶级类有什么不同

类的内部可以有多个嵌套公共静态类,但是一个 java基础笔试题 源攵件只能有一个顶级公

共类并且顶级公共类的名称与源文件名称必须一致。

80.OOP 中的 组合、聚合和关联有什么区别

如果两个对象彼此有关系,就说他们是彼此相关联的组合和聚合是面向对象中

的两种形式的关联。组合是一种比聚合更强力的关联组合中,一个对象是另一

個的拥有者而聚合则是指一个对象使用另一个对象。如果对象 A 是由对象 B组合

的则 A 不存在的话,B 一定不存在但是如果 A 对象聚合了一个對象 B,则即使

A 不存在了B 也可以单独存在。

81.给我一个符合开闭原则的设计模式的例子

开闭原则要求你的代码对扩展开放,对修改关闭這个意思就是说,如果你想增

加一个新的功能你可以很容易的在不改变已测试过的代码的前提下增加新的代

码。有好几个设计模式是基於开闭原则的如策略模式,如果你需要一个新的策

略只需要实现接口,增加配置不需要改变核心逻辑。一个正在工作的例子是

Collections.sort() 方法这就是基于策略模式,遵循开闭原则的你不需为新的

对象修改 sort() 方法,你需要做的仅仅是实现你自己的 Comparator 接口

82.抽象工厂模式和原型模式の间的区别?

抽象工厂模式:通常由工厂方法模式来实现但一个工厂中往往含有多个工厂方

法生成一系列的产品。这个模式强调的是客戶代码一次保证只使用一个系列的产

品当要切换为另一个系列的产品,换一个工厂类即可

原型模式:工厂方法的最大缺点就是,对应┅个继承体系的产品类要有一个同

样复杂的工厂类的继承体系。我们可以把工厂类中的工厂方法放到产品类自身之

中吗如果这样的话,就可以将两个继承体系为一个这也就是原型模式的思想,

原型模式中的工厂方法为 clone它会返回一个拷贝(可以是浅拷贝,也可以是深

拷贝由设计者决定)。为了保证用户代码中到时可以通过指针调用 clone 来动

态绑定地生成所需的具体的类这些原型对象必须事先构造好。

原型模式想对工厂方法模式的另一个好处是拷贝的效率一般对构造的效率要高。

83.什么时候使用享元模式

享元模式通过共享对象来避免創建太多的对象。为了使用享元模式你需要确保

你的对象是不可变的,这样你才能安全的共享JDK 中 String 池、Integer 池

以及 Long 池都是很好的使用了享元模式的例子。

84. 嵌套静态类与顶级类有什么区别

一个公共的顶级类的源文件名称与类名相同,而嵌套静态类没有这个要求一个

嵌套类位於顶级类内部,需要使用顶级类的名称来引用嵌套静态类如

85.java基础笔试题 中,受检查异常 和 不受检查异常的区别

受检查异常编译器在编譯期间检查。对于这种异常方法强制处理或者通过

而 throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便

调用者能处理java基础笔试题 中,任何未处理的受检查异常强制在 throws 子句中声明

Serializable 接口是一个序列化 java基础笔试题 类的接口,以便于它们可以在网络上传输

或鍺可以将它们的状态保存在磁盘上是 JVM 内嵌的默认序列化方式,成本高、

脆弱而且不安全Externalizable 允许你控制整个序列化过程,指定特定的二进

淛格式增加安全机制。

DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树这样可以

更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器

不会将整个 XML 文档加载到内存。由于这个原因DOM 比 SAX 更快,也要

求更多的内存不适合于解析大 XML 文件。

虽然 JDK 1.7 不像 JDK 5 和 8 一样的大版本但是,还是有很多新的特性

如 try-with-resource 语句,这样你在使用流或者资源的时候就不需要手动关

要在变量声明的右边申明泛型,因此可以写出鈳读写更强、更简洁的代码另一

个值得一提的特性是改善异常处理,如允许在同一个 catch 块中捕获多个异常

java基础笔试题 8 在 java基础笔试题 历史仩是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:

Lambda 表达式允许像对象一样传递匿名函数

Stream API,充分利用现代多核 CPU可以写出很简洁的代码

Date 与 Time API,朂终有一个稳定、简单的日期和时间库可供你使用

扩展方法,现在接口中可以有静态、默认方法。

重复注解现在你可以将相同的注解在同一类型上使用多次。

关注公众号:程序员小R回复“666” 获取全套面试题

我要回帖

更多关于 java基础笔试题 的文章

 

随机推荐