java 基础知识点

1.覆盖和重载
覆盖是子类对父类方法的重写,访问权限不能比父类小,只能抛出更少的异常。重新编写,返回值和形参都不能改变
重载,是同一方法的多样性,构成重载的条件可以有三种
参数个数,参数类型,参数顺序。
返回值无法构成重载,因为有时候使用一个方法我们并不关心它的返回值
例如
有两个方法 int f() ,string f(),

 f();

编译器无法确定使用哪个方法。

2.抽象类和接口的区别

  1. 抽象类可以没有抽象方法,接口只能有抽象方法,static方法,和default修饰的普通方法。
  2. 抽象类可以有变量,但是接口只能有常量(final static),并且必须初始化。
  3. 抽象类单继承,接口多继承

3. 抽象类和接口的选择
1.如果要定义一个没有变量,不需要具体方法实现的,选择接口。

4.java语言的特点
1.没有指针,程序更加安全。
2.虚拟机保证跨平台
3.单继承
4.不需要手动释放内存。

5.Java 中的值传递和引用传递
值传递,基本数据类型变量作为参数时传递的是值的副本,改动不会影响原变量
引用传递,引用类型的数据传递的是对象的内存地址的副本,改变引用不影响原对象的引用,但是改变对象内部的变量则有效。

6.JDK,JRE 和 JVM 的联系和区别:
JDK是开发工具包,包括了各种开发用的类库,并提供编译、调试和运行一个 java 程序所需要的所有工具,以及包含了JRE所有内容。

JRE是java运行时环境,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。

JVM,java虚拟机,具有将字节码转换成运行机器的机器码的功能,提供了内存管理,垃圾回收器和安全机制等。
区别:
1.JDK 用于开发,JRE 用于运行 java 程序;
2.JDK 和 JRE 中都包含 JVM;
3.JVM 是 java 编程语言的核心并且具有平台独立性

7.equals()和==的区别
1.==比较的是内容,基本类型数据比较的是值,引用类型是比较内存地址。
2.object 类中equals()方法和 ==的功能是一样的,String类重写后的equals()是比较字符数组内的支付,对于可能用于集合存储中的对象元素而言,通常需要重写其equals()方法.
3.equals方法的返回结果依赖于具体的实现,一般重写equals方法,也重写hashcode方法,

8.int 的范围
-2-31 到 2-31-1

9.String,StringBuilder,StringBuffer的区别

  1. String是字符串常量(final修饰),StringBuilder,StringBuffer是字符串变量,通过字符数组实现。
  2. String适合字符串拼接操作较少的情况,频繁的字符串拼接会产生大量字符串对象,影响GC效率,降低性能。StringBuilder,StringBuffer是通过字符数组实现,父类都是AbstractStringBuilder,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuilder,StringBuffer。
  3. StringBuffer是线程安全的,适合多线程操作。
  4. 运行速度快慢顺序为:StringBuilder > StringBuffer > String

10.a=a+b与a+=b有什么区别吗?
a+b不会进行类型转换,a+=b会进行隐式的类型转换。

byte a = 127;
byte b = 127;
b = a + b; // 报编译错误:cannot convert from int to byte
b += a;

+结果是int类型,前者不会把int转换成byte,后者会

11.泛型

  • <?>: 无限制通配符。
  • <? extends E>: extends 关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或者是此类型的子类。
  • <? super E>: super关键字声明了类型的下界,表示参数化的类型可能是指定的类型,或者是此类型的父类。

12 .四种引用类型

  • 强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收.即使当前内存空间不足,JVM也不会回收它.而是抛出OutOfMemoryError错误.使程序异常终止.如果想中断强引用和某个对象之间的关联.可以显式地将引用赋值为null,这样一来的话.JVM在合适的时间就会回收该对象.
  • 软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用而不会被垃圾回收器回收.只有在内存不足时,软引用才会被垃圾回收器回收.
  • 弱引用:具有弱引用的对象拥有的生命周期更短暂.因为当 JVM进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收.不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象.
  • 虚引用:如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收.

13.拆箱和装箱
装箱和拆箱是java的一个语法糖,能够自动在基本数据和包装类型之间进行切换。
装箱是使用的包装类型的valueOf方法,拆箱则是使用包装类型对象的xxValue方法,xx是对应的基本数据类型。

Integer i = 10; // 装箱
int j = i; // 拆箱

14.boolean占几个字节
boolean类型默认值false,虽然只有true和false两种情况,理论上只需1位储存,但是java并没有进行规定。
1.单个bollean值再编译是被当做int,所以是4个字节。
2.在作为数组时,每个boolean值作为byte储存,所以占一个字节。
理由:
1)JAVA规范中没有定义boolean类型的大小。
2)但是:在JVM规范第2版中讲得十分清楚。我上边的结论就是从它当中取出来的。
根据:(JVM规范第2版 3.3.4节)
Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type.
Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding. 而:Java virtual machine type int, whose values are 32-bit signed two’s-complement integers。
Arrays of type boolean are accessed and modified using the byte array instructions
In Sun’s JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element.
(以上都是剽窃的。。。)

15.面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?
以HashSet为例,它是通过对象的hashcode来映射,如果不重写hashcode,同一内容的两个对象的hashcode就会不同,散列在了不同位置,无法保存set集合里没有重复元素的特点。
以Integer包装类为例

 @Override
    public int hashCode() {
        return Integer.hashCode(value);
    }
    
    public static int hashCode(int value) {
        return value;
    }

重写的hashcode方法是调用静态的hashcode方法,返回的值value是该Integer对象的值。(value是final修饰的,Integer对象是不可变的)
所以不同的值得Integer的hashcode不同,相同值得不同Integer对象hashcode相等。
hashCode()与equals()的相关规定

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象有相同的hashcode值,它们也不一定是相等的(哈希碰撞)
  3. 两个对象相等,对两个对象分别调用equals方法都返回true
  4. 因此,重写equals时必须重写hashCode方法。
  5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

16.Constructor是否可以被override
子类无法重写父类构造器,但是可以重载,可以有多个构造器。

17.在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
帮助子类初始化继承自父类的属性和方法。

18.深克隆和浅克隆的区别。
浅克隆:复制一个对象,克隆对象的基本类型属性与原对象一致,引用类型属性则是指向同一个对象。
深克隆:复制一个对象,同时复制所有属性,引用类型的属性也会被复制成一个新对象。

区别:浅克隆仅复制对象,深克隆会递归复制对象(即对象的对象也会被复制)。
相同点:都会在堆中分配一块区域。

tips:欢迎来我的个人网站溜达溜达http://www.wsjiu.com/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值