首页 > 寺庙

Java面试题|

Java面试题

1.空字符串的作用

Java面试题|

如题所示,当进行s=s+i的时候,s在前和s在后输出的结果是相反的。空字符串在前时是正着输出,空字符串在后是逆着输出

2.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

第一种情况,s1是short类型,在计算s1=s1+1时,前边是short型,后边是int型,不能自动转换。由于没有强转,要报类型错误。

第二种情况,使用了+=这个java自带的运算符,java内部会对其进行处理,所以编译通过,不会报错。

3.说说和的区别。

和都表示与的意思,既表达式俩边都成立,结果才成立。

是逻辑运算符,有短路作用,既当表达式左边为假时,不需要计算右边,整个的结果直接为假;没有

是位运算符,的左右俩边可以是布尔类型,也可以是数值;俩边只能是布尔类型

4.Integer与int的区别

int是八大基本数据类型之一,Integer是int的封装类。

int的默认值是0,Integer的默认值是null,此时的0代表这个数赋值0,而null代表没接收到这个值

Integer提供了与整数相关的操作,int没有

5.==与equals的区别

从表面上看,对于基本数据类型==是判断的值是否相等;对于引用数据类型是判断是否为同一个对象

从本质上看,是看是否为一个引用地址

equals是判断值是否相等

6.override(重写)和overload(重载)的区别

重载是在一个类中,方法名相同,参数列表不同(参数类型和参数个数)的一种现象

1.重载与返回值类型无关

2.不能通过访问修饰符进行重载

如下是重载:

重写是在父子类中,子类重写父类的方法,要求方法名与参数列表,返回值类型完全相同。子类重写父类规范要在子类的方法前加注解@Override

1.重写的返回值类型可以改,但只能是父子类

例如:

2.重写的访问修饰符得大于等于原来的

3.不能重写私有方法

4.参数列表的顺序与类型必须一样,变量名可不同

7.接口与抽象类的区别

抽象类是用abstract修饰的类,抽象类不能new对象。

接口是比抽象类还抽象的“类”

普通类:具体实现

抽象类:规范(抽象方法),具体实现

接口:规范(抽象方法)

区别:

1.抽象类中可以有抽象方法也可以有非抽象方法,接口中只能有抽象方法

2.抽象类中可以有成员变量,接口中只能有常量,用public static final修饰,默认可不写

3.抽象类有构造方法,接口没有构造方法

4.抽象类中的方法的访问修饰符可以是public,protected,默认;接口中方法的访问修饰符只能是public,并且默认值是public abstract

5.抽象类中可以有静态方法,接口中不能有静态方法。(static是类名直接调用,abstract是子类实现创建对象调用,如果一起修饰,自相矛盾了)

6.一个类可以实现多个接口,只能继承一个抽象类

8.JDK,JRE,JVM的联系与区别

JDK是java开发工具包,JDK包括JRE,类库,java工具

JRE是java运行环境,JRE包括JVM,JRE里有运行.class的java.exe

JVM是java虚拟机,java虚拟机在执行字节码时,把字节码解释成具体平台的机器指令执行,这也是java语言跨平台的根源,是“一次编译,到处运行”的原因

联系:JDK下的jre文件夹下有俩个文件夹lib和bin;在这里可以理解为bin就是jvm,lib就是类库;所以JRE=JVM+类库

我们利用JDK开发属于自己的java程序,javac编译成字节码,在JRE上运行这些字节码,JVM解析这些字节码,最终映射到CPU指令集或OS的系统调用

区别:

JDK与JRE的区别:

1.JDK有javac.exe;JRE没有

2.JDK是开发环境,JRE是运行环境

JRE与JVM的区别:

1.JVM执行.class需要JRE下lib类库的支持(尤其是rt.jar)

9.在java中如何跳出多层循环

利用“打标签”的形式,如:

10.String s = new String(xyz);创建了几个String Object

创建了俩个对象或一个对象,如果常量池中没有“xyz”第一次=在常量池中创建了一个字符串对象,第二次new又创建了一个字符串引用对象;如果常量池中有“xyz”,那就只是new的时候创建了一个对象。

11.Java有没有goto?

java中的保留字,现在在java中没有使用

12.Java中的String,StringBuilder,StringBuffer三者的区别?

1.String是不可变字符串,StringBuilder和StringBuffer是可变字符串

