面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。是一种思考问题的基础方法。
面向对象:是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象的四大特征:
面向过程
面向对象
父类引用指向子类的实例:例如:
List<Object> list = new ArrayList<>();
实体类的封装,将属性私有,只有本类能访问,如此就对信息进行的隐藏。对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问
Java是单继承的,子类从父类继承方法,使得子类具有父类相同的行为
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含汉字,所以可以存储,有些特殊的汉字没有包含在Unicode中,就不能存储了,Unicode编码占用两个字节,所以,char类型的变量也是占用两个字节
装箱:将基本数据类型转换为包装类对象
拆箱:将包装类对象转换成基本类型的值
装箱使用包装器的valueOf方法,拆箱使用包装器的intValue方法。
为什么要引入自动拆装箱?主要用于Java的集合中,集合类型只能指定包装类,List
原理?Java编译器的语法糖。
语法糖 Syntactic Sugar 糖衣语法,方便开发人员使用,JVM并不识在编译阶段解语法糖,还原为基础语法
public static void main(String[] args) { Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; System.out.println(a == b); // true System.out.println(c == d); // false } java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte,Short,Integer,Long,Character,Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池。超过了就要申请空间创建对象了
==
比较基本数据类型:比较的是变量的值
比较引用数据类型:比较的是地址值
equals
如果没重写equals方法比较的是两个对象的地址值
如果重写的了equals方法后我们往往比较的是对象中的属性的内容
equals冲Object类中继承过来的,默认的实现就是使用==
public boolean equals(Object obj){ return (this==obj) }
不能被继承,因为String类有final修饰符,而final修饰的类是不能被继承的
1、String buffer和String builder中的方法和功能是完全等价的
2、只是StringBuffer中的方法大都采用了synchronize关键字进行修饰,因此是线程安全的,而StringBuilder没有这个修饰,可以被认为是线程不安全的
3、在单线程的程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全而StringBuffer则每次都需要对锁进行判断,效率相对更低
final:修饰符(关键字) 有三种用法:修饰类、变量、和方法,
修饰类时,意味着他不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。
修饰变量时,该变量使用中不被改变,必须在声明时给定初始值,在引用中只能读取不可修改,即为常量。
修饰方法时,也同样只能使用,不能在子类中被重写。
finally:通常放在try……catch的后面构造最终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中
finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作
(1)protected Object clone()--->创建并返回此对象的一个副本。
(2)boolean equals(Object obj)--->指示某个其他对象是否与此对象“相等”。
(3)protected void finalize()--->当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
(4)Class<? extendsObject> getClass()--->返回一个对象的运行时类。
(5)int hashCode()--->返回该对象的哈希码值。
(6)void notify()--->唤醒在此对象监视器上等待的单个线程。
(7)void notifyAll()--->唤醒在此对象监视器上等待的所有线程。
(8)String toString()--->返回该对象的字符串表示。
(9)void wait()--->导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
void wait(long timeout)--->导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll()方法,或者超过指定的时间量。
void wait(long timeout, int nanos)--->导致当前的线程等待,直到其他线程调用此对象的 notify()
ArrayList,LinkedList和Vector都继承自List接口。
ArrayList和Vector的底层是动态数组,LinkedList的底层是双向链表.
ArrayList和Vector的区别就是ArrayList是线程不安全的,Vector是线程安全的,Vector中的方法都是同步方法(synchronized),所以ArrayList的执行效率要高于Vector,它也是用的最广泛的一种集合。
我们重点比较一下ArrayList和LinkedList的区别,其实ArrayList和LinkedList之间的区别就是数组和双向链表之间的区别。
数组的特点:因为数组分配的是一块连续的内存空间,使用索引来查找元素是非常快速的。但是插入,删除数据性能比较低。
双向链表的特点,查询效率较低,因为查询一个元素需要从头部或尾部开始查询,挨个遍历每一个元素直到找到所需元素,插入,删除效率高比如我们删掉一个元素直接把它前一个元素的指针指向它后一个元素就可以了