语法
1、Java 有没有 goto 语句?
goto是保留字,截至现在仍然未被使用。
2、& 和 && 的区别?
相同点:都是与判断,条件都成立true,都不成立false
不同点:&第一个条件不成立,会对第二个条件判断;&&第一个条件不成立,不再进行判断。
&还有一个身份是位与运算,二进制进行位与运算时,有0则0.
3、在 Java 中,如何跳出当前的多重嵌套循环
在循环体的最外层,添加一个标号(A),通过break A来跳出多层嵌套。
4、char 型变量中能不能存储一个中文汉字,为什么?
能,char存储2个字节,汉字刚好。
5、break 和 continue 的区别?
break结束整个循环,continue跳过当前循环,进入下面的循环。
6、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?
截止到jdk1.8,switch可以传入byte short int char String 枚举
7、数组有没有 length() 方法?String 有没有 length() 方法?
数组是length属性,String是length方法
8、Java 的基本数据类型都有哪些各占几个字节?
基本数据类型:
byte short int long float double char boolean
1 2 4 8 4 8 2 1
引用数据类型:数组、类、接口、String、Lambda表达式
9、short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗;
前者有错,s1+1中,需要强转。
后者没错,s1 += 1中,会进行一个隐式转换,结果:s1 = (short)(s1+1)
10、int 和 和 Integer 有什么区别?
int是基本数据类型,integer是引用数据类型
jdk1.5之后,有装箱和拆箱,自动把基本数据类型与包装类的转换。
包装类有:Byte Short Integer Long Float Double Character Boolean
对象
1、面向对象都有哪些特性以及你对这些特性的理解
封装:隐藏对象的属性和实现细节,对外提供公共的访问方式
继承:子类对父类的属性和方法进行共性抽取
多态:父类或接口的引用变量指向子类或实现类的实例对象,多态是分为
编译时多态(重载)和运行时多态(重写)
抽象:被abstract修饰的类,具有抽象方法的类,称为抽象类
2、访问权限修饰符 public、private、protected, 以及不写(默认)时的区别
当前类 同包 子类 其他包
public true true true true
protected true true true
default true true
private true
3、为什么用clone?
有两个对象,对象A和对象B,他们是完全独立的两个对象,对象B初始值要由对象A来确定
在这种情况下,普通的赋值已经无法满足,clone就很好的解决了此问题
4、new 一个对象的过程和 clone 一个对象的过程区别?
new动作发生时,要看它后面的类型,知道了类型就能分配内存,分配好内存后,调用构造方法
完成对象初始化。
clone同样要分配内存,复制与原对象相同的内存,分配好内存后,对照原对象的各
个作用域进行填充,填充好后,一个新对象就创建成功。
5、两个对象值相同 (x.equals(y) == true) ,但却可有不同的 hashCode,这句话对不对?
不对,对象值相同时,其hashCode值一定相同,如果hashcode值相同,对象值不一定相同
6、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并
可返回变化后的结果,那么这里到底是值传递还是引用传递?
Java全部是值传递,即使一个对象作为参数被传递,传递的值也是该对象的引用,归根结底,都是值传递。
7、重载(overload)和重写(override)的区别?重载的方法能否根据返回类型进行区分?
相同点:都是多态的一个实现方式
不同点:
重载---是方法名相同,参数类型和参数个数都不同,与返回值无关。
重写---是方法名相同,参数相同,返回值范围<=父类返回值范围
构造不能被重写、static修改不能被重写、私有不能被重写
8、为什么函数不能根据返回类型来区分重载?
因为如果根据返回类型来判断,编译器就不知道具体要调用哪个方法
9、抽象类(abstract class)和接口(interface)有什么异同?
相同点:
都不能被实例化
都可以当作引用类型
一旦被继承或实现,必须实现全部抽象方法
不同点:
a、抽象类可以有抽象方法,可以有非抽象方法(构造方法、静态方法、普通方法)
抽象类中可以定义成员变量
一个类只能继承一个抽象类
b、接口
JDK1.7时候,接口有:常量+抽象方法
JDK1.8时候,接口加入:默认方法+静态方法
JDK1.9时候,接口加入:私有方法
一个类可以实现多个接口
10、抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法
(native),是否可同时被 synchronized
都不行,抽象需要被继承实现该方法,静态无需这样做,矛盾;本地方法有本地代码
实现,抽象没有实现细节,矛盾;synchronized需要实现细节,抽象类不关注实现细节,矛盾。
11、阐述静态变量和实例变量的区别?
静态变量,被static修饰的变量,属于类变量,可以直接通过类名调用
实例变量,不能直接调用,需要实例化一个对象,通过对象名调用
12、==和 equals 的区别?
基本数据类型:==判断内容是否相等
引用数据类型:==判断地址值是否相等,equals默认比较地址值,重写后比较内容
13、Java 中实现多态的机制是什么?
父类或接口的引用变量指向子类或实现类的实例对象
14、final、finally、finalize 的区别?
final修饰类不能继承,修饰方法不能重写,修饰属性不能修改
finally是释放资源
finalized是垃圾回收
15、静态嵌套类 (Static Nested Class) 和内部类(Inner Class)的不同?
静态嵌套类,就是static修饰的内部类,无需依靠外部类去实例化
内部类,它需要外部类实例化,才能实例化
API
1、是否可以继承 String?
凡是被final修改的类,都不可被继承,String是被final修饰。
2、String s = "Hello";s = s + " world!";这两行代码执行后,原始的 String 对象
中的内容到底变了没有?
没有,原始对象s内容是Hello,经过运算后新s的内容是HelloWorld,这期间,s的指
向由原来的Hello,变为指向HelloWorld,但是原来的s依然在内存中
3、Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少?
前者12,后者-11,因为四舍五入就是先+0.5,再取整
高级
1、error 和 exception 的区别?
相同点:他们的父类都是Throwable
不同点:
error是错误,可能是JVM、内存不足,系统错误等无法用代码解决的问题
exception是异常,分为编译异常和运行异常,是可以用代码解决的,编译异常是在
编译器写代码时,编译器提示有错误,我们要马上处理,运行异常是程序运行起来
后,出现的异常,也需要我们处理。
2、java 异常处理机制
有三种,throw来抛,throw在方法内部,写法是throw+异常对象,throws来抛,在方法申明处,写法是throws+异常类,需要交给父类处理。
try catch捕获
3、请写出你最常见的 5 个 RuntimeException
空指针异常 NullPointerException
找不到类异常 ClassNotFoundException
SQL异常 SQLException
索引越界异常 IndexOutOfBoundsException
数据类型转换异常 ClassCastException
4、throw 和 throws 的区别?
throw方法内抛,由方法内处理,抛出的是异常实例
throws是方法申明处抛,由父类处理,抛出的是异常类
5、String 、StringBuilder 、StringBuffer 的区别?
String是不可变的字符序列,适合少量字符串操作,底层是byte[]
StringBuilder是可变的字符序列,线程不安全的,适合单线程下的大量字符串操作
StringBuffer是可变的字符序列,线程安全的,适合多线程下的大量字符串操作
6、什么情况下用“+”运算符进行字符串连接比调用 StringBuffer/StringBuilder
对象的 append 方法连接字符串性能更好?
无论是+还是StringBuilder 进行拼接,最后都会转换成StringBuilder 拼接
7、多线程的创建方式
继承Thread类,本质也是实现了Runnable接口,启动的方式是start方法
实现Runnable接口,实例化一个Thread
8、在 java 中 wait 和 sleep 方法的不同?
wait在等待中,会进行释放锁,sleep在等待过程中,一直持有锁
9、synchronized 和 volatile 关键字的作用
volatile是一个轻量级的锁实现,性能更好一点,但是只能作用于变量
synchronized在jdk1.6之后进行优化,减少了获得锁于释放锁的性能消耗,它还可以
作用于方法和代码块,实际开发用它多一些
10、什么是线程池和线程组,如何使用?
线程池是效率第一,很好的实现线程的回收再利用,如果线程使用完毕,回扔回池中休眠,等待下次调用
线程组是安全第一,你可以比喻成一个数组,凡是在组内的数据,其他组不可随意修改
11、线程和进程的区别?
进程是一个独立运行中的程序,比如QQ
线程是基于进程的更小的单位,但是也可以独立运行,比如QQ农场
12、请问 ArrayList、HashSet、HashMap 是线程安全的吗?如果不是我想要程安全的集合怎么办?
他们是不安全的,需要在核心方法上加上synchroized
13、ArrayList 内部用什么实现的?
ArrayList 内部是用 Object[]实现的。
14、并发集合和普通集合如何区别?
普通集合性能高,不能保证线程安全和并发
线程安全集合,加锁后线程安全,但是性能和并发更低
并发集合,线程安全同时提高了并发
15、List三个子类特点?
ArrayList:底层数组,查询快,增删慢
LinkedList:底层链表,查询慢,增删快
Voctor:底层是数组,查询和增删都慢
16、List 和 Map、Set 的区别
共同点:都是集合
不同点:
List、Set是单列集合:
List是有序、可重复、有索引可以遍历
Set是无序、不可重复、没有索引不可以遍历
List下的三个子类
ArrayList:底层数组,查询快,增删慢
LinkedList:底层链表,查询慢,增删快
Voctor:底层是数组,查询和增删都慢
Set下的子类
TreeSet底层是二叉树,无序
HashSet底层是哈希算法,无序,
LinkedHashSet底层是数组+链表/红黑树,有序
Map是双列集合
TreeMap:有序,根据键排序
HashMap:无序,非线程安全,支持键值对空值
LinkedHashMap:保存了记录的插入顺序
HashTable:无序,线程安全,不支持键值对空值
17、Java 中有几种类型的流?
按照流向:输入流和输出流
按照实现功能:节点流和处理流
按照处理数据单位:字节流和字符流
18、字节流如何转字符流
字节输入流转字符输入流通过InputStreamReader实现
字节输出流转字符输出流通过OutputStreamWriter实现
19、 如何将一个 java 对象序列化到文件里
要序列化的类必须先实现Serializable接口,该接口没有任何抽象方法只起到标识作用。
20、字节流和字符流的区别
字节流:读一个返回一个,可以处理除文本以外所有数据文件
字符流:读取多个字节,去查码表,通过将字符返回,只能处理文本文件
21、如何实现对象克隆?
可以实现Cloneable接口,并重写Object类中的clone()方法
实现Serializable接口,通过序列化和反序列化来实现克隆
22、什么是 java 序列化,如何实现 java 序列化?
Java序列化就是将对象进行流化,然后进行读写操作,序列化就是解决
对象流化过程中可能引发的问题。
23、说说你对反射的理解
通过反射,获取类的字节码文件,将字节码中的属性、方法等映射成Method、Filed类,通过这些类可以拿到我们想要的数据
网友评论