1.什么是面向对象,谈谈你对面向对象的理解?
举例:洗衣机洗衣服
面向过程来说就是一系列的步骤(函数),开洗衣机----放衣服----等等
面向对象就是分成对象 ,人和洗衣机
人:开洗衣机,放衣服
洗衣机:清洗,等等
面向过程比较直接高效,面向对象易于复用,扩展,维护。
面向对象三大特性:封装,继承,多态
封装:在于明确表示出允许外部使用的所有成员函数和数据项。,外部调用无需修改或者关心内部实现
继承:继承基类的方法,并会做出自己的改变或扩展
子类共性的方法或者属性直接使用父类的,不需要自己在定义,只需扩展自己在写的方法
多态:三个条件,(继承,方法重写,父类引用指向子类对象)
基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同
父类对象 变量名=new 子类对象
变量名.方法名();
无法调用子类特有的功能
性能调优
性能调优:包括架构调优,代码调优,jvm调优,数据库调优,操作系统调优
JVM(十) - 性能调优_EShaooo的博客-****博客_jvm调优
,JRE,JVM三者区别和联系
JDK:java开发工具
JRE:java运行的环境
jvm:虚拟机
jdk包含jre,jre包含bin(jvm)和lib(类库)
.java文件--------javac编译------->.class文件(到处运行windows和linux)
4.==和equals比较
==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址
equals:object中默认也是采用==比较
例子:
public class StringDemo { public static void main(String[] args) { String str1="hello"; String str2=new String("hello"); String str3=str2;//引用传递 (str1==str2);//false (str1==str3);//false (str2==str3);//false ((str2));//true ((str3));//true ((str3));//true } }
常量引用在方法区中,值还是在堆中。 ==比较的是栈中
5.简述final作用
final:最终的
修饰类:表示类不可被继承
修饰方法:表示方法不可被子类覆盖,但可以重载
修饰变量:便是变量一旦被赋值就不可改变他的值
(1)修饰成员变量
如果修饰的是类变量,只能在静态初始化中指定初始值或者声明该类变量时指定初始值
如果修饰的是成员变量,可以在非静态初始化块,声明该变量或者构造器中执行初始值
(2)修饰局部变量
局部变量必须由程序员显示初始化
(3)修饰基本类型数据和引用类型数据
如果是基本数据类型的变量,其数值一旦在初始化之后就不能在改了
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但引用的值是可变的
public class FinalReferenceTest { public static void main(String[] args) { final int[] iArr={1,2,3,4}; iArr[2]=-1; iArr=null;//非法,对iArr不能重新赋值 final Person person=new Person(25); (24);//合法 person=null;//非法 } }
6. String,String Buffer,String Builder区别及使用场景
String是final修饰的,不可变的,每次操作都会产生新的String对象
String Buffer和String Builder都是在原对象上操作
String Buffer是线程安全的,String Builder线程不安全的
String Buffer方法都是synchronized修饰的
性能:String Builder > String Buffer >String
场景:经常需要改变字符串内容时使用后面两个
优先使用String Builder,多线程是使用共享变量时使用String Buffer
7.重载和重写的区别
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时
public int add(int a,String b); public String add(int a,String b); //编译报错,和返回值无关,访问修饰符也可以不同(public private protected)
重写(子类重写父类的方法):发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,父类是private,子类不能重写父类。
8.接口和抽象类的区别
抽象类可以存在普通成员函数,而接口中只能存在public abstract方法
抽象类中的成员变量可以使是各种类型的,而接口中的成员变量只能是public static final类型的
抽象类只能继承一个类,接口可以实现多个类
抽象类是对类本质的抽象,什么是什么的关系,举例:宝马是一辆车
接口是对行为的抽象,什么像什么的关系 举例:鸟像飞行器一样
场景:关注事物的本质时,用抽象类 关注一个操作的时候,用接口
抽象类可以有实现的方法,也可以有未实现的方法,抽象类只能抽象一个,接口可以实现多个
和Set的区别
List:有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用Iterator取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素
Set:无序,不可重复,最多允许一个null元素对象,取元素时只能用Iterator接口取得所有元素,在逐一遍历各个元素
与equals
hashCode的作用是获取哈希码,也称为散列码,作用是确定该对象在哈希表中的索引位置,特点:能根据“键”快速的检索出对应的“值”。
如果两个对象相等,则hashcode一定也是相同的
两个对象相等,对两个对象分别调用equals方法都返回true
两个对象有相同的hashcode,他们也不一定是相等的
因此,equals方法被覆盖过,则hashcode方法也必须被覆盖
和LinkedList区别
ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问)
LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询。需要逐一遍历,必须使用iterator不能使用for循环。
12.了解Java的List吗?
List是一个接口,常见的类有ArrayList 和LinkedList
这两个实现类的区别?
ArrayList的底层数据结构是数组,支持下标访问,查询数据快,默认初始值大小为10,容量不足时会进行扩容。而LinkedList的底层数据结构是链表,将元素添加到链表的末尾,无需扩容。
ArrayList的扩容,详细讲讲?
可以看到,在grow方法里面进行扩容,将数组容量扩大为原来的1.5倍。
举个例子:如果初始化的值是8,当添加第9个元素的时候,发现数组空间不够,就会进行扩容,扩容之后容量为12。
扩容之后,会调用()方法对数组进行拷贝
ArrayList和LinkedList分别适用于场景?
对于随机index访问的get和set方法,ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每个元素直到找到为止。
新增和删除元素,LinkedList的速度要优于ArrayList。因为ArrayList在新增和删除元素时,可能扩容和复制数组;而LinkedList的新增和删除操作只需要修改指针即可。
因此,ArrayList适用于查询多,增删少的场景,而LinkedList适用于查询少,增删多的场景。
讲讲Set和List的区别?
List以索引来存取元素,有序的,元素是允许重复的,可以插入多个null; Set不能存放重复元素,无序的,只允许插入一个null.
List底层实现有数组,链表两种方式,Set基于Map实现,Set里的元素值就是Map的键值。
了解Vector吗?
Vector是底层结构是数组,现在基本没有使用Vector了,因为操作Vector效率比较低,相当于ArrayList,它是线程安全的,在扩容的时候容量扩展为原来的2倍。
有哪些线程安全的List吗?
可以使用 ()方法返回一个线程安全的List.
还有另一种方式,使用CopyOnWriteArrayList。
CopyOnWriteArrayList,详细讲讲它的原理?
是一个线程安全的List,底层是通过复制数组的方式来实现的。
CopyOnWrite就是写时复制。当我们往容器添加元素时,不直接往容器添加,而是先将当前容器进行复制,复制出一个新的热熔器,然后往新的容器添加元素,添加完元素之后,再将原容器的引用指向新容器。
这样做的好处就是对CopyOnWrite容器进行并发的读而不需要加锁,因为当前容器不会被修改。。
CopyOnWriteArrayList有什么缺点的?
主要有以下两个问题:内容占用问题,CopyOnWrite的写时复制机制,在进行写操作的时候,内存里会同时驻扎两个对象的内存。
CopyOnWrite容器不能保证数据的实时一致性,可能读取到旧数据。
怎么给List排序呢?
可以使用list自身的sort方法,或者使用(list)方法.
怎么在遍历ArrayList时移除一个元素?
如果使用foreach删除元素的话,会导致快速失败,可以使用迭代器的remove()方法,避免fast-fall问题。