Java基础

目录

一、基础

1、JRE、JDK、JVM区别?

2、Java基本数据类型 

3、什么是方法签名? 

4、Java中的访问修饰符 

 5、final、finally、finalize三者有什么区别?

6、this和super的区别? 

 7、break、continue、return的区别和作用?

8、局部变量和成员变量的区别? 

9、值传递和引用传递区别?

 10、String、StringBuffer、StringBuillder的区别?

11、equals与 == 的区别 ?

12、hashcode与equals的区别? 

13、&和&& ,|,|| 的区别

二、面向对象 

1、Java中什么是面向对象?

2、是否可以继承String类,为什么用final修饰? 

3、JDK1.8之前与JDK1.8之后定义接口有什么不同? 

4、接口和抽象类有什么不同? 

5、抽象类是否能被final修饰? 

 6、Static修饰的方法能调用非Static修饰的变量和方法吗?

7、局部内部类和匿名内部类访问局部变量的时候,为什么必须加上final?

8、 方法的重载(Overload)与重写(Override)的区别?

9、构造器Constructor是否能够被重写?

10、Java中创建对象的方式有哪些? 

11、Java的引用数据类型 

 12、包装类型和基本数据类型的区别?

 13、为什么要提供包装类?

14、包装类型和基本数据类型怎么互相转换? 

 15、构造器代码块、局部代码块、静态代码块执行顺序和执行次数?

16、构造代码快的作用? 

 17、Integer、String是否可以被继承?为什么?

18、Integer的缓存区间是什么?什么时候触发缓存区间? 

19、String str  = “abc” 与String str = new String(“abc”)的区别?

20、包装类型、Math、String常用的方法有哪些?

21、 Java中的深克隆与浅克隆的区别?怎么实现?

22、Comparable与Comparator的区别?分别使用的场景?

三、集合 

1、Java中常用的容器有哪些?

2、Collection 和Conllections的区别?

3、HashMap线程安全吗?如何得到一个线程安全的Map? 

4、List,Set,Map之间的区别? 

5、HashMap和Hashtable有什么区别?

6、如何决定使用HashMap还是TreeMap? 

7、ArrayList和LinkedLsit的区别是啥? 

8、如何做到数组和List之间的转换 

9、ArrayList和Vector之间的区别 

10、哪些集合类是线程安全的?

11、ConcurrentHashMap 与 Hashtable的区别? 


一、基础

1、JRE、JDK、JVM区别?

JRE:Java Runtime Environment   Java开发环境,包含JVM与核心类库。

JDK:Java Development Kit           开发者工具包,包含了JRE,JVM。

JVM: Java虚拟机

三者关系:JDK=JRE+JVM+类库     JRE = JVM+类库

2、Java基本数据类型 

整型:byte(字节型)、short(短整型)、int(整型)、long(长整型)

浮点:float(f)、double(d)

布尔类型:Boolean

字符型:(char)

3、什么是方法签名? 

方法的名称和参数列表的组成 ,称为方法签名

4、Java中的访问修饰符 

public:公共的,对所有的包(包内包外)的类都可访问。

private:私有的,只对本类开放,其他任何形式无法访问。

default:默认的,同包同类可以访问(包括包内继承的子类),其他任何类不能访问(包括继承了包内类的子类),重点突出包。

protect:受保护的,包内的任何类(包括包外继承了包内类的子类)都可以访问。重点在于继承。

 5、final、finally、finalize三者有什么区别?

final:final是一个关键字,可以修饰类,方法,变量。被final修饰的

  •      类不能被继承。
  •      方法不能重写。
  •     变量变为常量,不能被重新赋值。 

finally:finally是和异常处理相关的一个关键字。用于Try_Catch语句中,无论前面是否出现异常,finally后面语句总是会被执行。(通常用于释放资源)

finalize:finalize是Object中的一个方法。垃圾回收器将对象从堆内存回收之前,会调用对象的finalize方法。

6、this和super的区别? 

this:指的是对象本身。this() :调用的是本类的构造方法。

super:指自己最近的父类对象,又称为超类对象。super()调用的是父类的构造方法。

 7、break、continue、return的区别和作用?

break: 跳出当前循环。

continue:结束当前循环进入下一次循环。

return:结束方法。

8、局部变量和成员变量的区别? 

  • 定义位置不同
         局部变量:定义在方法内部。
         成员变量:在类中定义的变量。
  • 作用范围不一致
         局部变量只在本方法中使用。
         成员变量在所有的非静态方法中都可以使用,静态变量在所有方法中都能使用。
  • 默认值不一样
         成员变量有默认值。基本类型为0,引用类型为null。
         局部变量没有默认值。
  • 生命周期不同
         局部变量:随着方法的进栈而生成,随着方法的出栈而消逝。
         成员变量:随着对象的创建而生成,随着对象被gc回收而消逝。
                           静态变量随着类的加载而生成,类被卸载时被销毁。

