最近参加了字节寒假青训营,为此在豆包刷了一些题,也遇见了我以前没有考虑的问题和一些没有注意的知识点:
1.List 的使用.此前我对集合的了解仅限于 List 的创建,添加和遍历.所以当我碰见 List 并需要查找储存集合中的某个属性时有点懵.但其实它就是用来存储多个列表,有点类似于二维数组,但每个列表可以包含不同类型的元素.
存入元素:创建子列表,把数据存入子列表,添加子列表即可.
如果要给已添加子列表更新元素,则先定位目标子列表,然后更新子列表元素.
遍历:嵌套循环,外层遍历子列表,内层遍历子列表的元素
访问:两个 get 连用即可
我最后是遍历了子列表并每次找到子列表中指定值,图片找不到了,大概是这个样子:
List<Integer> a=new ArrayList<Integer>();
for (List<Integer> subList : nestedList) {
a.add(subList.get(1));
}
2.Lambda 表达式是 Java 8 引入的一种新特性,它允许你以更简洁的方式编写匿名函数。Lambda 表达式通常用于函数式接口(即只有一个抽象方法的接口)的实现。它的基本语法是:(parameters) -> expression 我使用它的情况是使用了 Lambda 表达式来遍历 HashMap 并找到出现次数最多的字符:
Lambda 表达式提供了一种简洁的方式来编写匿名函数,特别是在处理集合和流操作时非常有用。但是值得注意的是,它只能引用final 或 effectively final 的局部变量,这确保了 Lambda 表达式的行为是可预测的,并且避免在多线程环境中出现不可预测的行为。
-
final 变量在 Java 中具有以下特性:
不可变性:一旦 final 变量被初始化,它的值就不能再被修改。这意味着在变量的整个生命周期中,它的值是固定的,因此 final 常作为常量使用。 声明时初始化:通常情况下, final 变量需要在声明时进行初始化,但在某些情况下, final 变量可以在构造函数或初始化块中进行初始化,但必须在对象构造完成之前完成初始化。 值得注意的是,虽然一个变量没有被声明为 final ,但在其作用域内没有被修改过,那么它就被认为是 effectively final.
我以前只知道static用来设置静态变量,直到接触到lambda表达式(上面提到, lambda 表达式只能引用 final 或 effectively final 的局部变量)的时候我直接使用了 int 变量报错如下
解决方法就是使用数组 ,因为在我的代码中max是需要改变的,而为了在 lambda 表达式中修改外部变量的值,就可以使用数组、集合或包装类(如 Integer)来存储这个值。数组是一个引用类型,可以在 lambda 表达式中修改其元素的值,而不会违反 final 或 effectively final 的规则.