随看随记
- Java 值传递 赋值
- 对于递归来讲,最重要的就是 base case(基础)和 neighbor(邻居)
- 对于List的递归 尽量去判断其列表本身 list 多去迭代几次而不是 其list.rest
- 对于List的迭代 尽量用迭代器 并不适用this 关键字
- 静态方法只能改变静态变量,因为要遵守黄金法则。
- java.util.Arrays.equals 可以比较两个数组内所有的项的内容是否相等。
- 对于一个SLList来讲,SLList的地址是sentinel的地址,通过sentinel来对整个包装列表进行操作。
Hello World
- Java中所有的代码都必须写在Class中
- .java -> 编译(javac)->.class->解释器 -> 运行代码
Defining and Using Classes
- 当人为编译 DogLauncher时 java会自动编译Dog 因为DogLauncher需要有Dog依赖才能继续运行
- 仅仅声明 并未实例化
- 仅仅实例化 但是没有对象赋值 无法使用 会直接被java当作垃圾回收
- 将一个已经实例化以后的狗分配给已经声明的变量
References, Recursion, and Lists
-
205.75 被储存到32位中 前16位是小数点前 后16位是小数点后
-
-
声明 和 new 的创建对象
Java List 链表表示
原始List创建
- IntList内存可视化
- 正向创建链表 从开头开始 正向建表 到结束。
带有构造函数的List创建
- IntList内存可视化
- 反向列表 从结束开始创立 从写法上 感觉这种更加简单
获取List的长度l.size()(递归方法)
-
- size方法递归可视化
- 通过多次递归 寻找IntList中的null 在返回时 依次叠加
获取List的长度l.size()(迭代方法)
-
在 iterativeSize中 p 可以直接通过l的指针this来得到 我好久没遇见这种写法了
总结练习
- 在效率等方面 迭代更好 但是递归的代码更简洁
- 注意学习一下递归的写法,要注意base case(基本盘)和neighbor(邻居 ),将beighbor想 base case上靠即可。
习题
- 两个函数的可视化
- 主要是迭代在List中的利用
- 迭代要针对当前list 而不是而不是list.rest
- List的迭代不要使用this 关键字
SLList 列表的包装类
- 设计LIst包装类的目的就是 隐藏掉对象 只通过索引就可以找到相应的存储内容。
addFirst() 和 getFirst()
- 其很重要的一点就是利用 addFirst 和 getFirst 来进行列表的填充和获取列表的首个的内容
- 上面两个方法的可视化
安全与密封
- 通过将IntNode 嵌入到SLList中来进行包装 并将其设置成私有和静态 来拒绝外部的直接访问,提高了SLList的安全性
public class MySLList {
// 在外界不需要关注并且需要保护的情况下 需要将其设置成私有
// 在外界不需要操作 嵌套类的时候 可以将其设置成 静态 static
// 将static 看成 never looks outwards
private static class MyIntNode {
public int item;
public MyIntNode next;
public MyIntNode(int i, MyIntNode n) {
item = i;
next = n;
}
}
private MyIntNode first;
public MySLList(int x) {
first = new MyIntNode(x, null);
}
/**
* 返回列表中的第一项
*/
public int getFirst(){
return first.item;
}
/**
* 添加一个int 到list的最前面
*/
public void addFirst(int x){
first = new MyIntNode(x, first);
}
public static void main(String[] args) {
MySLList L = new MySLList(10);
L.addFirst(15);
}
}
addLast() 和 size()
- 两个方法的可视化 size的迭代的方法也在里面
- 在包装后类如果想实现递归 就需要 建立一个私有的对外非公开的方法来代替原有的方法进行递归操作 用其输入参数的来进行递归操作
- 个人感觉在包装以后 迭代操作会更加容易一点 但是递归需要建立私有静态类的思想要了解。
Cache
- 使用递归来获得size的方法复杂度过高 因此引入size成员变量 来进行缓存 每次进行 add操作的时候仅仅需要操作size get的时候仅仅需要 return this.size 就可以了 大大减小了时间的消耗
Empty List
- 主要解决的问题 在存在空构造之后 会有可能存在第一个节点的对象为null,需要额外用if语句进行条件判断。如下所示,因此引入哨兵节点。