9、值传递和引用传递区别?

  1. 基本数据类型的变量,由于存储的就是数据本身;所以就是值传递。
  2. 引用数据类型的变量,存储的是对象的地址,所以是引用传递。
  3. Java中只有值传递。

 10、String、StringBuffer、StringBuillder的区别?

  • String是字符串常量。一旦被创建则无法修改(被final修饰)。StringBuffer与StringBuilder表示的字符串对象可以被修改。
  • 运行速度不一样。StringBuilder > StringBuffer>String。
  • StringBuilder线程不安全。String、StringBuffer线程安全。
    String是不可变类,所有的不可变类都是线程安全的。StringBuffer里面的很多方法都带有Synchronized锁。所以可以保证线程安全,但是StringBuilder并没有此关键字。单线程使用 StringBuilder效率高,多线程使用StringBuffer安全。

11、equals与 == 的区别 ?

  • ==可以判断基本类型,也可以判断引用类型,判断基本类型比较的是值,判断引用类型比较的是地址。
  • equals如果没有重写Object类的equals方法,在原码会使用“==”比较,重写了Object类就会比较值。

12、hashcode与equals的区别? 

1、hashcode和equals都是Object类中的方法

2、equals的默认实现是:对象的地址值是否一样

3、hashcode是基于native方法实现的,底层是通过hash函数返回一个hash值

13、&和&& ,|,|| 的区别

1、& 与 | :既可以作为逻辑运算符又可以作为位运算符。

2、&& 与 ||:只能作为逻辑运算符。

3、& | 作为逻辑运算符与 && || 作为逻辑运算符的区别:&& || 有短路效果,当有多个表达式时,左边的表达式可以确定结果时,就不再继续运算右边的表达式。

14、JDK 1.8 之后有什么新特性

1、Lambda表达式

2、stream流

3、接口增强

4、并行数组排序

5、Optional

6、新的时间和日期API

7、可重复注解

二、面向对象 

1、Java中什么是面向对象?

面向对象是一种程序的设计思想。该思想注重是将现实生活中的一些形象事物作为出发点来构建软件,尽可能的运用人类的思维模式来设计程序。该思想侧重于程序中有哪些对象、不同的对象有哪些行为和属性,对象直接的关系等,更注重实现功能步骤和顺序。

三大要素:

  • 继承:子类继承父类可以拥有父类所有的行为和属性(被某些关键字修饰的除外),还可以追加行为和属性。Java中继承只支持单继承不支持多继承。但支持多层继承。
  • 抽象:将事物和行为抽取出来封装成为一个类,提高复用性。
  • 多态:父类引用指向子类实现。实现多态必须要继承,重写父类方法,向上转型。

2、是否可以继承String类,为什么用final修饰? 

不可以继承String类,因为String类被final修饰,被final修饰的类为最终类,不能被继承。

被final修饰的原因:

  • 方法锁定,防止任何继承关系修改他的意义与实现
  • 高效,编译器在遇到final时会转入内嵌机制,大大提高效率
           内嵌机制:当代码调用到final时,这个方法会自动展开,而不是函数调用形式。提   高了函数运行效率。

3、JDK1.8之前与JDK1.8之后定义接口有什么不同? 

  1. 在JDK1.8之前定义接口只能定义抽象方法和静态常量。
  2. JDK1.8之后可以有default方法和静态方法。
  3. 静态常量使用接口名调用。抽象方法必有实现类重写,由实现类调用。default方法由实现类对象调用。静态方法通过接口名称调用。

4、接口和抽象类有什么不同? 

语法区别:

  • 包含抽象方法的类必须是抽象类,抽象类中也可不包含抽象方法。
  • 在JDK1.8以前接口中只能定义抽象方法和静态常量。

功能不同:

  • 接口的设计目的是对类中的方法进行约束,接口是对象行为的抽象。
  • 抽象的设计是为了代码的复用。

5、抽象类是否能被final修饰? 

不能,final修饰的类不能被继承,而抽象类本身是需要被继承的,互相矛盾。

 6、Static修饰的方法能调用非Static修饰的变量和方法吗?

不能,以为静态方法被加载的时候非静态资源还没有被加载,所以静态方法只能调用静态方法以及变量。

7、局部内部类和匿名内部类访问局部变量的时候,为什么必须加上final?