2.从运行效率看,StringBuilderStringBufferString

3.StringBuilder非线程安全,StringBuffer线程安全

总结:String适合少量字符串的操作

StringBuilder适合单线程大量数据的操作

StringBuffer适合多线程大量数据的操作

13.静态变量和实例变量的区别?

1.静态变量用static修饰,实例变量不需要

2.静态变量是属于类的,实例变量是属于对象的

3.当一个对象把静态变量的值改了,其他对象调用时它的值也跟着变了;实例变量是独立的,一个对象修改它的值不会影响另一个对象调用它的值

14.switch语句能否作用在byte上,能否作用在long上,能否作用在String上?

可以作用在byte上,因为byte能自动转为int;不能作用在long上,long转int不能自动转,需要强转;在jdk1.7以后可以作用在String上

15.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

是引用不能变,即对象的指向不能变,但引用的对象即引用里的值是可以变得,因为它又没有用final修饰

16.请说出作用域public,private,protected,以及不写时的区别

17.构造器Constructor是否可被override?

构造器不能被重写,因为构造器不能被继承,但它可以重载

18.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会 不会被执行,什么时候被执行,在return前还是后?

会执行,首先明确一点是“finally块中的代码始终要执行”,也就是说不管怎样,它都会执行。并且在return前执行,执行finally后通过return退出。看下边的例子:

19.final, finally, finalize的区别

final修饰属性,方法,类;分别表示属性不可变,方法不可覆盖,类不可继承

finally是异常中的关键字,始终要执行的代码放在finally块中

finalize是Object的一个方法,是垃圾回收机制,重写此方法可以回收其他资源,如文件关闭。JVM不保证此方法总被调用

20.启动一个线程是用run()还是start()

用start()方法,start方法内调用了run方法,如果直接调用run方法,那么就相当于没有开启线程而直接调用的run方法。

21.Vector和ArrayList的区别

ArrayList和Vector是基于数组的,有下标,有序,元素可重复。

Vector就是把ArrayList中的所有方法加了synchronized

所以,Vector是线程安全的,ArrayList是线程不安全的,但Collections下有静态方法,synchronizedList来代替Vector,Vector在日常中很少使用。

22.System.out.println()分别代表什么?

System.out.println()是我们日常使用最多的输出语句,其中System是一个类,out是这个类中的一个静态常量对象,是PrintStream类型的,println()是PrintStream类的方法,用于输出。

23.比较throw和throws

throws是声明异常的关键字,其后是一个异常类,比如throws IOException

throw是抛出异常的关键字,其后跟着一个异常对象,比如throw new IOException()

24.垃圾回收的原理和优点

垃圾回收是一个低级别的线程运行,在不知情的情况下对堆内存中的闲置的或者长期没使用的对象进行回收。

优点:

1)不需要考虑内存管理;

2)防止内存泄漏,有效的管理内存;

3)对象不再有作用域的问题,只有对象的引用存在作用域;

4)程序员不能实时的对某个对象或所有对象调用垃圾回收器

25.super.getClass()方法调用

输出的结果是Test

原因:由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在 test方法中调用super.getClass().getName()方法,等效于调用getClass().getName()方法,所以,super.getClass().getName()方法返回的也应该是Test。

如果想得到父类的名称,应该用如下代码:

getClass().getSuperClass().getName();

26.sleep() 和 wait() 有什么区别?

1)sleep是Thread类下的方法;wait是Object下的方法

2)sleep是使线程休眠,不释放锁;wait是使线程等待,释放锁

3)sleep让出的是cpu,如果此时代码是加锁的,那么即使让出了CPU,其他线程也无法运行,因为没有得到锁;wait是让自己暂时等待,让出同步锁,等待其他线程执行完了,再来执行自己

27.线程的基本概念、线程的基本状态以及状态之间的关系

线程是执行和调度的基本单位,是进程中一个执行过程,一个进程有多个线程,线程间共享内存,如果是单核CPU,那么CPU一会访问a线程,一会访问b线程,线程直接切换很快,给人的感觉是他们在同步执行。

线程的基本状态分为:新生状态,就绪状态,运行状态,阻塞状态,死亡状态

关系:调用start()方法线程转为就绪状态

调用wait()方法线程转为就绪状态

调用sleep()方法线程转为阻塞状态

就绪,运行之间是相互转换的

28.Collection 和 Collections的区别

