java面试题(吐血整理)--基础知识
1.JVM、JRE和JDK的关系
JDK包括JRE,有编译工具(javac.exe),打包工具(jar.exe),GUI运行工具(javaw.exe),JRE没有
2.Java语言有哪些特点
1.跨平台
2.面向对象(封装,继承,多态)
3.什么是字节码?采用字节码的最大好处是什么
字节码:java源代码->编译器->字节码(即扩展为.class的文件),只面向虚拟机
好处:1.跨平台 2.一定程度上解决了传统解释型语言执行效率低的问题
运行过程:java源代码---->编译器---->字节码---->jvm解释器----->二进制机器码---->程序运行
4.Java有哪些数据类型
- 基本数据类型 数值型 整数类型(byte,short,int,long)
- 浮点类型(float,double)
- 类(class)
5.switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
在 Java 5 以前,只支持byte、short、int、char,从 Java5 开始,可以是 enum,从 Java 7 开始,可以是String,long暂不支持
6.Math.round(11.5) 等于多少?Math.round(-11.5)等于多少
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。想象数轴向右取整
7.float f=3.4;是否正确
不正确。 float f =3.4f正确。因为在java中浮点数默认是双精度,即double,3.4 是double,double转float大转小需要强转,同时可能丢失精度
8.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗
有错,因为1 是 int ,s1+1也是int,而s1是short,大转小需要强转;无错,因为此种写法包含隐式强转
9.访问修饰符 private,default,protected,public的区别
可见性不同
10.&和&&的区别
&&:当左边的表达式的值为 false,右边的表达式就不再判断
&:当左边的表达式的值为 false,右边的表达式依然判断,并可能抛出异常
||和|的差别也是如此
11.final 有什么用
final修饰类、属性和方法,表示类不可以被继承,属性不可以被改变,方法不可以被重写.属性若是引用类型其中的值还是可以改变的
12.final finally finalize区别
- final修饰类、属性和方法,表示类不可以被继承,属性不可以被改变,方法不可以被重写
- finally异常处理语句结构的一部分,表示总是执行,一般用来存放一些关闭资源的代码
- finalize:垃圾回收
13.this关键字的用法
1.表示当前对象本身
2.构造方法中形参若与成员名字重名,用this来区分
3.表示引用本类的构造函数
14.介绍下static
被static修饰的变量和方法被称作类变量和类方法,属于类,不属于任何一个实例对象,而是被类的实例对象所共享
1.创建独立于对象的属性或方法。即使没有创建对象,也能使用属性和方法
2.创建静态代码块以优化程序性能.一个类中可以有多个static代码块,并且可以置于类中的任何地方,只会在类加载的时候执行一次
3.静态只能访问静态,非静态既可以访问非静态的,也可以访问静态的。
静态变量(类变量)和实例变量的区别
1.语法不同
静态变量: 是被 static 修饰符修饰的变量,也称为类变量,属于类,不属于类的任何一个实例;
实例变量: 属于某一个类的实例,需要先创建类的实例才能访问到它。
2.运行和销毁的时机不同:
类变量:
程序启动时会创建类变量,停止时会销毁类变量;
实例变量:
创建类的实例时才会创建实例变量,销毁由gc管理
3.作用域不同:
类变量为所有对象共有,任何一个对象将它的值改变,其它对象得到的就是改变后的值;
实例变量则属于对象私有,该对象将它的值改变,其它对象得到的还是原来的值
15.break ,continue ,return 的区别及作用
break 跳出当前循环
continue 跳出本次循环,进入下次循环
return 不再执行下面的代码
16.在 Java 中,如何跳出当前的多重嵌套循环
在外层循环前定义一个标识,然后在内层循环中break标识
[code]public static void main(String[] args) { ok: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { System.out.println("i=" + i + ",j=" + j); if (j == 5) { break ok; } } } }
17."=="和 equals 方法究竟有什么区别
==比较两个基本类型变量的值或两个引用类型变量的内存地址是否相等
equals若是没有被重写,与==等效;如果被重写,则比较两个对象的值是否相等
18.Integer 与 int 的区别
Integer是int的封装类。int 的默认值为0,Integer 的默认值为 null。int 不适合作为 web 层的表单数据的类型
19.下面的代码有什么不妥之处
1. if(username.equals(“zxx”){}
username 可能为 NULL,会报空指针错误;改为"zxx".equals(username);字符串比较已知量在左边
2. int x = 1;
return x==1?true:false; 这个改成 return x==1;就可以!
20.java中有没有引用传递
java中只有值传递.当一个方法的形参是一个对象时,在方法里修改该对象的属性并不会影响原来的对象
21.String s = "Hello";s = s + " world!";这两行代码执行后,原始的 String 对象中的内容到底变了没有?
没有,s 不指向原来那个对象了,java8之前s指向了另一个 String 对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指向它了。java8之后编译器使用了StringBuilder的append()方法把Hello和world!添加到StringBuilder里了,s不再指向了另一个 String 对象,所以java8之后字符串拼接不会产生新对象了
22.什么情况下用“+”运算符进行字符串连接比调用 StringBuffer/StringBuilder 对象的 append 方法连接字符串性能更好?
没有的。在 java8中无论使用何种方式进行字符串连接,实际上都使用的是 StringBuilder的append方法
从运行结果来看,"+"和 StringBuilder 是完全等效的;从运行效率来看,不推荐在for循环里使用”+”,因为会在for循环内创建N个StringBuilder 对象,应该在循环外定义StringBuilder ,循环内使用append方法
23.数组有没有 length() 方法?String 有没有 length() 方法
数组没有length()方法,有length属性;String有length()方法,没有length属性
24.throw 和 throws 的区别
throw:
throw 语句用在方法体内,表示主动抛出一个异常的实例
throws:
throws 语句用在方法名后面,表示这个方法可能会抛出某种类型的异常,主要是想让使用者要知道需要捕获的异常的类型.
throws 表示出现异常的一种可能性,并不一定会发生这种异常
25.Error 和 Exception 的区别
Error 类和 Exception 类的父类都是 Throwable 类
Error 类一般是仅靠程序本身无法恢复和克服,如系统崩溃
Exception 类又分为运行时异常(Runtime Exception)和编译时异常(Checked Exception ),通常是可以克服的
运行时异常,编译能通过,程序运行过程中报错;编译时异常,编译时就发生的异常,需要捕获或抛出
26.运行时异常有哪些
NullPointerException 空指针异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 类型转换异常
ClassNotFoundException 类找不到异常
NumberFormatException 字符串转换为数字异常
27.请说出下面程序的输出
s1==s6为什么是false?因为s6=s3+s4,s3+s4会返回一个新的字符串对象,而不是用常量池里的字符串
s1==s2.intern()为什么是false?因为
intern()方法会得到字符串在常量池中的引用,如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中该字符串的引用
s2指向的是一个String对象,不是常量池里的字符串,而s2.intern()是常量池里的字符串,即对象的内存地址不等于字符串
28.java中有运算符重载吗
没有,对于String中的+和+=只是个语法糖,本质还是使用 StringBuilder的append方法
29.java程序初始化顺序是怎样的
先初始化父类和子类的静态变量和代码块(父类优先),再初始化父类的非静态变量和代码块、构造函数,最后初始化子类的非静态变量和代码块、构造函数
父类静态变量>父类静态代码块>子类静态变量>子类静态代码块>
父类非静态变量>父类非静态代码块>父类构造函数>
子类非静态变量>子类非静态代码块>子类构造函数
30.接口是否可继承接口?抽象类是否可以继承具体类?抽象类是否可实现接口?抽象类中是否可以有静态的 main 方法?
接口可以继承接口;抽象类可以继承具体类并可以实现接口;抽象类可以有静态的main方法
31.java 中 IO 流分为几种?它们的区别是什么
•按照流的流向分,可以分为输入流和输出流;
•按照操作单元划分,可以划分为字节流和字符流;
•按照流的角色划分为节点流和处理流。
•InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
•OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
字节流和字符流的区别:
字节流通过单个字节或者字节数组的形式来操作文件中内容,可以操作一切文件
字符流通过单个字符或者字符数组的形式来操作文件中的内容,存在一定的局限性,是专门操作文本文件的,默认的版本为GBK
一句话:字节流能处理所有类型的数据(如字符、图片、视频等),而字符流只能处理字符类型的数据
32.BIO,NIO,AIO 有什么区别
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,基于事件驱动机制,客户端和服务器端通过 Channel通讯,实现了多路复用。
AIO:Asynchronous IO 异步非堵塞 IO,是 NIO 的升级,也叫 NIO2,基于事件和回调机制。
33.IO与NIO的主要区别是什么
IO | NIO |
---|---|
面向字节流 | 面向缓冲区 |
同步阻塞 | 同步非阻塞 |
无Selector | 基于Selector |
34.NIO是怎么做到同步非阻塞的
IO是面向流的,每次从流中读字节,没有缓存,不能前后移动流中的数据
NIO是面向缓冲区的,数据读取到缓冲区,需要时可在缓冲区中前后移动,可以做到用一个线程来处理多个操作
35.Files的常用方法都有哪些?
Files. exists():检测文件路径是否存在。
Files. createFile():创建文件。
Files. createDirectory():创建文件夹。
Files. delete():删除一个文件或目录。
Files. copy():复制文件。
Files. move():移动文件。
Files. size():查看文件个数。
Files. read():读取文件。
Files. write():写入文件
36.什么是字符串常量池?
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。
37.String有哪些特性
- 不变性:String 是不可变对象,对它进行任何操作,都是创建一个新对象,再把引用指向该对象(java8之前),,java8之后编译后会调用StringBuilder.append()。
- 常量池性能优化:给String 对象赋值字符串后,该字符串会在字符串常量池中缓存,下次创建同样的对象时会直接返回缓存的引用。
- final:使用 final 来定义 String 类,表示 String 类不能被继承,提高了系统的安全性。
38.如何自定义注解
第一步,定义注解
第二步,使用注解——把注解打在需要用到的程序代码中;
第三步,解析注解——在编译期或运行时检测到注解进行特殊操作。
39.String str="i"与 String str=new String(“i”)一样吗?
不一样,内存的分配方式不一样。String str="i"的方式,是分配到常量池;而 String str=new String(“i”)分配到堆内存。
40.String s = new String(“xyz”);创建了几个字符串对象
三个对象,一个引用对象,一个堆对象,一个字符串常量池中的"xyz"对象。
41.如何将字符串反转?
使用 StringBuilder 或者 StringBuffer 的 reverse() 方法。
42.String 类的常用方法都有那些?indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
equals():字符串比较。
截取字符串:beginIndex从0开始,endIndex不包括
public String substring(int beginIndex):指定位置截到末尾
public String substring(int beginIndex, int endIndex)
43.String,StringBuilder和StringBuffer的区别
String是final修饰的,不可变,字符串操作会产出新的String对象(java8之前),内部使用char数组实现
StringBuilder和StringBuffer是可变字符串,内部也是使用char数组实现,StringBuilder的append方法是线程不安全的,效率更高,创建StringBuilder时建议定义StringBuilder的长度提高效率
对于String的字符串拼接,java8编译后用StringBuilder的append方法拼接字符串
44.下面代码创建了几个对象?输出是什么
String s1=new String(“abc”)
String s2=new String(“abc”)
System.out.println(s1==s2)
5个对象,创建了两个引用对象,两个堆对象,常量池里有一个对象abc,输出是false
45.说出下面代码的运行结果
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.println(s2 == "ab");//false
System.out.println(s3 == "ab");//true
System.out.println(s2 == s3);//false
s2=="ab"为什么是false?因为s2=s1+"b",s1不是常量池中的字符串对象
46.这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
两个,s是一个引用对象,"a"+"b"+"c"+"d"编译成一个常量池中的对象
47.final修饰的对象是否可变
修饰基本类型
被final修饰的变量叫常量,一旦确定值不能改变,且必须初始化
修饰引用类型
引用不能指向新的对象,但引用类型里的内容是可以改变的
48.说出下面代码的运行结果
如果整型字面量的值在-128到127之间,在自动装箱时不会创建新的对象,而是直接引用常量池中的值,此时==比较的是值;
超过这个范围,在自动装箱时就会创建新的对象,此时==比较的是对象的内存地址
那么超出这个范围的值怎么比较?使用equals方法,equals里会把包装类型转化成基本类型来比较
49.intValue()和parseInt、ValueOf()区别
比如intValue(),返回基本类型int;
比如Integer.parseInt(),返回基本类型int
比如Integer.valueOf(),如值在-128~127之间,返回缓存的Integer对象;不在此范围,返回新的Integer对象
parseInt效率比valueOf效率高
50.说出下面代码的执行结果
func1
func2
2
1
以上两段代码说明如果在异常处理语句中,有多个return只返回一个最后执行的return的值
51.JVM对象的引用分为几种类型
-
一、强引用
Java中默认声明的就是强引用,比如:
[code]Object obj = new Object(); //只要obj还指向Object对象,Object对象就不会被回收 obj = null; //手动置null
只要强引用存在,即引用有指向对象,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
二、软引用
软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。在 JDK1.2 之后,用java.lang.ref.SoftReference类来表示软引用
三、弱引用
弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。
四,虚引用
虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示
52.什么是hashCode()
hashCode()用来获取哈希码(散列码),哈希码是一个int整数,表示对象在哈希表(散列表)中的索引
哈希表(Hash table,也叫散列表),是一种根据键值对(Key value)进行访问的数据结构
HashSet如何去重?
在HashSet中加入元素时,如果发现有相同的hashcode值的对象,会用equal()检查这两个对象是否真的相同.如果两者相同,HashSet 就不会让其加入,如果不同,就会重新散列到其他位置,这样就减少了 equals 的次数,相应提高了执行速度。也就是说会先检查hashcode是否相同,如果相同,会用equals,并且再次判断,如果不同,就不会用equals
如果用在Set,Map接口,hashCode相等,equals不一定相等;equals相等,hashCode一定相等;如果不是,hashCode相等,equals不一定相等;equals相等,hashCode不一定相等
- java基础知识记录--输入输出IO流 (摘自张孝祥整理java面试题)
- java基础知识记录--String类 (摘自张孝祥整理java面试题)
- java基础知识记录--内部类(摘自张孝祥整理java面试题)
- java基础知识记录--流行框架与新技术(摘自张孝祥整理java面试题)
- java基础知识记录--EJB部分(摘自张孝祥整理java面试题)
- java基础知识记录--java代码查错 (摘自张孝祥整理java面试题)
- java基础知识记录--java代码查错 (摘自张孝祥整理java面试题)
- java基础知识记录--webservice部分(摘自张孝祥整理java面试题)
- java基础知识记录--linux部分(摘自张孝祥整理java面试题)
- java基础知识记录--J2EE(摘自张孝祥整理java面试题)
- java基础知识记录--软件工程与设计模式(摘自张孝祥整理java面试题)
- 面试题整理【1】JAVA基础知识
- java基础知识记录--集合 (摘自张孝祥整理java面试题)
- java基础知识记录--基本语法 (摘自张孝祥整理java面试题)
- java基础知识记录--类相关语法 (摘自张孝祥整理java面试题)
- java基础知识记录--XML部分(摘自张孝祥整理java面试题)
- java基础知识记录--Java web部分(摘自张孝祥整理java面试题)
- java基础知识记录--基本语法 (摘自张孝祥整理java面试题)
- java基础知识记录--html javascript ajax(摘自张孝祥整理java面试题)
- java基础知识记录--算法与编程(摘自张孝祥整理java面试题)