因为生命周期不一致,局部变量存储在栈中,随着方法的结束 而被销毁,而局部内部类对局部变量的引用仍然存在,在调用局部变量时就会出错。

8、 方法的重载(Overload)与重写(Override)的区别?

  • 重载:方法的重载是指,在同一个类中,方法名称相同,参数列表不同的多个方法,构成方法的重载,参数列表不同分为:参数类型,参数数量,参数顺序。
  • 重写:在继承的条件下,方法的名称,参数相同的情况下构成了方法的重写。JDK以前,返回值必须一样,JDK8以后可以不相同,但必须是父类返回值的派生类。

9、构造器Constructor是否能够被重写?

 不可以,也没必要,构造器不能被继承,所以不能被重写,但可以被重载。

10、Java中创建对象的方式有哪些? 

  1. 使用关键字 new
  2. 使用class类的newInstance方法
  3. 使用Constructor的newInstance方法
  4. 使用clone
  5. 使用反序列化

11、Java的引用数据类型 

类、接口、枚举、数组、注解

 12、包装类型和基本数据类型的区别?

包装类型是对基本数据类型的封装。

1、包装类对象,用于方法和字段,对象的调用都是通过引用对象的地址,基本数据类型不是.

2、包装类是引用传递。基本类是值传递

3、声明方式不同。包装类需要new在堆中,基本类不用。

4、初始值不同,int的初始值是0,boolean的初始值是false,而包装类的初始值是null

5、存储位置不同,基本数据类型是保存在值栈中。而包装类是在堆中,然后通过对象的引用来调用。

 13、为什么要提供包装类?

 包装类型作为基本数据类型对应的引用数据类型,方便了涉及对象的操作。让基本类型拥有了方法和属性,实现了对象化交互。

包装类型中提供了对应的基本数据类型的最大值,最小值等属性,以及相关的方法。

14、包装类型和基本数据类型怎么互相转换? 

1、基本类型转换为包装类型(装箱)。包装类.valueOf(基本类型)

2、包装类型转为基本类型(拆箱)。对象.xxValue();

JDK1.5以后提供了自动的包装类和基本类型的转化,不需要调用上面的两个方法了。被称为:自动装箱和自动拆箱。

 15、构造器代码块、局部代码块、静态代码块执行顺序和执行次数?

1、执行顺序:

        静态代码块:当类加载的时候执行,如果类中有多个静态代码块则按顺序执行。

        构造器代码块:对象被创建之前执行,优于构造方法,如果有多个,按照书写顺序执行

        局部代码块:当方法执行的时候,如果有多个,按照书写顺序执行。

2、执行次数:

        静态代码块:执行一次

        构造器代码块:每次创建对象都会执行。

        局部代码块:每次调用方法都会执行。

16、构造代码快的作用? 

1、可以把所有的构造方法公共的代码放在构造代码块中

2、匿名内部类的初始化操作,匿名内部类没有明显的构造方法。 

 17、Integer、String是否可以被继承?为什么?

 不可以,因为都被final修饰

18、Integer的缓存区间是什么?什么时候触发缓存区间? 

Integer内部定义了一个内部类IntegerCache,在IntegerCache中维护者一个Integer数组。范围在-128~127中。当基本数据类型转化为包装数据类型的时候,如果基本数据类型范围在-128~127中,则直接从数组中返回Integer实例,否则创建Integer实例。

19、String str  = “abc” 与String str = new String(“abc”)的区别?

 1、String str = “abc”

        如果字符串常量池中没有“abc“,则在常量池中创建”abc“。

        Str指向常量池中的”abc“

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

        如果字符串常量池中没有”abc“,则在常量池中创建”abc“

        在堆中创建对象,将常量池中的”abc“复制到堆中

        str指向堆中的对象

20、包装类型、Math、String常用的方法有哪些?

包装类:将包装类转换为各种基本类型的方法,intValue、longValue等

Math:abs,ceil/floor、random、max/min

String:parseInt()   parseDouble() 将字符串转换为各种基本类型方法

21、 Java中的深克隆与浅克隆的区别?怎么实现?

浅克隆:原对象中为基本数据类型的属性值克隆给克隆对象,原对象中为引用数据类型的引用值克隆给克隆对象。原对象和克隆对象中引用类型的属性指向的是同一个对象。

深克隆:原对象和克隆对象引用数据类型的属性指向不是同一个对象。

实现: 1、首先实现Cloneable接口

                  浅克隆重写Object类中的clone方法即可

                  深克隆可以利用 IO读写 与 JSON的序列化和反序列化

