1024 字
5 分钟
java学习笔记(7)
方法引用
- 引用处需要是函数式接口
- 被引用的方法已经存在(可以由java提供,也可以是第三方)
- 被引用的方法的参数和返回值要和抽象方法的参数返回值一致
- 核心:lambda表达式改写
例子:排序
public class sort {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(list);
Collections.shuffle(list);
Collections.sort(list, (o1, o2) -> o2 - o1);
System.out.println(list);
Collections.shuffle(list);
Collections.sort(list, sort::sub);
System.out.println(list);
}
public static int sub(int a, int b) {
return b-a;
}
}引用静态方法
- 格式:ClassName::StaticMethodName
- 例子:Integer::parseInt
// list:{"1", "2", "3", "4"}
list.stream().map(Integer::parseInt).collect(Collectors.toList());引用成员方法
- 格式:Object::MethodName
- this::name
- super::name
list.stream().filter(new Judge()::judge).collect(Collectors.toList());引用构造方法
- 格式:ClassName::new
list.stream().map(Student::new).collect(Collectors.toList());异常
异常继承自Throwable
idea快捷键:Ctrl+Alt+T
| 方法名 | 说明 |
|---|---|
| public String getMessage() | 返回此throwable的详细消息的字符串 |
| public String toString() | 返回此throwable的简短描述 |
| public void printStackTrace() | 打印异常的错误信息 |
printStackTrace()在系统底层使用System.err.println("")输出
捕获异常:
try{
...
}catch{
...
}抛出异常:
public void function() throws Exception{
throw new Exception();
}- throws: 告诉使用者,可能抛出哪些异常
- throw:抛出异常
自定义异常
public class MyException extends RuntimeException{
public MyException(){};
public MyException(String message){
super(message);
}
}- 运行时异常:RuntimeException
- 编译时异常:Exception
字符编码
在Java中,String的编解码主要涉及到字符集(Charset)的概念,字符集决定了如何将字符(例如字母、数字、符号等)映射为字节序列,以及如何将字节序列映射回字符。Java中的String是以UTF-16编码存储的,但是我们可以使用不同的字符集对其进行编码和解码。
编码(Encoding)
编码是将String对象转换为字节序列的过程。在Java中,可以使用String类的getBytes()方法来进行编码,这个方法可以指定使用的字符集。
String str = "你好,世界!";
byte[] bytes = str.getBytes("UTF-8"); // 使用UTF-8编码在上面的例子中,str字符串被转换为字节序列bytes,使用的是UTF-8编码。如果不指定字符集,getBytes()方法会使用平台的默认字符集。
解码(Decoding)
解码是将字节序列转换回String对象的过程。在Java中,可以使用String类的构造方法来进行解码。
byte[] bytes = ...; // 假设这是某种编码的字节序列
String str = new String(bytes, "UTF-8"); // 使用UTF-8解码在上面的例子中,bytes字节序列被转换回字符串str,使用的是UTF-8编码。同样,如果不指定字符集,会使用平台的默认字符集。
常见字符集
- UTF-8:一种变长的编码方式,可以用1到4个字节表示一个字符,兼容ASCII码。
- UTF-16:Java内部使用的是UTF-16编码,用2或4个字节表示一个字符。
- GBK:中国的国家标准,兼容GB2312,用于中文编码。
- ISO-8859-1:西欧语言的编码字符集。
编解码中的常见问题
- 乱码:如果编码和解码时使用的字符集不一致或者没有读完整个汉字,就会出现乱码。
- 字符集不支持:尝试使用不支持的字符集进行编解码会抛出
UnsupportedEncodingException。
示例
下面是一个完整的示例,展示了如何进行编码和解码:
import java.io.UnsupportedEncodingException;
public class StringEncodingExample {
public static void main(String[] args) {
String originalString = "你好,世界!";
try {
// 编码
byte[] utf8Bytes = originalString.getBytes("UTF-8");
byte[] gbkBytes = originalString.getBytes("GBK");
// 解码
String utf8String = new String(utf8Bytes, "UTF-8");
String gbkString = new String(gbkBytes, "GBK");
// 输出结果
System.out.println("原始字符串: " + originalString);
System.out.println("UTF-8编码后解码: " + utf8String);
System.out.println("GBK编码后解码: " + gbkString);
// 错误的解码示例(会导致乱码)
String wrongString = new String(utf8Bytes, "GBK");
System.out.println("错误的解码: " + wrongString);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}在这个示例中,我们首先将原始字符串originalString使用UTF-8和GBK编码,然后分别使用相同的字符集进行解码,最后输出结果。我们还展示了一个错误的解码示例,即使用错误的字符集解码,这会导致乱码。

