2023年2月更新,JAVA基础与算法基础

master
1897 3 years ago
parent f58e641bc9
commit 9e0d4cd9d1

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

@ -45,4 +45,10 @@
![img_12.png](img_12.png) ![img_12.png](img_12.png)
### 单链表与双链表的反转
- 利用
- pro和next临时数组改变指向
### 红黑树
![img_13.png](img_13.png)

@ -24,4 +24,5 @@
### 归并排序 ### 归并排序
-> 先左右排序(递归) -> 先左右排序(递归)
-> 后合并merge -> 后合并merge

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

@ -0,0 +1,23 @@
### Threadlocal
- 多线程并发场景,在同线程的不同组件传递公共变量
- 每个线程变量都是独立隔离的
### 常用方法
- set设置当前线程绑定局部变量
- get获取当前线程绑定局部变量
- remove 移除当前线程绑定局部变量
### 与synchronization 区别
- 可以对变量进行加锁轻量级
- synchronization以时间换空间、排队取资源
- thread local以空间换时间提供变量副本数据隔离
### thredlocal优点
- 1.传递数据︰保存每个线程绑定的数据,在需要的地方可以直接获取,避免参数直接传递带来的代码耦合问题
- 2.线程隔离︰各线程之间的数据相互隔离却又具备并发性,避免同步方式带来的性能损失
### threadlocal内部
- ![img_5.png](img_5.png)
- 在thread内部有一个threadlocalmap存储threadlocal对象和线程变量副本作为key
### Threadlocal应用场景
- 在重入方法中代替传参
- Threadlocal代替Session使用全局存储用户信息

@ -0,0 +1,28 @@
### 将树转化为数组
- static List<Integer> kminArray(TreeNode root){
List<Integer> array=new ArrayList<>();
if(root==null){
return array;
}
//利用递归法,将树转化为数组
array.addAll(kminArray(root.left));//牛
array.add(root.val);
array.addAll(kminArray(root.right));
return array;
}
### 树的创建方法-队列
- static TreeNode createTree(int rootIndex, Integer[] values) {
if (rootIndex >= values.length) {
return null;
}
if (values[rootIndex] == null) {
return null;
}
TreeNode rootNode = new TreeNode();
rootNode.val = values[rootIndex];
rootNode.left = createTree(2 * rootIndex + 1, values);
rootNode.right = createTree(2 * rootIndex + 2, values);
return rootNode;//返回根节点
}
-

@ -47,4 +47,44 @@ Integer.MAX_VALUE 2^31-1
### 拷贝 ### 拷贝
![img_4.png](img_4.png) ![img_4.png](img_4.png)
### java内存泄露
- 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着。
- 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。
- ![img_6.png](img_6.png)
- Vector v = new Vector(10);
- Object o = new Object();
v.add(o);
- v = null
- 仅仅释放v是不够的
- GC为了能够正确释放对象会监控每个对象的运行状况对他们的申请、引用、被引用、赋值等状况进行监控Java会使用有向图的方法进行管理内存实时监控对象是否可以达到如果不可到达则就将其回收这样也可以消除引用循环的问题。
### 内存泄露的原因
- 长生命周期的对象持有短生命周期对象的引用
- ![img_7.png](img_7.png)
- HashMap、Vector等的使用最容易出现内存泄露这些静态变量的生命周期和应用程序一致他们所引用的所有的对象Object也不能被释放
- 监听器我们会调用一个控件的诸如addXXXListener() 等方法来增加监听器,但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。
- 连接数据库连接dataSourse.getConnection()),网络连接(socket)和io连接除非其显式的调用了其close() 方法将其连接关闭否则是不会自动被GC 回收的
- 内部类和外部模块的引用:
- 单例模式:单例对象在初始化后将在 JVM 的整个生命周期中存在(以静态变量的方式)
### java内存分配策略
- Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配 对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。
- 静态存储区(方法区):主要存放静态数据、全局 static 数据和常量。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
- 栈区 :当方法被执行时,方法体内的局部变量(其中包括基础数据类型、对象的引用)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会自动被释放。因为栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
- 堆区 又称动态内存分配,通常就是指在程序运行时直接 new 出来的内存,也就是对象的实例。这部分内存在不使用时将会由 Java 垃圾回收器来负责回收。
### 避免内存泄露的方法
- 在确认一个对象无用后将其所有引用显式的置为null
- 在设一个引用变量为 null 值之前,应注意该引用变量指向的对象是否被监听,若有,要首先除去监听器,然后才可以赋空值;
- 如果有数据库连接,使用 try…finally 结构,在 finally 中关闭 Statement 对象和连接。
- 特别注意一些像 HashMap 、ArrayList 的集合对象,它们经常会引发内存泄漏。当它们被声明为 static 时,它们的生命周期就会和应用程序一样长。
- 特别注意 事件监听 和 回调函数 。当一个监听器在使用的时候被注册,但不再使用之后却未被反注册。
### 内部类
- 广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
- 成员内部类可以无条件访问外部类的所有成员属性和成员方法包括private成员和静态成员
- 在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问:
- 局部内部类:是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
- 使用匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象,但是前提是这个父类或者接口必须先存在才能这样使用。
- 静态内部类也是定义在另一个类里面的类只不过在类的前面多了一个关键字static。它不能使用外部类的非static成员变量或者方法

@ -0,0 +1,9 @@
### 内部类
- ![img_8.png](img_8.png)
### 集合结构
![img_9.png](img_9.png)
### map
![img_10.png](img_10.png)
- Treemap 是红黑树

@ -0,0 +1,5 @@
### 监听器
- web应用程序事件模型的部分
- servletcintext、servletRequest web应用状态发生改变产生事件
- 监听器接收事件、处理事件
-
Loading…
Cancel
Save