面向过程编程
-
把大象放冰箱
- 构造冰箱和大象的数据结构
- 开发一个把大象装冰箱的函数,传入冰箱大象的指针
- 实现 判断大象体积重量,打包 开关装 步骤
面向对象编程
-
以对象为核心作为基本的结构单元进行设计. 并不是没有面向过程的代码, 重点在对象抽象和拓展
- 大象类(有体积重量,打包 方法)和冰箱类(开关装方法)
-
封装
-
把对象的属性和操作集成为一个整体,对外隐藏内部细节。可以用访问修饰符来限制访问。
-
优点 代码复用 / 提高安全性:防止篡改 / 高内聚低耦合:利于代码维护和修改。
-
四种访问控制符
- private:只允许本类访问
- public:本项目下所有的类都可以访问
- protected:本类及其子类可以访问
- default:同一个包中的类可以访问
-
继承
- 继承使子类具有父类的属性和方法 (Java不支持多继承-(接口可以)因为钻石问题/命名冲突/代码复杂性)
- 优点: 代码复用性 / 为多态提供条件
- C++虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类. 不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员
多态
同样接口因为对象具体类不同 而有不同的表现 ⇒猫狗
- 编译时多态 ⇒ 编译时决定目标方法. overloading重载实现, 方法名相同参数不同 (比如addition方法 1个参 2个参 double参)
- 运行时多态 ⇒运行时决定. overriding重写实现/继承 同名同参
- 重载是C++的一种多态, 实现同一函数名有不同的参数,执行不同功能
Final
- 可以修饰类 方法 变量
- 修饰的最终类不能被继承
- 方法不能被重写
- 变量变成常量不能改
- String声明是final的 不可被继承
String
-
String常量池 ⇒ 在方法区中开辟 string.intern放入常量池中
- 目的提高性能,减少内存开销 实现数据共享
- 先check 后创建
-
buffer 线程安全
-
builder非线程安全
线程安全
- 多线程编程时的计算机程序代码中的一个概念。 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况
数据结构
| List | 存取有序,可以存放重复的元素,可以用下标对元素进行操作 |
|---|---|
| Set | 存取无序,不可以存放重复的元素,不可以用下标对元素进行操作 |
| Queue | 队列,通常遵循先进先出(FIFO)的原则,新元素插入到队列的尾部,访问元素返回队列的头部 |
| Map | Map 保存的是键值对,键要求保持唯一性,值可以重复 |
-
ArrayList Linkedlist Stack Queue Map Tree
ArrayList 动态数组 改慢 列表only 源码只有list特征 存储访问O(1) Linkedlist 双向循环链表 改快 列表和队列 list和Deque接口 修改元素O(n) 单链表双链表区别
单向链表只有一个指向下一结点的指针,双向链表除了有一个指向下一结点的指针外,还有一个指向前一结点的指针。
内存泄漏
- 减少使用静态变量,使用完之后及时赋值 null,移除引用
- 明确对象的有效作用域,尽量缩小对象的作用域。局部变量回收会很快。
- 减少长生命周期对象持有短生命周期的引用
- • 避免使用内部类
内存溢出
-
JVM内存过小 或者 程序不严密,产生过多垃圾
-
解决办法
- 找到tomcat容器增加JVM大小
- 优化程序,释放垃圾, 避免死循环, 防止一次载入太多数据, 及时释放没用的对象
垃圾回收
两种方式 ⇒ 标记清除(产生碎片)和标记整理
-
可达性分析算法 ⇒ 被GC root引用的对象存活, 没有判定可被回收
-
Minor GC 新生代 频率高, Major GC老年代,频率低 (G1 GC 多线程 高并发 低暂停)
构造方法特性
-
名字与类名相同
-
没有返回值,不能用void声明
-
生产类对象时自动执行,无需调用
-
Angular
-
双向数据绑定
-
Java中的值传递和引用传递
值传递是指对象被值传递,意味着传递了对象的一个副本,即使副本被改变,也不会影响源对象。(因为值传递的时候,实际上是将实参的值复制一份给形参。)
引用传递是指对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象的改变会反映到所有的对象上。(因为引用传递的时候,实际上是将实参的地址值复制一份给形参。)