22、Comparable与Comparator的区别?分别使用的场景?

 区别:1、排序逻辑:comparable排序逻辑必须在待排序元素的类中,也成为自然排序

                                   comparator排序的逻辑写在另一个实现类中,也成为比较器排序

            2、排序方法:int conpareto(e o1);----->comparable 重写

                                   int compare( e o1,e o2 );----->comparator 重写

            3、接口所在包:comparable在java.long下

                                        comparator在java.util 下

使用场景:Comparabel 可以看作是"对内"进行排序的接口。Comparator是“对外”进行排序

的接口。

用Comparable必须要修改原有的类,也就是你要排序那个类,就要在那个中实现Comparable接口并重写compareTo方法,所以Comparable更像是“对内”进行排序的接口。 ​

而Comparator的使用则不相同,Comparator无需修改原有类。也就是在最极端情况下,即使Person类是第三方提供的,我们依然可以通过创建新的自定义比较器Comparator,来实现对第三方类Person的排序功能。也就是说通过Comparator接口可以实现和原有类的解耦,在不修改原有类的情况下实现排序功能,所以Comparator可以看作是“对外”提供排序的接口。

23、Object类和泛型的区别?说出泛型执行的机制,为什么要使用泛型?

 共同点:如果从方法的调用层面来说是没有区别的

为什么要是有泛型:不需要做强转,更方便,编译时更加安全,如果是Object类没法保证

                                返回值类型一定是想要的,也可能是其他类型,这时候就会产生运行 

                                时异常。

泛型的机制:泛型的本质是一种参数化类型,也就是将数据类型作为参数进行传递,其中

                      T 相当于形式参数负责占位,而真正传递的参数根据调用的方法类型的不同

                      而改变,由于实际参数有很多类型,所以叫泛型。

24、Erro 与 Exception 有什么区别? 

1、从继承体系:Erro和Exception都是Throwable的子类

2、功能方面:Erro是无法处理的异常

                       Exception是程序可以处理的异常

25、什么是反射? 

1、反射是为了动态加载一个类,动态调用一个方法,动态访问一个属性等 为这些动态要

     求设计的。

2、JVM会为每一个类创建一个java.long.Class 的实例,通过改对象就可以获取该类的信息,然后通过java.lang.reflect 包下的API达到各种动态需求。

三、集合 

1、Java中常用的容器有哪些?

 

 2、Collection 和Conllections的区别?

Collection:1、Collection是集合的顶级接口,定义了集合中统一的接口方法

                    2、Collection接口有很多常用的实现类

                    3、Collection的意义是为了具体的集合提供了最大化的统一操作方法

                    4、直接继承Collection的接口有List和set以及Queue。

Conllections:Collerctions是集合的工具类。提供了很多方法用于对集合元素的排序等。

3、HashMap线程安全吗?如何得到一个线程安全的Map? 

HashMap线程不安全,可以利用Conllections里面的synchronizedMap(map)的增强方法

使用ConcurrentHashMap

使用Hashtable

4、List,Set,Map之间的区别? 

List集合:单例集合,存储的都是一个一个的元素

                List集合可以存在重复元素

                每一个元素都有对应的索引,可以通过索引获取元素

                元素的存取顺序一致

Set集合:单列集合,存储的都是一个个的元素

                Set集合不允许存在重复的元素

                元素没有索引,不能通过索引获得元素

                不能保证元素的存取一致

5、HashMap和Hashtable有什么区别?

相同点:HashMap和Hashtable都实现了Map接口,都是存储Key——Value数据

不同点:HashMap允许把null值作为key或者value,而Hashtable不可以

              HashMap线程不安全,效率高,Hashtable线程安全,效率低

6、如何决定使用HashMap还是TreeMap? 

 TreeMap可以对元素进行排序,如果需要元素按照一定的顺序进行排序的话使用TreeMap,

没有特殊的要求一般使用HashMap。

7、ArrayList和LinkedLsit的区别是啥? 

ArrayList底层实现的数据结构是数组,查询元素较快,增删慢。

LinkedList的底层数据结构是双向循环链表,查询速度慢,增删快。

8、如何做到数组和List之间的转换 

List对象转换为数组:可以调用ArrayList(或其他List)的toarray()方法。

数组转换为List:调用Arrays的asList方法。

9、ArrayList和Vector之间的区别 

 Vector是线程安全的,而ArrayList是线程不安全的,所以单线程下使用ArrayList的效率会更高。

在扩容时,Vector是扩容100%,而ArrayList是扩容50%,更节省内存

10、哪些集合类是线程安全的?

Vector:比ArrayList多了一个同步化机制。Stack 栈  。Hashtable。

11、ConcurrentHashMap 与 Hashtable的区别? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值