Collection是集合的最顶层接口,这个接口下有List和Set俩个子接口

29.两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句 话对不对?

如果对象保存在hashMap或hashSet中,那么她们的值相等,hashCode也一定相等

如果没有保存在hashMap或hashSet中,那么与hashCode没什么关系了,她们的hashCode值可以不等

30.说出一些常用的类,包,接口,请各举5个

常用的类:String,Arrays,Collections,System,Integer,BufferedReader,BufferedWriter,

常用的包:util,io,sql,awt,list,lang

常用的接口:List,Map,Set,Serializable,Comparable,Runnable

31.PreparedStatement与Statement的区别

PreparedStatement是预编译语句执行者,数据库对sql语句进行预编译;Statement是执行时对sql语句进行编译

Statement存在sql注入的问题,PreparedStatement解决了这个问题

PreparedStatement的执行效率比Statement高

PreparedStatement中使用?占位符,设置参数更方便

32.Java中的HashMap的工作原理是什么?

HashMap类有一个叫Entry的内部类。这个Entry类包含了key-value作为实例变量。每当往hashmap里放key-value对的时候,都会为它们实例化一个Entry对象,这个Entry对象就会存储在Entry数组table中。根据key的hashcode方法计算出hash值来决定具体在哪个位置。

33.线程的sleep()方法和yield()方法有什么区别?

1)sleep()会给比它优先级低的线程机会,yield()方法只会给跟它同等级或比它优先级高的线程机会

2)执行sleep后进入阻塞状态,执行yield后进入就绪

3)sleep方法声明抛出InterruptedException异常,yield没有声明抛出任何异常

4)sleep比yield方法具有更好的移植性

这是我见过最有用的java面试题 面试了无数公司总结的

什么是线程局部变量?(答案)

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。

2.用 wait-notify 写一段代码来解决生产者-消费者问题?(答案)

请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件。

3. 用 Java 写一个线程安全的单例模式(Singleton)?(答案)

请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类。当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java 中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。

4.Java 中 sleep 方法和 wait 方法的区别?(答案)

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

5.什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?(答案)

不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。详情参见答案,一步一步指导你在 Java 中创建一个不可变的类。

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

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

数据类型和 Java 基础面试问题

7.Java 中应该使用什么数据类型来代表价格?(答案)

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

8.怎么将 byte 转换为 String?(答案)

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

9.Java 中怎样将 bytes 转换为 long 类型?

这个问题你来回答 🙂

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

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

11.存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B;(answer答案)

12.哪个类包含 clone 方法?是 Cloneable 还是 Object?(答案)

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

13.Java 中 ++ 操作符是线程安全的吗?(答案)

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

14.a = a + b 与 a += b 的区别(答案)

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

byte a = 127;

byte b = 127;

b = a + b; // error : cannot convert from int to byte

b += a; // ok

(译者注:这个地方应该表述的有误,其实无论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)

15.我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?(答案)

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

16. 3*0.1 == 0.3 将会返回什么?true 还是 false?(答案)

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

17.int 和 Integer 哪个会占用更多的内存?(答案)

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

18.为什么 Java 中的 String 是不可变的(Immutable)?(answer答案)

Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。

19.我们能在 Switch 中使用 String 吗?(answer答案)

从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。

20.Java 中的构造器链是什么?(answer答案)

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

JVM 底层 与 gc(Garbage Collection) 的面试问题

21.64 位 JVM 中,int 的长度是多数?

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。

22.Serial 与 Parallel gc之间的不同之处?(答案)

Serial 与 Parallel 在gc执行的时候都会引起 stop-the-world。它们之间主要不同 serial 收集器是默认的复制收集器,执行 gc 的时候只有一个线程,而 parallel 收集器使用多个 gc 线程来执行。

23. 32 位和 64 位的 JVM,int 类型变量的长度是多数?(答案)

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

24.Java 中 WeakReference 与 SoftReference的区别?(答案)

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

25.WeakHashMap 是怎么工作的?(答案)

WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。

26.JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?(答案)

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

27.怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?(答案)

你可以检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息。

28.32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?(答案)

理论上说上 32 位的 JVM 堆内存可以到达 2^32,即 4GB,但实际上会比这个小很多。不同操作系统之间不同,如 Windows 系统大约 1.5 GB,Solaris 大约 3GB。64 位 JVM允许指定最大的堆内存,理论上可以达到 2^64,这是一个非常大的数字,实际上你可以指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。

