写在前面
上一篇博客学习了数组和对象的使用以及内存中的基本占用。这次就来学习一下java中常见的一些API。
ArrayList
在上一节我们已经学过,数组的长度是不可改变的,这在开发中会有很多的不方便。而ArrayList就提供了一个可变长度的集合。下面来看基本的使用:
/**
* 数组的长度不可以改变
* 但ArrayList的集合的长度是可以改变的
* 对于ArrayList来说,有一个尖括号<E>表示泛型
* Tips:泛型只能是引用类型,不能是基本类型
* 对于ArrayList来说,直接打印不是地址值,而是内容。
* @param args
*/
public static void main(String[] args) {
// 创建了一个装着String种类的名字为list的集合
// 从jdk1.7+开始右侧的尖括号内部可以不写内容
ArrayList<String> list = new ArrayList<>();
System.out.println(list);
// 向集合添加数据
list.add("啊这");
list.add("这啊");
System.out.println(list);
}
可以看到,基础使用十分简单,只要定义好一个ArrayList后就可以很方便的使用了。
下面来看里面的几个常用方法:
/**
* ArrayList中的常用方法
* 1. boolean add(E e) 向集合中添加元素,参数的类型和泛型一致。
* Tips:对于ArrayList来说,add添加动作一定成功,所以返回值可以不需要写。其他集合不一定。
* 2. E get(int index) 从集合当中获取元素,参数是索引编号,返回值是对应位置的元素
* 3. E remove(int index) 从集合中删除元素
* 4. int size() 获取集合的长度
*/
public static void method(){
ArrayList<String> list = new ArrayList<>();
// 向集合中添加数据
boolean success = list.add("刘某");
list.add("王某");
System.out.println(list);
System.out.println("添加的动作是否成功 : " + success);
// 获取元素
String s = list.get(0);
System.out.println("第一号索引位置 : " + s);
// 删除元素
String whoRemoved = list.remove(1);
System.out.println("whoRemoved = " + whoRemoved);
// 获取长度
int size = list.size();
System.out.println(size);
// 遍历集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
可以看到,使用ArrayList会带来极大的方便。那么我们刚才提到,不能使用ArrayList来存储基本类型,那是真的不能吗?其实不是的,java中提供了包装类,可以通过包装类来存储基本类型的ArrayList:
/**
* 存储基本类型的ArrayList
* 可以使用包装类
* 除了int和char的对应包装类,其他都是首字母大写
* int Integer
* char Character
* 从JDK 1.5+开始支持自动装箱 自动开箱
* 自动装箱:基本类型 -> 包装类型
* 自动开箱: 包装类型 -> 基本类型
*/
public static void basicArray(){
ArrayList<Integer> list = new ArrayList<>();
list.add(100);
list.get(0);
}
static关键字
static关键字其实很简单,有点类似C语言中的static,使用了这个关键字后,会将内容存到一块特殊区域共享,比如在类中定义了一个static修饰的成员变量:
static String room;
那么这个room变量就被这个类的所有对象共用了。如果作用到成员方法上,就可以使用类名.方法名来方便的使用这个方法。
Lambda表达式
Lambda表达式是JDK1.8中新增的一个特性,称之为函数式编程。那么为什么我们需要使用Lambda表达式呢?首先来看一个例子:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "新的线程创建了");
}
}).start();
这里我们用匿名内部类实现了Runnable接口,新建了一个Thread对象。但这里面的new Runnable,方法名称等等都不是我们关注的内容,我们所关注的只有方法体中的内容。而使用Lambda表达式就可以让我们做到只关注内容:
// 使用Lambda表达式
new Thread(()->{
System.out.println(Thread.currentThread().getName() + "新的线程创建了");
}).start();
Lambda表达式的标准格式
/**
* Lambda表达式的标准格式:
* 由三部分组成:
* a.一些参数
* b.一个箭头
* c.一段代码
* 格式:
* (参数列表) -> {一些重写方法的代码}
* 解释:():接口中抽象方法的参数列表,没有参数就空着,多个参数用逗号分隔
* ->:传递的意思,把参数传递给方法体{}
* {}:重写接口的抽象方法体
* @param args
*/
Lambda表达式主要由三部分组成,参数,箭头和代码段。看起来是十分的简单,我们写几个例子看看:
// 使用Lambda表达式
invokeCook(() -> {
System.out.println("恰饭啦");
});
这里的invokeCook方法是调用了Cook接口中的makeFood方法,该方法无参无返回值,所以这么写就可以了。
// 使用Lambda表达式简化匿名内部类
Arrays.sort(arr,(Person o1,Person o2) -> {
return o1.getAge() - o2.getAge();
});
这次我们使用Arrays工具类中的sort方法,第二个参数需要填入比较的方法,我们可以直接使用Lambda表达式书写,只需要关注内部逻辑即可。
Lambda表达式的省略格式
/**
* 可以省略的内容:
* 1.(参数列表):括号中参数列表的数据类型可以省略不写
* 2.(参数列表): 括号中参数只有一个,类型和()都可以省略
* 3.{代码块} 如果{}中的代码只有一行,无论是否有返回值都可以省略({},return,;)
* Tips:要省略{},return,分号必须一起省略
*/
可以看到,我们可以省略一些内容。接下来写一个例子试试:
// 优化省略Lambda
new Thread(() -> System.out.println(Thread.currentThread().getName() + "新的线程创建了"));
这是最开始的引子,我们可以写成这样的简化格式。
使用Lambda的前提
需要注意的是,使用Lambda表达式是有前提的:
- 1.使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法
- 2.使用Lambda表达式必须具有上下文推断,即方法的参数或局部变量必须为Lambda对应的接口类型,才可以使用Lambda作为该接口的实例。
总结
今天学习的内容不多,主要补充学习了ArrayList和static关键字以及JDK8的新特性Lambda表达式。实际上,提到了集合就不得不学习一下Collection集合以及java中各种集合的接口定义等,但那些都已经学习过了,这里就不再赘述了。接下来会学习一下JDK8的一些新特性。