面向对象
封装 继承 多态
封装:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项内部细节对外部调用透明,外部调用无需修改或者关心内部实现。
继承:继承基类的方法,并做出自己的改变和/或扩展 子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的。
多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。需要三个条件:继承,方法重写,父类引用指向子类对象。
JDK JRE JVM的区别
JDK:Java Deelpment Kit java开发工具
JRE:Java Runtime Environment java运行时环境
JVM:java Virtual Machine java虚拟机
String StringBuffer StringBuilder的区别
String是final修饰的,不可变,每次操作都会产生新的String对象
StringBuffer和StringBuilder都是在原对象上操作
StringBuffer是线程安全的,StringBuilder线程不安全的
StringBuffer方法都是synchronized修饰的
性能:StringBuilder > StringBuffer > String
场景:经常需要改变字符串内容时使用后面两个
优先使用StringBuilder,多线程使用共享变量时使用StringBuffer
重载与重写
重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。
重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类。如果父类方法访问修饰符为private则子类就不能重写该方法。
接口和抽象类的区别
抽象类可以存在普通成员函数,而接口中只能存在public abstract方法。
抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
抽象类只能继承一个,接口可以实现多个。
List和Set的区别
List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用lterator取出所有元素,在逐—遍历,还可以使用get(int index)获取指定下表的元素。
Set:无序,不可重复,最多允许有一个Nul元素对象,取元素时只能用lterator接口取得所有元素,在逐一遍历各个元素。
ArrayList和LinkedList区别
ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定初始容量可以极大提升性能、甚至超过linkedList (需要创建大量的node对象)
LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询:需要逐一遍历
遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过geti)取得某一元素时都需要对list重新进行遍历,性能消耗极大。
另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexOf对list进行了遍历,当结果为空时会遍历整个列表。