1.String 、StringBuilder 、StringBuffer 的区别?
(1)String是只读字符串,创建对象后内容不能再改变.
(2)StringBuilder和StringBuffer创建的字符串对象可以直接被修改.
(3)StringBuilder是线程不安全的,在单线程环境下使用,StringBuffer是线程安全的,所以 StringBuilder比StringBuffer效率高.
2.equals()与==的区别
(1)==一般用于比较基本数据类型的值是否相等,equals不能用在基本类型.
(2)object中的equals()用的是==来判断两个值是否相当,如果自定义类没有重写equals()直接调用,
此时比较的是两个对象的地址值是否相等,我们重写后一般比较的是对象的属性值是否相等.
3.是否可以继承String类?为什么用final修饰?
不能被继承,因为String是被final修饰的类.
主要是为了安全.
(1)只有String是不可变的,字符串池才有可能实现.
(2)只有String是不可变的,多线程才是安全的,同一个字符串实例可以被多个线程共享.
(3)因为String是不可变的,所以他在被创建的时候就已经被hashcode缓存了,不需要重新计算,使得
字符串很适合做map中的键.
(4)如果String是可变的,会引起很严重的安全问题.
4.什么是面向对象编程?
面向对象编程的思想就是利用类,方法等概念来进行程序设计;
从现实世界实际存在的事物(对象)出发来构造系统软件,尽可能的用人类的自然思想进行程序设计.
面向过程更加注重功能的步骤和顺序
编写对象侧重于考虑程序中有哪些对象,不同的对象有哪些属性和行为,对象之间的关系
5.面向对象的三大特征?
面向对象的三大特征是封装,继承,多态.
(1)封装是指将事物的属性和行为封装到类中,以及将重复功能的代码封装到方法中.
(2)继承是指子类继承父类后,子类可以复用父类的代码.
(3)父类引用指向子类实现,Animal a = new Dog();多态的三个条件:继承,重写,向上转型.
6.简述一下JDK,JRE,JVM?
JDK是Java开发工具包,包含JRE和JVM.
JRE是开发环境,包含JVM和核心类库.
JVM是虚拟机,所有Java程序都运行在JVM上,JVM实现了Java的跨平台.
7.Java基本数据类型
分为四类八种
(1)整型
byte short int long
(2)浮点型
float double
(3)字符型
char
(4)布尔型
boolean
8.什么是方法签名
方法签名是指方法名和参数类型
9.java中的访问修饰符
private 同类中可以使用;
protected 同包下可以使用;
缺省 同包和不同包下的子类可以使用;
public 本项目下都可以使用;
10.final有什么用?和finally,finalize有什么区别?
被final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量称为常量,值不能被修改;
finally是try-catch结构中的关键字,表示不管是否出现异常finally中的语句都会被执行;
finalize是object类中的方法,用在垃圾回收器中.
11.super和this的区别?
this指向的是自身的一个对象,代指对象本身;
super指向的是自身的一个父类对象.
12.break,continue,return的区别?
break和continue一般在循环中使用,break用来结束当前循环,continue用来结束当次循环;
return用来结束当前方法.
13.抽象类能被final修饰吗?
不能,因为抽象类本身就是让继承从而实现抽象方法的,而被final修饰的类是不能被继承的.两者相悖,
所以不能被继承.
14.static修饰的方法能调用非static修饰的变量和方法吗?
不能,因为加载时机不同,被static修饰的方法和变量先加载进内存中,此时非static修饰的方法和变量
还没有被加载,所以被静态方法只能调用静态方法和变量;
15.局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?
因为生命周期不一致,局部变量存储在栈中,当方法结束后,非final修饰的变量会被销毁,而局部内部
类对局部变量的引用仍然存在,调用局部变量的时候就会出错;
16.重载(Overload)和重写(Override)的区别?
重载是值在同一类中,方法名一致但是参数列表不同的情况(参数个数,参数顺序,参数类型);
重写是在子类继承父类的情况下,重写父类的方法,方法名和参数必须和父类保持一致,抛出的异常
要小于父类的方法,访问修饰符大于等于父类;
17.构造器(constructor)是否可以被重写?
构造器是特殊的方法,不能被继承,所以更不能被重写,但是构造器可以重载
18.Java中创建对象方式有哪些?
(1)使用new关键字创建对象
(2)通过反射的方式创建对象,通过Class类的newInstance方法创建对象
//2. 通过反射的方式创建对象 -- Class类的newInstance方法 必须有空参构造
Class<?> student = Class.forName("com.Student");
Student stu = (Student) student.newInstance();
stu.setId(121);
stu.setName("Wangwu");
System.out.println(stu);
(3)通过反射的方式创建对象,使用Constructor类的newInstance方法创建对象
//3.使用Constructor类的newInstance方法创建对象,空参带参都可以
Class<?> aClass = Class.forName("com.Student");
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor();
declaredConstructor.setAccessible(true);
Student stu = (Student) declaredConstructor.newInstance();
stu.setId(123);
stu.setName("fff");
System.out.println(stu);
19.JDK1.8之前和之后定义接口的不同?
(1)在JDK1.8之前接口只能定义抽象方法和静态常量
(2)JDK1.8之后可以有default方法和静态方法
(3) 静态常量可以通过接口名称使用,
静态方法可以通过接口名称调用,
抽象方法必须由实现类重写,
default方法必须由实现类对象调用;
20.接口和抽象类有何不同?
(1)语法上的区别
包含抽象方法的类一定是抽象类,抽象类也可以不包含抽象方法;
在JDK1.8之前接口只能定义抽象类和静态常量;
(2)功能不同
接口设计的目的是为了约束类,给类定义规则,接口是对行为的抽象,比如 a like b , tom like jerry;
抽象类设计的目的是为了提高代码的复用性;
21.值传递和引用传递的区别?
值传递指的是基本数据类型的变量,由于存储的是数据本身,所以就是值传递;
引用传递指的是引用类型的变量,由于存储的数据的地址,所以就是地址传递,也叫引用传递;
22.hashCode和equals的区别?
(1)两个都是Object类中的方法;
(2)hashCode是基于native方法实现的,底层通过hash函数返回一个hash值;
(3)equals默认的实现是比较两个引用类型的地址值是否一样;
23.构造器代码块,静态代码块,局部代码块执行顺序和执行次数?
(1)执行顺序
静态代码块:当类加载进内存的时候会执行,如果有多个,按照书写顺序执行;
构造器代码块:当创建该类的对象之前执行,构造器代码块优先于构造方法;如果有多个,按照书写
方法执行;
局部代码块:当方法被调用的时候执行;如果有多个,按照书写顺序执行;
(2)执行次数:
静态代码块:只有在类被加载的时候执行,所以一次;
构造器代码块:每次创建对象都会执行;
局部代码块:每次调用该方法都会执行;
(3)位置:
静态代码块:在类中成员位置,格式是static{...}
构造器代码块:在类中成员位置.格式是{...}
局部代码块:在方法中,格式是{...}
24.构造代码块的作⽤?
(1)构造代码块在使用任意构造方法前执行,所以可以把构造方法公共的代码存放在构造代码块中;
(2)匿名内部类的初始化操作,匿名内部类没有明显的构造方法;
25.包装类和基本数据类型的区别?为什么要提供包装类?包装类和基础类型怎么转换?
(1)区别
包装类是封装了基本数据类型的对象,功能比基本数据类型更加强大
(2)包装类的作用
包装类是基本数据类型对应的引用数据类型,方便到涉及对象的操作,比如方法传参;
包装类中提供了对应基本数据类型的最大值,最小值等方便的方法;
(3)包装类和基本数据类型的转换
在JDK1.5之前
(1)基本数据类型 -> 包装类(装箱)
包装类.valueOf(基本类型);
(2)包装类 -> 基本数据类型(拆箱)
对象.xxValue();
class Test{
public static void main(){
//(1)基本数据类型 -> 包装类(装箱)
Integer num = Integer.valueOf(8);
//(2)包装类 -> 基本数据类型(拆箱)
Int num1 = num.IntValue();
}
}
在JDK1.5之后
JDK提供了自动装箱和拆箱,不需要显式的调用上面两个方法,会自动转换;
26.String str = "abc" 和 String str = new String("abc")区别?
(1)String str = "abc"
如果常量池有"abc",str直接指向常量池中的"abc"
如果常量池中没有"abc",会在常量池中创建"abc",然后str指向常量池中的"abc"
(2)String str = new String("abc")
如果常量池中有"abc",会先在堆中创建str对象,将常量池的"abc"复制到堆中,str指向堆中的对象
如果常量池中没有"abc",会先在常量池中创建"abc",然后堆中创建对象,"abc"复制到堆中.str指向堆中的对象
27.&和&& | || 区别是什么?
(1)&|
既可以作为逻辑运算符也可以作为位运算符
(2)&& ||
只能作为逻辑运算符
(3)区别
&& ||作为逻辑运算符时有短路效果,而&|没有
28.包装类型、Math,String类常⽤的⽅法有哪些?
(1)包装类中常用方法
将包装类型转化为各种基本类型的方法
intValue(),longValue(),doubleValue(),floatValue(),byteValue(),shortValue()
将字符串转化为各种基本类型方法
Integer.IntValue(String str);
Double.doubleValue(String str);
(2)Math中常用方法
abs(number):返回绝对值
max(number1,number2):返回两数的较大值
min(number1,number2):返回两数的较小值
random():随机数,默认返回double的正值,大于0.0,小于1.0
pow(a,b):b的a次方
(3)String中常用方法
charAt(int index):返回指定索引的字符
compareTo(String str):按照字典顺序比较两个字符串
concat(String str):将指定字符串连接到该字符串的末尾
indexOf(char ch):返回指定字符第一次出现的索引
length():返回该字符串的长度
split(String str):以str为口切割字符串
toCharArray():将字符串转换成字符数组
trim():删除字符串首尾空格
29.Comparable 和Comparator的区别,分别说出使⽤场景?
(1)Comparable和Comparator都是用来指定TreeSet或者TreeMap的排序规则的;
(2)两者书写位置不同
Comparable(自然排序):
实体类实现Comparable接口,重写他的comparTo()方法,comparTo()方法的形参代表已经
存进去集合中的对象;
comparTo()的返回值:
负数,当前对象的值小,要存到已经存储对象的左边
0,当前对象与已经存储的对象一样大,比较第二条件或者不存,因为Set的特性是无重复的
正数,说明当前对象大,要存到已经存储对象的右边
Comparator(比较器排序):
创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进
行排序。compare的返回值规则与conpareTo一致;
30.Object类和范型的区别,说出范型的执⾏机制,为什么要使⽤范型?
(1)Object和泛型的区别:
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....}
从方法调用的角度看没有区别
如果调用第一个方法,传递String,返回值是Object的类型,需要将返回值进行强转成String
如果调用第二个方法,传递String,返回的也是String
(2)使用泛型的理由
不需要做强制类型转换
编译时自动检查类型安全,如果使用Object类的话,你没法保证返回的类型一定是String,使用强转会在运行时报出类型转换异常
(3)泛型的执行机制
泛型的本质是将数据类型作为参数传递,其中的T只是作为一个形式参数作为占位符,而传递的
String类型相当于实际参数,用于给形式参数T赋值,从而使所有的T都被替换为String;
由于实际参数可以传递任意引用类型,所以叫做泛型;
31.Error 和Exception 有什么区别?
(1)从继承体系来说
Error和Exception都是Throwable的子类
(2)从功能来说
Error是程序无法处理的异常
Exception是程序可以处理的异常
32.什么是反射?
反射是指在程序运行状态中,对于任意一个类,都能够知道该类的属性和方法,对于任意一个对象,都
能调用它的属性和方法,这种"动态获取信息"和"动态调用对象"的功能,称为Java的反射机制
(1)反射是为了动态加载一个类,动态调用一个方法,动态访问一个属性 这些动态要求设计的;
(2)②JVM会为每一个类创建一个java.lang.Class的实例,通过该对象就可以获取该类的信息,然
后通过java.lang.reflect包下的API达到各种动态要求
33.设计模式?
(1)创建模式
提供了对象创建过程中的各种问题的解决
单例模式,抽象工厂模式,原型模式,构建者模式,工厂方法模式
(2)结构性模式
对类在设计上的总结,比较关注继承和组合关系
代理模式,适配器模式,桥接模式,装饰者模式,外观模式,享元模式,组合模式
(3)行为型模式
对象之间的交互和职责划分总结
观察者模式,模板模式,策略模式,职责链模式,迭代器模式,状态模式,访问者模式,备忘录
模式,命令模式,解释器模式,中介模式。
34.Integer缓存区间?
在Integer中有一个内部类,内部类中维护者一个数组Cache,存储着[-128,127]的Integer实例
基本数据类型转换成包装类时,如果基本数据类型在[-128,127]范围内,直接从数组返回Interger实例,否则创建Integer对象返回
35.JDK8之后的新特性?
lambda表达式
接口增强
36.Java中深克隆和浅克隆的区别?
浅克隆需要实现一个克隆接口,他底层是指向一个对象
深克隆是使用io流,指向不同的对象
37.工厂模式,单例模式,代理模式?
工厂分为,简单工厂模式,抽象工厂模式,工厂方法模式
抽象工厂模式的角色:抽象工厂,具体工厂,抽象产品,具体产品
可以产生多种类型产品
工厂方法模式的角色:抽象工厂,具体工厂,抽象产品,具体产品
而工厂方法只能产生一种类型产品的不同等级