Java面试题(一)java
一、面向对象的特征有哪些方面?程序员
二、访问修饰符 public,private,protected,以及不写(默认)时的区别?面试
三、String 是最基本的数据类型吗?正则表达式
四、float f=3.4;是否正确?算法
五、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?sql
六、Java 有没有 goto?数据库
七、int 和 Integer 有什么区别?编程
八、&和&&的区别?设计模式
九、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。数组
十、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
十一、switch 是否能做用在 byte 上,是否能做用在 long 上,是否能做用在 String 上?
十二、用最有效率的方法计算 2 乘以 8?
1三、数组有没有 length()方法?String 有没有 length()方法?
1四、在 Java 中,如何跳出当前的多重嵌套循环?
1五、构造器(constructor)是否可被重写(override)?
1六、两个对象值相同(x.equals(y) == true),但却可有不一样的 hashcode,这句话对不对?
1七、是否能够继承 String 类?
1八、当一个对象被看成参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里究竟是值传递仍是引用传递?
1九、String 和 StringBuilder、StringBuffer 的区别?
20、重载(Overload)和重写(Override)的区别。重载的方法可否根据返回类型进行区分?
2一、描述一下 JVM 加载 class 文件的原理机制?
2二、char 型变量中能不能存贮一个中文汉字,为何?
2三、抽象类(abstract class)和接口(interface)有什么异同?
2四、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不一样?
2五、Java 中会存在内存泄漏吗,请简单描述。
2六、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized 修饰?
2七、阐述静态变量和实例变量的区别。
2八、是否能够从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
2九、如何实现对象克隆?
30、GC 是什么?为何要有 GC?
3一、String s = new String(“xyz”);建立了几个字符串对象?
32 、 接 口 是 否 可 继 承 ( extends ) 接 口 ? 抽 象 类 是 否 可 实 现(implements)接口?抽象类是否可继承具体类(concrete class)?
3三、一个”.java”源文件中是否能够包含多个类(不是内部类)?有什么限制?
3四、Anonymous Inner Class(匿名内部类)是否能够继承其它类?是否能够实现接口?
3五、内部类能够引用它的包含类(外部类)的成员吗?有没有什么限制?
3六、Java 中的 final 关键字有哪些用法?
3七、指出下面程序的运行结果
3八、数据类型之间的转换:
3九、如何实现字符串的反转及替换?
40、怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
4一、日期和时间:
4二、打印昨天的当前时刻。
4三、比较一下 Java 和 JavaSciprt。
4四、何时用断言(assert)?
4五、Error 和 Exception 有什么区别?
4六、try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally{}里的代码会不会被执行,何时被执行,在 return 前仍是后?
4七、Java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别如何使用?
4八、运行时异常与受检异常有何异同?
4九、列出一些你常见的运行时异常?
50、阐述 final、finally、finalize 的区别。
5一、类 ExampleA 继承 Exception,类 ExampleB 继承 ExampleA。
5二、List、Set、Map 是否继承自 Collection 接口?
5三、阐述 ArrayList、Vector、LinkedList 的存储性能和特性。
5四、Collection 和 Collections 的区别?
5五、List、Map、Set 三个接口存取元素时,各有什么特色?
5六、TreeMap 和 TreeSet 在排序时如何比较元素?Collections 工具类中的 sort()方法如何比较元素?
5七、Thread 类的 sleep()方法和对象的 wait()方法均可以让线程暂停执行,它们有什么区别?
5八、线程的 sleep()方法和 yield()方法有什么区别?
5九、当一个线程进入一个对象的 synchronized 方法 A 以后,其它线程是否可进入此对象 synchronized 方法 B?
60、请说出与线程同步以及线程调度相关的方法。
6一、编写多线程程序有几种实现方式?
6二、synchronized 关键字的用法?
6三、举例说明同步和异步。
6四、启动一个线程是调用 run()仍是 start()方法?
6五、什么是线程池(thread pool)?
6六、线程的基本状态以及状态之间的关系?
6七、简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?
6八、Java 中如何实现序列化,有什么意义?
6九、Java 中有几种类型的流?
70、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
7一、如何用 Java 代码列出一个目录下全部的文件?
7二、用 Java 的套接字编程实现一个多线程的回显(echo)服务器。
7三、XML 文档定义有几种形式?它们之间有何本质区别?解析 XML文档有哪几种方式?
7四、你在项目中哪些地方用到了 XML?
7五、阐述 JDBC 操做数据库的步骤。
7六、Statement 和 PreparedStatement 有什么区别?哪一个性能更好?
7七、使用 JDBC 操做数据库时,如何提高读取数据的性能?如何提高更新数据的性能?
7八、在进行数据库编程时,链接池有什么做用?
7九、什么是 DAO 模式?
80、事务的 ACID 是指什么?
8二、JDBC 可否处理 Blob 和 Clob?
8三、简述正则表达式及其用途。
8四、Java 中是如何支持正则表达式操做的?
8五、得到一个类的类对象有哪些方式?
8八、如何经过反射调用对象的方法?
90、简述一下你了解的设计模式。
9一、用 Java 写一个单例类。
9二、什么是 UML?
9三、UML 中有哪些经常使用的图?
9五、用 Java 写一个折半查找。
Java 面试题(二)
一、Java 中能建立 volatile 数组吗?
二、volatile 能使得一个非原子操做变成原子操做吗?
三、volatile 修饰符的有过什么实践?
四、volatile 类型变量提供什么保证?
五、10 个线程和 2 个线程的同步代码,哪一个更容易写?
六、你是如何调用 wait()方法的?使用 if 块仍是循环?为何?
八、什么是 Busy spin?咱们为何要使用它?
九、Java 中怎么获取一份线程 dump 文件?
十、Swing 是线程安全的?
十一、什么是线程局部变量?
十二、用 wait-notify 写一段代码来解决生产者-消费者问题?
1三、用 Java 写一个线程安全的单例模式(Singleton)?
1四、Java 中 sleep 方法和 wait 方法的区别?
1五、什么是不可变对象(immutable object)?Java 中怎么建立一个不可变对象?
1六、咱们能建立一个包含可变对象的不可变对象吗?
1七、Java 中应该使用什么数据类型来表明价格?
1八、怎么将 byte 转换为 String?
1九、Java 中怎样将 bytes 转换为 long 类型?
20、咱们能将 int 强制转换为 byte 类型的变量吗?若是该值大于byte 类型的范围,将会出现什么现象?
2一、存在两个类,B 继承 A ,C 继承 B,咱们能将 B 转换为 C 么?如 C = (C) B;
2二、哪一个类包含 clone 方法?是 Cloneable 仍是 Object?
2三、Java 中 ++ 操做符是线程安全的吗?
2三、不是线程安全的操做。它涉及到多个指令,如读取变量值,增长,而后存储回内存,这个过程可能会出现多个线程交差。
2四、a = a + b 与 a += b 的区别
2五、我能在不进行强制转换的状况下将一个 double 值赋值给 long类型的变量吗?
2六、3*0.1 == 0.3 将会返回什么?true 仍是 false?
2七、int 和 Integer 哪一个会占用更多的内存?
2八、为何 Java 中的 String 是不可变的(Immutable)?
3一、64 位 JVM 中,int 的长度是多数?
3二、Serial 与 Parallel GC 之间的不一样之处?
3三、32 位和 64 位的 JVM,int 类型变量的长度是多数?
3四、Java 中 WeakReference 与 SoftReference 的区别?
3五、WeakHashMap 是怎么工做的?
3六、JVM 选项 -XX:+UseCompressedOops 有什么做用?为何要使用?
3七、怎样经过 Java 程序来判断 JVM 是 32 位 仍是 64 位?
3八、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
3九、JRE、JDK、JVM 及 JIT 之间有什么不一样?
40、解释 Java 堆空间及 GC?
4一、你能保证 GC 执行吗?
4二、怎么获取 Java 程序使用的内存?堆使用的百分比?
4三、Java 中堆和栈有什么区别?
4四、“a==b”和”a.equals(b)”有什么区别?
4五、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?
4六、final、finalize 和 finally 的不一样之处?
4七、Java 中的编译期常量是什么?使用它又什么风险?
4八、List、Set、Map 和 Queue 之间的区别(答案)
4九、poll() 方法和 remove() 方法的区别?
50、Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?
5一、ArrayList 与 LinkedList 的不区别?
5二、用哪两种方式来实现集合的排序?
5三、Java 中怎么打印数组?
5四、Java 中的 LinkedList 是单向链表仍是双向链表?
5五、Java 中的 TreeMap 是采用什么树实现的?(答案)
5六、Hashtable 与 HashMap 有什么不一样之处?
5七、Java 中的 HashSet,内部是如何工做的?
5八、写一段代码在遍历 ArrayList 时移除一个元素?
5九、咱们能本身写一个容器类,而后使用 for-each 循环码?
60、ArrayList 和 HashMap 的默认大小是多数?
6一、有没有可能两个不相等的对象有有相同的 hashcode?
6二、两个相同的对象会有不一样的的 hash code 吗?
6三、咱们能够在 hashcode() 中使用随机数字吗?
6四、Java 中,Comparator 与 Comparable 有什么不一样?
6六、在我 Java 程序中,我有三个 socket,我须要多少个线程来处理?
6七、Java 中怎么建立 ByteBuffer?
6八、Java 中,怎么读写 ByteBuffer ?
6九、Java 采用的是大端仍是小端?
70、ByteBuffer 中的字节序是什么?
7一、Java 中,直接缓冲区与非直接缓冲器有什么区别?
7二、Java 中的内存映射缓存区是什么?
7三、socket 选项 TCP NO DELAY 是指什么?
7四、TCP 协议与 UDP 协议有什么区别?
7五、Java 中,ByteBuffer 与 StringBuffer 有什么区别?(答案)
7六、Java 中,编写多线程程序的时候你会遵循哪些最佳实践?
7七、说出几点 Java 中使用 Collections 的最佳实践
7八、说出至少 5 点在 Java 中使用线程的最佳实践。
7九、说出 5 条 IO 的最佳实践(答案)
80、列出 5 个应该遵循的 JDBC 最佳实践
8一、说出几条 Java 中方法重载的最佳实践?
8二、在多线程环境下,SimpleDateFormat 是线程安全的吗?
8三、Java 中如何格式化一个日期?如格式化为 ddMMyyyy 的形式?
8四、Java 中,怎么在格式化的日期中显示时区?
8五、Java 中 java.util.Date 与 java.sql.Date 有什么区别?
8六、Java 中,如何计算两个日期之间的差距?
8七、Java 中,如何将字符串 YYYYMMDD 转换为日期?
8九、如何测试静态方法?(答案)
90、怎么利用 JUnit 来测试一个方法的异常?
9一、你使用过哪一个单元测试库来测试你的 Java 程序?
9二、@Before 和 @BeforeClass 有什么区别?
9三、怎么检查一个字符串只包含数字?解决方案
9四、Java 中如何利用泛型写一个 LRU 缓存?
9五、写一段 Java 程序将 byte 转换为 long?
9六、在不使用 StringBuffer 的前提下,怎么反转一个字符串?
9七、Java 中,怎么获取一个文件中单词出现的最高频率?
9八、如何检查出两个给定的字符串是反序的?
9九、Java 中,怎么打印出一个字符串的全部排列?
100、Java 中,怎样才能打印出数组中的重复元素?
10一、Java 中如何将字符串转换为整数?
10二、在没有使用临时变量的状况如何交换两个整数变量的值?
10三、接口是什么?为何要使用接口而不是直接使用具体类?
10四、Java 中,抽象类与接口之间有什么不一样?
10五、除了单例模式,你在生产环境中还用过什么设计模式?
10六、你能解释一下里氏替换原则吗?
10七、什么状况下会违反迪米特法则?为何会有这个问题?
10八、适配器模式是什么?何时使用?
10九、什么是“依赖注入”和“控制反转”?为何有人使用?
1十、抽象类是什么?它与接口有什么区别?你为何要使用过抽象类?
1十一、构造器注入和 setter 依赖注入,那种方式更好?
1十二、依赖注入和工程模式之间有什么不一样?
11三、适配器模式和装饰器模式有什么区别?
11四、适配器模式和代理模式以前有什么不一样?
11五、什么是模板方法模式?
11六、何时使用访问者模式?
11七、何时使用组合模式?
11八、继承和组合之间有什么不一样?
11九、描述 Java 中的重载和重写?
120、Java 中,嵌套公共静态类与顶级类有什么不一样?
12一、 OOP 中的 组合、聚合和关联有什么区别?
12二、给我一个符合开闭原则的设计模式的例子?
12三、抽象工厂模式和原型模式之间的区别?
12五、嵌套静态类与顶级类有什么区别?
12六、你能写出一个正则表达式来判断一个字符串是不是一个数字吗?
12七、Java 中,受检查异常 和 不受检查异常的区别?
12八、Java 中,throw 和 throws 有什么区别
12九、Java 中,Serializable 与 Externalizable 的区别?
130、Java 中,DOM 和 SAX 解析器有什么不一样?
13一、说出 JDK 1.7 中的三个新特性?
13二、说出 5 个 JDK 1.8 引入的新特性?
13三、Java 中,Maven 和 ANT 有什么区别?
本次更新Java 面试题(一)的1~20题答案
一、面向对象的特征有哪些方面?
面向对象的特征主要有如下几个方面:
抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
继承:继承是从已有类获得继承信息建立新类的过程。提供继承信息的类被称为父类(超类、基类);获得继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了必定的延续性,同时继承也是封装程序中可变因素的重要手段(若是不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中关于桥梁模式的部分)。
封装:一般认为封装是把数据和操做数据的方法绑定起来,对数据的访问只能经过已定义的接口。面向对象的本质就是将现实世界描绘成一系列彻底自治、封闭的对象。咱们在类中编写的方法就是对实现细节的一种封装;咱们编写一个类就是对数据和数据操做的封装。能够说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(能够想一想普通洗衣机和全自动洗衣机的差异,明显全自动洗衣机封装更好所以操做起来更简单;咱们如今使用的智能手机也是封装得足够好的,由于几个按键就搞定了全部的事情)。
多态性:多态性是指容许不一样子类型的对象对同一消息做出不一样的响应。简单的说就是用一样的对象引用调用一样的方法可是作了不一样的事情。多态性分为编译时的多态性和运行时的多态性。若是将对象的方法视为对象向外界提供的服务,那么运行时的多态性能够解释为:当 A 系统访问 B 系统提供的服务时,B系统有多种提供服务的方式,但一切对 A 系统来讲都是透明的(就像电动剃须刀是 A 系统,它的供电系统是 B 系统,B 系统可使用电池供电或者用交流电,甚至还有多是太阳能,A 系统只会经过 B 类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟经过何种方式得到了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态须要作两件事:
1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法); 2). 对象造型(用父类型引用引用子类型对象,这样一样的引用调用一样的方法就会根据子类对象的不一样而表现出不一样的行为)。
二、访问修饰符 public,private,protected,以及不写(默认)时的区别?
修饰符 当前类 同 包 子 类 其余包
类的成员不写访问修饰时默认为 default。默认对于同一个包中的其余类至关于公开(public),对于不是同一个包中的其余类至关于私有(private)。受保护(protected)对子类至关于公开,对不是同一包中的没有父子关系的类至关于私有。Java 中,外部类的修饰符只能是 public 或默认,类的成员(包括内部类)的修饰符能够是以上四种。
三、String 是最基本的数据类型吗?
不是。Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(referencetype),Java 5 之后引入的枚举类型也算是一种比较特殊的引用类型。
四、float f=3.4;是否正确?
不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会形成精度损失,所以须要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;。
五、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
对于 short s1 = 1; s1 = s1 + 1;因为 1 是 int 类型,所以 s1+1 运算结果也是 int型,须要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;能够正确编译,由于 s1+= 1;至关于 s1 = (short(s1 + 1);其中有隐含的强制类型转换。
六、Java 有没有 goto?
goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。(根据 James Gosling(Java 之父)编写的《The Java Programming Language》一书的附录中给出了一个 Java 关键字列表,其中有goto 和 const,可是这两个是目前没法使用的关键字,所以有些地方将其称之为保留字,其实保留字这个词应该有更普遍的意义,由于熟悉 C 语言的程序员都知道,在系统类库中使用过的有特殊意义的但词或单词的组合都被视为保留字)
七、int 和 Integer 有什么区别?
Java 是一个近乎纯洁的面向对象编程语言,可是为了编程的方便仍是引入了基本数据类型,可是为了可以将这些基本数据类型当成对象操做,Java 为每个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得两者能够相互转换。
Java 为每一个原始类型提供了包装类型:
原始类型: boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
class AutoUnboxingTest { public static void main(String[] args) { Integer a = new Integer(3); Integer b = 3; // 将 3 自动装箱成 Integer 类型 int c = 3; System.out.println(a == b); // false 两个引用没有引用同一对 象 System.out.println(a == c); // true a 自动拆箱成 int 类型再和 c 比较 } }
最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码以下所示:
public class Test03 { public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 == f2); System.out.println(f3 == f4); } }
若是不明就里很容易认为两个输出要么都是 true 要么都是 false。首先须要注意的是 f一、f二、f三、f4 四个变量都是 Integer 对象引用,因此下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当咱们给一个 Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf,若是看 valueOf 的源代码就知道发生了什么。
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
IntegerCache 是 Integer 的内部类,其代码以下所示:
/** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseint(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for (int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() { } }
简单的说,若是整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer对象,而是直接引用常量池中的 Integer 对象,因此上面的面试题中 f1f4 的结果是 false。
提醒:越是貌似简单的面试题其中的玄机就越多,须要面试者有至关深厚的功力。
八、&和&&的区别?
&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差异是很是巨大的,虽然两者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之因此称为短路运算是由于,若是&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。不少时候咱们可能都须要用&&而不是&,例如在验证用户登陆时断定用户名不是 null 并且不是空字符串,应当写为:username != null &&!username.equals(“”),两者的顺序不能交换,更不能用&运算符,由于第一个条件若是不成立,根本不能进行字符串的 equals 比较,不然会生 NullPointerException 异常。注意:逻辑或运算符(|)和短路或运算符(||)的差异也是如此。
九、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
一般咱们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用 JVM 中的栈空间;而经过 new 关键字和构造器建立的对象则放在堆空间,堆是垃圾收集器管理的主要区域,因为如今的垃圾收集器都采用分代收集算法,因此堆空间还能够细分为新生代和老生代,再具体一点能够分为 Eden、Survivor(又可分为 From Survivor 和 To Survivor)、Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被 JVM 加载的类信息、常量、静态变量、JIT 编译器编译后的代码等数据;程序中的字面量(literal)如直接书写的 100、”hello”和常量都是放在常量池中,常量池是方法区的一部分,。栈空间操做起来最快可是栈很小,一般大量的对象都是放在堆空间,栈和堆的大小均可以经过 JVM的启动参数来进行调整,栈空间用光了会引起 StackOverflowError,而堆和常量池空间不足则会引起 OutOfMemoryError。
String str = new String("hello");
上面的语句中变量 str 放在栈上,用 new 建立出来的字符串对象放在堆上,而”hello”这个字面量是放在方法区的。
补充 1:较新版本的 Java(从 Java 6 的某个更新开始)中,因为 JIT 编译器的发展和”逃逸分析”技术的逐渐成熟,栈上分配、标量替换等优化技术使得对象必定分配在堆上这件事情已经变得不那么绝对了。
补充 2:运行时常量池至关于 Class 文件常量池具备动态性,Java 语言并不要求常量必定只有编译期间才能产生,运行期间也能够将新的常量放入池中,String类的 intern()方法就是这样的。
看看下面代码的执行结果是什么而且比较一下 Java 7 之前和之后的运行结果是否一致。
String s1 = new StringBuilder("go") .append("od").toString(); System.out.println(s1.intern() == s1); String s2 = new StringBuilder("ja") .append("va").toString(); System.out.println(s2.intern() == s2);
十、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 而后进行下取整。
十一、switch 是否能做用在 byte 上,是否能做用在 long 上,是否能做用在 String 上?
在 Java 5 之前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也能够是 enum 类型,从 Java 7 开始,expr 还能够是字符串(String),可是长整型(long)在目前全部的版本中都是不能够的。
十二、用最有效率的方法计算 2 乘以 8?
2 << 3(左移 3 位至关于乘以 2 的 3 次方,右移 3 位至关于除以 2 的 3 次方)。
补充:咱们为编写的类重写 hashCode 方法时,可能会看到以下所示的代码,其实咱们不太理解为何要使用这样的乘法运算来产生哈希码(散列码),并且为何这个数是个素数,为何一般选择 31 这个数?前两个问题的答案你能够本身百度一下,选择 31 是由于能够用移位和减法运算来代替乘法,从而获得更好的性能。说到这里你可能已经想到了:31 * num 等价于(num << 5) - num,左移 5位至关于乘以 2 的 5 次方再减去自身就至关于乘以 31,如今的 VM 都能自动完成这个优化。
public class PhoneNumber { private int areaCode; private String prefix; private String lineNumber; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + areaCode; result = prime * result + ((lineNumber == null) ? 0 : lineNumber.hashCode()); result = prime * result + ((prefix == null) ? 0 : prefix.hashCode()); return result; } @Override public Boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PhoneNumber other = (PhoneNumber) obj; if (areaCode != other.areaCode) return false; if (lineNumber == null) { if (other.lineNumber != null) return false; } else if (!lineNumber.equals(other.lineNumber)) return false; if (prefix == null) { if (other.prefix != null) return false; } else if (!prefix.equals(other.prefix)) return false; return true; } }
1三、数组有没有 length()方法?String 有没有 length()方法?
数组没有 length()方法 ,有 length 的属性。String 有 length()方法。JavaScript中,得到字符串的长度是经过 length 属性获得的,这一点容易和 Java 混淆。欢迎你们关注个人公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。
1四、在 Java 中,如何跳出当前的多重嵌套循环?
在最外层循环前加一个标记如 A,而后用 break A;能够跳出多重循环。(Java 中支持带标签的 break 和 continue 语句,做用有点相似于 C 和 C++中的 goto 语句,可是就像要避免使用 goto 同样,应该避免使用带标签的 break 和 continue,由于它不会让你的程序变得更优雅,不少时候甚至有相反的做用,因此这种语法其实不知道更好)
1五、构造器(constructor)是否可被重写(override)?
构造器不能被继承,所以不能被重写,但能够被重载。
1六、两个对象值相同(x.equals(y) == true),但却可有不一样的hash code,这句话对不对?
不对,若是两个对象 x 和 y 知足 x.equals(y) == true,它们的哈希码(hash code)应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:
(1)若是两个对象相同(equals 方法返回 true),那么它们的 hashCode 值必定要相同;
(2)若是两个对象的 hashCode 相同,它们并不必定相同。固然,你未必要按照要求去作,可是若是你违背了上述原则就会发如今使用容器时,相同的对象能够出如今 Set 集合中,同时增长新元素的效率会大大降低(对于使用哈希存储的系统,若是哈希码频繁的冲突将会形成存取性能急剧降低)。
补充:关于 equals 和 hashCode 方法,不少 Java 程序都知道,但不少人也就是仅仅知道而已,在 Joshua Bloch 的大做《Effective Java》(不少软件公司,《Effective Java》、《Java 编程思想》以及《重构:改善既有代码质量》是 Java程序员必看书籍,若是你还没看过,那就赶忙去买一本吧)中是这样介绍equals 方法的:首先 equals 方法必须知足自反性(x.equals(x)必须返回 true)、
对称性(x.equals(y)返回 true 时,y.equals(x)也必须返回 true)、传递性(x.equals(y)和 y.equals(z)都返回 true 时,x.equals(z)也必须返回 true)和一致性(当 x 和 y 引用的对象信息没有被修改时,屡次调用 x.equals(y)应该获得一样的返回值),并且对于任何非 null 值的引用 x,x.equals(null)必须返回 false。
实现高质量的 equals 方法的诀窍包括:
(1) 使用==操做符检查”参数是否为这个对象的引用”;
(2) 使用 instanceof 操做符检查”参数是否为正确的类型”;
(3) 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;
(4) 编写完 equals方法后,问本身它是否知足对称性、传递性、一致性;
(5) 重写 equals 时老是要重写 hashCode;
(6) 不要将 equals 方法参数中的 Object 对象替换为其余的类型,在重写时不要忘掉@Override 注解。
1七、是否能够继承 String 类?
String 类是 final 类,不能够被继承。
补充:继承 String 自己就是一个错误的行为,对 String 类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。
1八、当一个对象被看成参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里究竟是值传递仍是引用传递?
是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例做为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性能够在被调用过程当中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中能够经过传引用或传输出参数来改变传入的参数的值。在 C#中能够编写以下所示的代码,可是在 Java 中却作不到。
using System; namespace CS01 { class Program { public static void swap(ref int x, ref int y) { int temp = x; x = y; y = temp; } public static void Main (string[] args) { int a = 5, b = 10; swap (ref a, ref b); // a = 10, b = 5; Console.WriteLine ("a = {0}, b = {1}", a, b); } } }
说明:Java 中没有传引用实在是很是的不方便,这一点在 Java 8 中仍然没有获得改进,正是如此在 Java 编写的代码中才会出现大量的 Wrapper 类(将须要经过方法调用修改的引用置于一个 Wrapper 类中,再将 Wrapper 对象传入方法),这样的作法只会让代码变得臃肿,尤为是让从 C 和 C++转型为 Java 程序员的开发者没法容忍。
1九、String 和 StringBuilder、StringBuffer 的区别?
Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它们能够储存和操做字符串。其中 String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。而 StringBuffer/StringBuilder 类表示的字符串对象能够直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方法彻底相同,区别在于它是在单线程环境下使用的,由于它的全部方面都没有被synchronized 修饰,所以它的效率也比 StringBuffer 要高。
面试题 1 - 什么状况下用+运算符进行字符串链接比调用
StringBuffer/StringBuilder 对象的 append 方法链接字符串性能更好?
面试题 2 - 请说出下面程序的输出。
class StringEqualTest { public static void main(String[] args) { String s1 = "Programming"; String s2 = new String("Programming"); String s3 = "Program"; String s4 = "ming"; String s5 = "Program" + "ming"; String s6 = s3 + s4; System.out.println(s1 == s2); System.out.println(s1 == s5); System.out.println(s1 == s6); System.out.println(s1 == s6.intern()); System.out.println(s2 == s2.intern()); } }
补充:解答上面的面试题须要清除两点:
(1)String 对象的 intern 方法会获得字符串对象在常量池中对应的版本的引用(若是常量池中有一个字符串与 String 对象的 equals 结果是 true),若是常量池中没有对应的字符串,则该字符串将被添加到常量池中,而后返回常量池中字符串的引用;
(2)字符串的+操做其本质是建立了 StringBuilder 对象进行 append 操做,而后将拼接后的 StringBuilder 对象用toString 方法处理成 String 对象,这一点能够用 javap -c StringEqualTest.class命令得到 class 文件对应的 JVM 字节码指令就能够看出来。
20、重载(Overload)和重写(Override)的区别。重载的方法可否根据返回类型进行区分?
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,然后者实现的是运行时的多态性。重载发生在一个类中,同名的方法若是有不一样的参数列表(参数类型不一样、参数个数不一样或者两者都不一样)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。
面试题:华为的面试题中曾经问过这样一个问题 - “为何不能根据返回类型来区分重载”,快说出你的答案吧!
最后
欢迎你们一块儿交流,喜欢文章记得点个赞哟,感谢支持!