1.Java有哪些数据结构
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据结构,在内存中分配了不同大小的内存空间。
基本数据结构
整数类型:byte,short,long,int。
字符类型:double,float。
布尔类型:boolean。
引用数据结构
类(class)、接口(interface)、数组。
2.Java三大特性
封装
封装是指利用抽象将数据和基于数据的操作封装到一起,使其构成一个不可分割的独立实体。
数据被保护在类的内部,尽可能的隐藏内部的实现细节,只保留一些对外接口使之与外部发生联系
比如一个房子是一个对象,里面有沙发,空调,电视机是这个房子的私有属性,因为有墙壁,所以我们随意的改变里面的布局不会影响到外面的人,并且房子的窗户可以看作与外界访问的接口。
继承
子类继承父类的属性和方法,使得子类对象具有父类的属性和方法。
比如狗,猫都是动物,那么这两者就可以继承动物这个父类,姓名,年龄等属性就可以写入到父类里面,减少了重复代码。
多态
多态是指在面向对象编程中,同一个类的对象在不同情况下表现出来的不同行为和状态。
多态有三个前提条件:
- 子类继承父类
- 子类重写父类的方法
- 父类引用指向子类对象
3.重载和重写的区别
重写
重写就是子类把父类的方法重新写一遍。比如子类继承了父类原有的方法,但是子类不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型都相同的情况下,对方法体进行修改,就是重写。但是子类函数的访问修饰符权限要少于父类的,并且不能抛出新的检查异常或者不能比原本方法的检查异常更广泛。重写是运行时的多态性。
重载
在一个类中,同名方法如果有不同的参数列表,视为重载,同时,重载对返回类型没有要求,但不能通过返回类型是否相同判断重载。重载是编译时的多态性。
4.访问修饰符的区别
Java中可以使用访问修饰符来保护对类,变量,方法,构造方法的访问。
- private:在同一类中可见,可以修饰对象,方法,不能修饰外部类
- default:在同一个包内课件,使用方法同上
- protected:对同一个包内的类和所有子类可见,同上
- public:对所有类可见,使用对象:类,接口,方法,变量
5.= =和equals()的区别
基本数据类型:= =比较的是值;引用数据类型:= =比较的是对象的内存地址(引用数据类型变量存储的是地址,对应的地址存储数据)
equals()不能作用于基本数据类型变量,如果对equals方法重写,比较的就是引用类型变量指向的对象地址,如果重写的话,比较的就是所指对象的内容。
6.hashCode()作用
hashCode的作用是获取哈希码,也成为散列码,,这个哈希码的作用是确定该对象在哈希表中的索引位置。
哈希表存储的是键值对,可以根据键快速检索出对应的值.
为什么要有hashCode()
以HashSet如何检查重复为例:当你把对象加入HashSet时,HashSet会先计算对象的hashCode值来判断对象加入的位置,同时也会于其他已经加入的对象的hashCode值比较,如果没有相符的hashCode,hashset会假设对象没有重复出现;但如果有相同hashCode对象,这时会调用equals()方法来检查hashCode相等的对象是否真的相等,如果相同,hashset就不会让其加入,如果不同,就会重新散列到其他位置,这样就大大减少了equals的次数,提高了执行速度。
为什么JDK要同时提供这两个方法
- 因为在一些容器中,比如刚刚的HashSet,有了hahsCode之后,判断元素是否存在的操作效率会更高。
- hashCode会帮我们大大缩小查找成本。
为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?
因为 hashCode() 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的 hashCode )。