Java学习笔记
一、Java常用API
字符串遍历方式:
- String.charAt();
- String.subString(beginIndex, endIndex);
- String.toCharArray();
- 使用方法:
// 方法一: for(int i=0; i < str.length(); i++) { System.out.println(str.charAt(i)); } // 方法二 for(int i=0; i < str.length(); i++) { System.out.println(str.substring(i,i+1)); } // 方法三 char[] c = str.toCharArray(); for(int i=0; i < c.length; i++) { System.out.println(c[i]); }
字符串拼接:
- 常用拼接方式:
- 使用
+
连接 - StringBuffer.append()
- StringBuilder.append()
- 区别:StringBuffer仅仅比StringBuilder多了synchronized关键字。
- String.concat(string_01)
- 该方法是String类的实例方法
- String.join(string_01, string_02, ……);
- 该方法是String类的静态方法
- 源代码中,调用StringJoiner类的实例方法join()
- StringUtils.join(string_01, string_02, ……)
- 使用
- 直接使用
+
连接多个字符串,系统性能消耗太大。虽然编译器会对其进行优化(使用StringBuilder对象),但编译后生成的StringBuilder会很多。 - 建议:
- 使用
StringBuilder
对象进行拼接。
- 使用
- 常用拼接方式:
字符串反转:
常用反转方法:
- 字符串从后往前遍历。
- StringBuilder的reverse()
- 前后字符串互换
- Collections的静态方法reverse()
示例:
// 方法一-字符串从后往前遍历 String output = new String(); for (int i = ("asdf".length() - 1); i >= 0; i--) { output += ("asdf".charAt(i)); } // 方法二-StringBuilder的reverse() StringBuilder builder = new StringBuilder("asdf"); String output = builder.reverse().toString(); // 方法三-前后字符串互换 char[] array = "asdf".toCharArray(); int length = array.length - 1; int half = (int) Math.floor(array.length / 2); char c; for (int i = length; i >= half; i--) { c = array[length - i]; array[length - i] = array[i]; array[i] = c; } // 方法四-Collections的静态方法reverse() List<Character> aLetterList = new ArrayList<>(); for (char aLetter : "asdf".toCharArray()) { aLetterList.add(aLetter); } /* 字符串反转 */ Collections.reverse(aLetterList); StringBuilder builder = new StringBuilder(); for (char letter : aLetterList) { builder.append(letter); }
二、Web服务器基础
静态资源与动态资源:
- 静态资源:由客户端向服务器取得已经存在的相应文件,服务器返回给客户端,并由客户端渲染解析。
- 动态资源:客户端请求的动态资源,先由服务器交由数据库处理,再将处理好的内容返回给客户端。
HTTP协议:
- HTTP请求方法(以不同的方式操作指定资源):
- Get:向指定资源发出读取数据请求。
- Head:向指定资源发出读取数据请求,服务器不返回资源的正文部分,仅有头部信息(元数据)。
- Post: 向指定资源提交数据
- 例如:提交表单、上传数据
- Put:向指定资源提交数据
- Delete:请求服务器删除URL指定的资源
- Trace:回显服务器收到的请求
- Options:使服务器传回该资源所支持的所有HTTP请求方法
- Connect:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- 注意事项:
- 以上的请求方法一定要被对应的资源所支持。
- HTTP服务器至少应该实现GET和HEAD方法
- 状态码:
1xx
: 消息——请求已被服务器接收,继续处理2xx
: 成功——请求已成功被服务器接收、理解、并接受3xx
: 重定向——需要后续操作才能完成这一请求4xx
:请求错误——请求含有词法错误或者无法被执行5xx
: 服务器错误——服务器处理某个正确请求时发生错误
- 请求报文:
- 构成:请求行 + 请求头 + 请求正文
- 如图所示
- 相应报文:
- 构成: 响应行 + 响应头 + 响应正文
- 如图所示:
- HTTP请求方法(以不同的方式操作指定资源):
三、异常
JVM默认异常处理方式:
- 将异常名称 + 异常详细信息 + 异常位置输出在控制台上,同时程序停止运行。
- 示例:
// 控制台输出内容 Exception in thread "main" java.lang.ArithmeticException: + / by zero + at cn。itcast_01.ExceptionDemo.main(ExceptionDemo.java:31)
Throwable类的常见方法:
getMessage()
: 返回异常详细信息toString()
: 返回异常详细信息 + 异常名称printStackTrace()
: 返回异常详细信息 + 异常名称 + 异常位置
异常的分类:
- Exception(extends Throwable)
- 可检测异常(Checked Exception):必须被显式捕获处理
- 一般为代码逻辑异常,可以通过try-catch块处理。
- 不检测异常(Unchecked Exception):也叫做运行时异常。
- 可检测异常(Checked Exception):必须被显式捕获处理
- Error(extends Throwable)
- 一般为JVM异常,不可被捕获处理。
- Exception(extends Throwable)
异常的注意事项:
- 多个catch块排列顺序:由细到粗、从子类到父类
- throw语句抛出异常后,之后额语句不会执行。
四、集合
- 迭代器的使用
- 实现Collection接口的类
- 与while循环结合
// 创建一个List ArrayList<String> list = new ArrayList<>(); // 创建迭代器 Iterator iterator = list.iterator(); // 迭代列表 /** * Iterator.next(): 返回下一元素,并往后移一位 */ while(iterator.hasNext()) { System.out.println(iterator.next()); }
- forEach循环:
- forEach循环本身就相当于一个迭代器
- 示例i:
for (String letter : list) { System.out.println(letter); }
- 与while循环结合
- 实现Map接口的类
- 与while循环结合
// 创建一个Map HashMap<String, Object> map = new HashMap<>(); // 创建迭代器 /** * 通过entrySet返回迭代器对象 */ Iterator iterator = map.entrySet().iterator(); // 迭代遍历 while (iterator.hasNext()) { System.out.println(iterator.next()) }
- forEach循环
- 示例:
for (Object entrySet : map.entrySet()) { System.out.println(entrySet) }
- 示例:
- 与while循环结合
- 实现Collection接口的类
五、IO
数据流分类:
- 字节流
- 对应的IO类的方法以Stream方法结尾
- 字符流:由一个个的字符组成的、有顺序的、单向的、有起点和终点的数据集合。
- Java中的字符统一采用Unicode编码。即一个字符占2个字节
- 对应的IO类的方法以Reader / Writer结尾
- 字节流
IO类中的常见方法:
- 可根据数据流的类别将IO类的方法分为两类,如图所示。
- 可根据数据流的类别将IO类的方法分为两类,如图所示。
在 Java7 之后,可以在 try 块中打开流,最后程序会自动关闭流对象。
在字节输入流中,InputStream是所有字节输入流的父类,InputStream类有3个基本的读方法:
read()
:读取并返回一个字节的数据,- 如果返回-1,表示读到了输入流的末尾。
read(byte[] b)
:将数据读入一个字节数组,同时返回实际读取的字节数。- 如果返回-1,表示读到了输入流的末尾。
read(byte[] b, int off, int len)
:将最大字节数为len的数据读入到起始偏移位置为off的数组b中。
在字节输出流中,OutputStream是所有字节输出流的父类,OutputStream类有3个基本的写方法:
write(int b)
:往输出流中写入一个字节。write(byte[] b)
:把数组b中的所有字节输出。write(byte[] b, int off, int len)
: 把数组b中从起始偏移量off开始的len个字节的数据输出。
在字符输入流中,Reader是所有字符输入流的父类,Reader类有3个基本的读方法:
read()
:读取并返回一个字符。read(char cbuf[])
: 读取一系列字符到数组 cbuf[]中,返回值为实际读取的字符的数量。read(char cbuf[],int off,int len)
: 读取 len 个字符,从数组 cbuf[] 的下标 off 处开始存放,返回值为实际读取的字符数量。