29.JRE、JDK、JVM 及 JIT 之间有什么不同?(答案)

JRE 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

30.解释 Java 堆空间及 gc?(答案)

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

JVM 底层面试题及答案

31.你能保证 gc 执行吗?(答案)

不能,虽然你可以调用 System.gc() 或者 Runtime.gc(),但是没有办法保证 gc 的执行。

32.怎么获取 Java 程序使用的内存?堆使用的百分比?

可以通过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。通过这些方法你也可以获取到堆使用的百分比及堆内存的剩余空间。

Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory() 方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

33.Java 中堆和栈有什么区别?(答案)

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

关于内存的的面试问题和答案

Java 基本概念面试题

34. “a==b”和”a.equals(b)”有什么区别?(答案)

如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。

35.a.hashCode() 有什么用?与 a.equals(b) 有什么关系?(答案)

hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。

36.final、finalize 和 finally 的不同之处?(答案)

final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。

37.Java 中的编译期常量是什么?使用它又什么风险?

公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。

Java 集合框架的面试题

这部分也包含数据结构、算法及数组的面试问题

38.List、Set、Map 和 Queue 之间的区别(答案)

List 是一个有序集合,允许元素重复。它的某些实现可以提供基于下标值的常量访问时间,但是这不是 List 接口保证的。Set 是一个无序集合。

39.poll() 方法和 remove() 方法的区别?

poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

40.Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?(答案)

PriorityQueue 保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。

41.ArrayList 与 LinkedList 的不区别?(答案)

最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节的讨论参见答案。

42.用哪两种方式来实现集合的排序?(答案)

你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。

43.Java 中怎么打印数组?(answer答案)

你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。

44.Java 中的 LinkedList 是单向链表还是双向链表?(答案)

是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。

45.Java 中的 TreeMap 是采用什么树实现的?(答案)

Java 中的 TreeMap 是使用红黑树实现的。

46. Hashtable 与 HashMap 有什么不同之处?(答案)

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

a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。

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

c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。

47.Java 中的 HashSet,内部是如何工作的?(answer答案)

HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key,意思就是 HashSet 中只允许存储一个 null 对象。

48.写一段代码在遍历 ArrayList 时移除一个元素?(答案)

该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的 remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。

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

可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。

50.ArrayList 和 HashMap 的默认大小是多数?(答案)

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段:

// from ArrayList.java JDK 1.7

private static final int DEFAULT_CAPACITY = 10;

//from HashMap.java JDK 7

static final int DEFAULT_INITIAL_CAPACITY = 14; // aka 16

最后

给大家分享一些Java学习资料,这些资料都是我做Java这几年整理的Java求职简历模板,Java电子书,PDF文档教程,Java零基础到精通视频课程,Java程序员面经,Java练手项目,Java笔试题,Java最新学习路线,Java开发工具,Java面试题,Java学习笔记等,特别适合Java初学者,请收藏学习,现在分享给你:

Java是什么 什么是Java

Java是一种为多个平台生成软件的编程语言。当程序员编写 Java 应用程序时,编译的代码可在大多数操作系统上运行,包括 Windows,Linux 和 Mac OS。Java 从 C 和 C ++编程语言中衍生出大部分语法。

Java生成浏览器运行程序在带有 Java 虚拟机的 Web 浏览器中运行,它们促进了 Internet 用户的图形用户界面和对象交互。

Java 程序开发需要 Java 软件开发工具包,它通常包括编译器,解释器,文档生成器和用于生成完整应用程序的其他工具。

常见的Java编辑器IDE,它是通过拖放和点击操作促进 GUI开发的,GUI 包括按钮,文本框,面板,框架,滚动条和其他对象。

Java 程序可在台式机,服务器,移动设备,智能卡和蓝光光盘中找到。


|Java面试题

               

Java面试题|
  • 如何判断方程是否属于可分离变量微分方程?|
  • 如何判断方程是否属于可分离变量微分方程?| | 如何判断方程是否属于可分离变量微分方程?| ...

    Java面试题|
  • i7,7700是几核几线程|
  • i7,7700是几核几线程| | i7,7700是几核几线程| ...

    Java面试题|
  • 程序中异步和同步是啥意思|
  • 程序中异步和同步是啥意思| | 程序中异步和同步是啥意思| ...