面试题库之JAVA基础篇(一)

java的特性
  1. 面向对象,能够使程序的耦合度更低,内聚性更高。
  2. 平台无关性,因为java程序运行在jvm虚上。
  3. 支持多线程。
  4. 安全可靠。
  5. 有丰富的类库。
面向对象

万物皆对象,将解决问题的各个元素抽象成对象,对象中包含解决单个或某类问题的属性、行为(方法),将需要的对象组合到一起,达到解决问题的目的;面向对象有封装、继承、多态的特性,所以有很好的维护性、复用性、扩展性。

封装
  1. 将某一类的行为(数据操作)内聚到一个类中,并且隐藏其实现过程,只对外提供特定的方法,使用者只能调动对外公开的方法,无法对封装类进行修改。
  2. 好的封装能够降低耦合性、提高封装类的扩展性。
继承
  1. 使用已有的类作为基础(基类)建立新类,新类拥有基类的属性和方法,同时也可以新增自己的属性和方法。
  2. 子类无法访问父类的私有属性和方法。
  3. 子类可以重写父类的方法。
  4. 提高代码的复用性,增加代码的耦合度。
多态
  1. 同一对象同一方法调用的表现结果不同。
  2. 实现条件:继承重写、向上转型。
重写(Override)
  1. 子类把父类中可继承的方法重新一遍,重写发生在子类中。
  2. 重写的方法的方法名、参数、返回类型必须和父类的一致,其中返回类型可以是父类发放返回类型的子类。
  3. 重写方法的访问修饰权限不能小于父类方法。
  4. 重写方法中不能申明新的异常或检查范围更大的异常。
  5. 运行时多态。
重载(Overload)
  1. 同一类中,存在方法名相同且参数列表不同的情况。
  2. 参数列表的不同可以是参数类型不同、参数个数不同、参数顺序不同。
  3. 返回类型可以不同。
  4. 编译时多态
向上转型
  1. 子类转换为父类类型。
  2. 子类中重写的父类方法被保留。
  3. 子类自定义的属性、方法将被丢弃。
创建对象的方式
  1. new创建新对象。
  2. 通过反射机制。
  3. 采用clone机制。
  4. 通过序列化机制。
标识符命名规则
  1. 标识符可以包含大小写英文、0-9的数据、下划线、$。
  2. 标识符不能以数字开头。
  3. 类型用大驼峰式,首字符大写,后面每个单词首字母大写。
  4. 变量、方法名用小驼峰式,首字母小写,后面每个单词首字母大写。
权限修饰符
权限修饰符 访问范围
public 被public修饰的类、接口、方法和变量等成员都可以被任何其他类或对象所访问
protected 被protected修饰的类、方法、变量或者接口只能被相同包或其子类中的类或对象所访问
default default是Java中的默认访问权限修饰符,它表示不指定任何访问权限修饰符时所使用的访问权限。如果一个类、方法、变量或接口没有使用任何访问权限修饰符,则这些成员默认为包级别访问权限,也就是说,只能在同一个包内被访问
private 被private修饰的类、方法、变量或接口只能在自己的类中被调用
基本数据类型
基本类型 占用字节 默认值 有效范围 封装类
byte 1 0 -2^7~2^7 Byte
short 2 0 -2^15~2^15-1 Short
int 4 0 -2^31~2^31-1 Integer
long 8 0L -2^63~2^63-1 Long
float 4 0.0f 1.4E-45~3.4028235E38 Float
double 8 0.0d 4.9E-324~1.7976931348623157E308 Double
boolean - false true或false Boolean
char 2 \u0000(null) 0~65535 Character
boolean

jvm中没有boolean专用的字节码命令,单个boolean在jvm使用是int数据类型代替,数组boolean使用是btye数组。使用int的原因是32位的CUP一次处理数据是32位,存取效率较高。

自动拆箱与装箱

拆箱:将包装类型转换为基本数据类型,Integer>>int:Integer.intValue。

装箱:将基本数据类型转换为包装类型,int>>Integer:Integer.valueOf(int)

instanceof

java中的一个双目运算符,用来判断一个对象是否一个类的实例、子类。

==
  1. 如果是基本数据类型,比较的是值,等号两边的类型必须一致。
  2. 如果是对象,比较的是对象的堆内存地址。
equals
  1. 用于对象比较,用于比较两个对象的内容是否相等。
  2. 被比较的对象如果没有重写equals方法,那么会使用object类的equals方法,而object的equals方式返回的是==的判断。
hashCode

默认情况下,大部分对象的hashCode默认是根据对象的存储地址计算的出来的一个散列值,大部分情况下对象的hashCode是用的不上的,主要在集合(set,hashMap、hashTabel)添加元素的时候用于快速定位和判重。

比如一个set里面已经有了10000个对象,这时要添加一个元素,首先要判重,如果那要添加的这个元素跟10000个对象都比较一下的,效率上会很慢,使用hashCode的话可以快速定位到set集合里面是否已有这个hashCode,如果没有,直接添加元素,如果有,再把hashCode对应的对象拿出来与要添加的对象进行equals比较,equals返回true放弃添加,false则添加。

equals和hashCode的关系
  1. 一个对象,重写equals就要重写hashCode。
  2. 当一个对象 equals() 方法所使用的字段不变时,多次调用 hashCode() 方法的值应保持不变。
  3. 如果两个对象equals相等,则hashCode必须相等。
  4. 如果两个对象的equals不相等,则hashCode可能相等,单建议不相等,以提升性能。
相关推荐
XiaoFan01212 分钟前
将有向工作流图转为结构树的实现
java·数据结构·决策树
小突突突30 分钟前
浅谈Java中的反射
java·开发语言
Anastasiozzzz41 分钟前
LeetCode Hot100 295. 数据流的中位数 MedianFinder
java·服务器·前端
我真的是大笨蛋1 小时前
Redo Log详解
java·数据库·sql·mysql·性能优化
索荣荣1 小时前
Java动态代理实战:从原理到精通
java·开发语言
兩尛1 小时前
c++的数组和Java数组的不同
java·开发语言·c++
roman_日积跬步-终至千里1 小时前
【Java并发】多线程/并发问题集
java·开发语言
それども2 小时前
什么是MalformedStreamException,和WebKitFormBoundary有什么关系
java
VT.馒头2 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
思想在飞肢体在追2 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos