1.基础语法

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"

  1. 如果常量池有"abc",str直接指向常量池中的"abc"

  1. 如果常量池中没有"abc",会在常量池中创建"abc",然后str指向常量池中的"abc"

(2)String str = new String("abc")

  1. 如果常量池中有"abc",会先在堆中创建str对象,将常量池的"abc"复制到堆中,str指向堆中的对象

  1. 如果常量池中没有"abc",会先在常量池中创建"abc",然后堆中创建对象,"abc"复制到堆中.str指向堆中的对象

27.&和&& | || 区别是什么?

(1)&|

既可以作为逻辑运算符也可以作为位运算符

(2)&& ||

只能作为逻辑运算符

(3)区别

&& ||作为逻辑运算符时有短路效果,而&|没有

28.包装类型、Math,String类常⽤的⽅法有哪些?

(1)包装类中常用方法

  1. 将包装类型转化为各种基本类型的方法

intValue(),longValue(),doubleValue(),floatValue(),byteValue(),shortValue()

  1. 将字符串转化为各种基本类型方法

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()的返回值:

  1. 负数,当前对象的值小,要存到已经存储对象的左边

  1. 0,当前对象与已经存储的对象一样大,比较第二条件或者不存,因为Set的特性是无重复的

  1. 正数,说明当前对象大,要存到已经存储对象的右边

Comparator(比较器排序):

创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进

行排序。compare的返回值规则与conpareTo一致;

30.Object类和范型的区别,说出范型的执⾏机制,为什么要使⽤范型?

(1)Object和泛型的区别:

public Object doSomething(Object obj) {....}

public <T> T doSomething(T t) {....}

  1. 从方法调用的角度看没有区别

  1. 如果调用第一个方法,传递String,返回值是Object的类型,需要将返回值进行强转成String

  1. 如果调用第二个方法,传递String,返回的也是String

(2)使用泛型的理由

  1. 不需要做强制类型转换

  1. 编译时自动检查类型安全,如果使用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.工厂模式,单例模式,代理模式?

工厂分为,简单工厂模式,抽象工厂模式,工厂方法模式

抽象工厂模式的角色:抽象工厂,具体工厂,抽象产品,具体产品

可以产生多种类型产品

工厂方法模式的角色:抽象工厂,具体工厂,抽象产品,具体产品

而工厂方法只能产生一种类型产品的不同等级

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值