面经集合


Java基础

[TOC]

Java 面向对象特征

[面向对象的特征](https://javaguide.cn/java/basis/java-basic-questions-02.html#面向对象三大特征 "面向对象的特征")

Java语言特点

面向对象、平台无关、安全性、多线程、编译与解释并存

Java和CPP的区别

  1. Java的类是单继承的,但是CPP支持多继承;
  2. Java不提供指针访问内存的形式;
  3. Java不提供操作符重载;
  4. Java提供垃圾回收机制,不需要手动释放内存。

面向对象和面向过程的区别

面向对象有封装、继承、多态性的特性,所以相比面向过程易维护、易复用、易扩展,但是因为类调用时要实例化,所以开销大性能比面向过程低

Java面向对象的特征

● 封装:封装就是隐藏一切可以隐藏的东西,只对外展示简单的接口。在类中编写的方法就是对实现细节的封装,编写的类就是对数据和数据操作的封装。 ● 继承:从父类中继承信息派生子类,对类进行了扩展。 ● 多态:多态指的是对同一方法的引用实现了不同的效果。多态分为两种:一种是编译时多态,如方法重载;一种是运行时多态,如方法重写。运行时多态是面向对象最精髓的东西,实现多态需要方法重写+对象造型(即用父类引用调用子类方法)

Java注释的种类

  1. 单行注释:用来解释某行代码 2. 多行注释:用来解释某块代码 3. 文档注释:用于生成开发文档

标识符和关键字的区别

标识符是变量、程序、方法的名字; 关键字是被赋予特定含义的标识符,不允许做变量、程序、方法名的单词

Java自增和自减

自增和自减都有两种形式的运算:前缀和后缀 前缀运算规则为:先运算,后引用; 后缀运算规则为:先引用,后运算(引用指使用变量的值)

  1. 语句中仅有自增/自减运算符,前后缀运算结果一样没有区别。
  2. 自增自减运算结果赋值给变量/自身时: 前缀形式:先对变量完成自增自减,再将其值存入操作数栈,再取操作数栈的值进行赋值等; 后缀形式:先将值存入操作数栈,再对变量完成自增自减(此时并未影响到操作数栈的值),再取操作数栈的值进行赋值等

自增和自减运算原理

程序中仅有自增、自减时,并不会把变量的值存入操作数栈,而是直接对变量进行自增或自减的操作,但是需要用到自增自减的结果的时候,就会用到操作数栈。

public、protected、private、default的区别

private修饰,只能由当前类调用 default修饰,可以由当前类调用、同包中的其他类调用 protected修饰,可以由当前类调用、同包中的其他类调用、子类调用 public修饰,可以由当前类调用、同包中的其他类调用、子类调用、其他包中的类调用

接口和抽象类的区别

相似点: (1)接口和抽象类都不能被实例化 (2)实现接口或继承抽象类的普通子类都必须实现这些抽象方法 不同点: (1)抽象类可以包含普通方法和代码块,接口里只能包含抽象方法,静态方法和默认方法 (2)抽象类可以有构造方法,而接口没有 (3)抽象类中的成员变量可以是各种类型的,接口的成员变量只能是 public static final 类型的,并且必须赋值

重载和重写的区别

重载发生在同一个类中,方法名相同、参数列表、返回类型、权限修饰符可以不同

重写发生在子类中,方法名相、参数列表、返回类型都相同,权限修饰符要大于父类方法,声明异常范围要小于父类方法,但是final和private修饰的方法不可重写

==和equals的区别

==比较基本类型,比较的是值,==比较引用类型,比较的是内存地址

equlas是Object类的方法,本质上与==一样,但是有些类重写了equals方法,比如String的equals被重写后,比较的是字符值,另外重写了equlas后,也必须重写hashcode()方法

hashCode和equals

hashCode()和equals()都是Obkect类的方法,hashCode()默认是通过地址来计算hash码,但是可能被重写过用内容来计算hash码,equals()默认通过地址判断两个对象是否相等,但是可能被重写用内容来比较两个对象

所以两个对象相等,他们的hashCode和equals一定相等,但是hashCode相等的两个对象未必相等

如果重写equals()必须重写hashCode(),比如在HashMap中,key如果是String类型,String如果只重写了equals()而没有重写hashcode()的话,则两个equals()比较为true的key,因为hashcode不同导致两个key没有出现在一个索引上,就会出现map中存在两个相同的key

String、StringBuffer、StringBuilder的区别

String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全 StringBuiler可变但线程不安全。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer。

深拷贝和浅拷贝

浅拷贝:浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存 深拷贝:深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象。

9.内部类的分类

10.Exception和Error的区别

页面列表

ITEM_HTML