1、字符串(java.lang.String)
用到trim()
、substring()
、equals()
和length()
方法。
String trim()
,该方法返回一个新字符串,新的字符串删除了原始串中首尾的空格。String substring(int beginIndex, int endIndex)
,该方法返回一个新字符串,新的字符串包含原来字符串中从beginIndex
到endIndex-1
的所有内容。boolean equals(Object other)
,该方法用于比较两个字符串,如果原字符串与other
相等,则返回true
。int length()
,该方法返回一个字符串的长度。
2、包装类
均位于java.lang包中,下表给出了包装类和基本数据类型的对应关系:
基本数据类型 | 对应包装类 |
---|---|
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
包装类的用途主要包含两种:
- 作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
- 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
3、认识 ArrayList
ArrayList 就是动态数组,支持自动改变大小,可以灵活的插入和删除元素。你可以进一步了解ArrayList。
ArrayList 定义了一些用于插入和删除元素的方法,了解一下:
方法 | 说明 |
---|---|
add(E e) | 将指定的元素添加到此列表的尾部 |
clear() | 移除此列表中的所有元素 |
contains(Object o) | 如果此列表中包含指定的元素,则返回 true |
get(int index) | 返回此列表中指定位置上的元素 |
remove(int index) | 移除此列表中指定位置上的元素 |
toArray() | 按从第一个到最后一个元素的顺序返回包含此列表中所有元素的数组 |
我们通过下面一个遍历ArrayList的实例来体会其用法,首先请在Eclipse中新建项目ArrayListExp
,创建一个包com.shiyanlou.course
和类ArrayListTraversal
。
主要的代码如下,在注释里你可以看到对于各行代码的解说:
package com.shiyanlou.course;
import java.util.ArrayList;
import java.util.List;
public class ArrayListTraversal {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
// 创建列表list
for (int i = 0; i < 10; i++) {
list.add(i);
// 使用add()方法,通过for循环向list中增加10个元素,每个元素即当前循环的次数值
}
System.out.println("Items in the list:");
System.out.println(list);
// 输出列表中全部的元素
System.out.println("Items in the list with odd index:");
for (int i = 1; i < list.size(); i += 2) {
// 输出列表中序号为奇数的元素,注意 i += 2 的用法
System.out.print(list.get(i)+" ");
//使用get()方法从list中取出元素
}
}
}
编写完成后,点击编译并运行,我们可以在控制台看到下面的输出结果:
4、认识HashMap
Java 自带了各种 Map 类,这些 Map 类可归为三种类型:
- 通用 Map(
HashMap
、Hashtable
、Properties
、LinkedHashMap
、IdentityHashMap
等) - 专用 Map(
java.util.jar.Attributes
、javax.print.attribute.standard.PrinterStateReasons
等) - 一个用于帮助实现您自己的 Map 类的抽象类
其中,通用Map用于在应用程序中管理映射,通常在 java.util
程序包中实现,可以直接使用。
Map 定义了几个用于插入和删除元素的方法,通过这些方法可以更改 Map 中的内容。
方法 | 说明 |
---|---|
clear() | 从 Map 中删除所有映射 |
remove(Object key) | 从 Map 中删除键和关联的值 |
put(Object key, Object value) | 将指定值与指定键相关联 |
get(Object key) | 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null |
clear() | 从 Map 中删除所有映射 |
putAll(Map t) | 将指定 Map 中的所有映射复制到此 map |
HashMap
是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null
值和 null
键。这里的键值对(key - value
)
Eclipse中新建一个项目PhoneBook
,创建包com.shiyanlou.course
和类PhoneBookByMap
。主要的代码如下:
package com.shiyanlou.course;
import java.util.HashMap;
import java.util.Scanner;
public class PhoneBookByMap {
public static void main(String[] args) {
HashMap<String, String> phonebook = new HashMap<String, String>();
// 创建一个HashMap对象,名称为phonebook,键值对的类型均为String
Scanner scan = new Scanner(System.in);
// 创建扫描器用于获取用户的输入
String keyword = new String();
// 创建一个名为keyword的字符串用于存放用户输入的关键词
phonebook = initPhoneBook(phonebook);
// 利用自写的initPhoneBook方法为电话簿装入数据,完成其初始化的步骤
System.out.println("Please input a name that you want to search:");
// 提示用户输入待查询的姓名
keyword = scan.nextLine();
// 将用户的输入信息装入字符串keyword中
while (keyword.isEmpty()) {
System.out.println("Please input a name!");
keyword = scan.nextLine();
}
// 若用户有输入某个关键词,则按照该关键词在phonebook中查找其对应的号码
System.out.println("The result is :");
System.out.println(queryPhone(phonebook, keyword));
// 这里调用了自写的queryPhone()方法
scan.close();
}
private static HashMap<String, String> initPhoneBook(HashMap<String, String> phonebook) {
// 该方法用于完成指定HashMap的初始化,为其装入一些号码数据,你也可以自定义这些数据
// Q:你还清楚形参和实参的区别吗?
phonebook.put("Steve", "13012345678");
phonebook.put("Bob", "028-80001234");
phonebook.put("Peter", "182222233333");
// 使用put()方法将姓名与电话号码相关联,存放在名为phonebook的HashMap中
// put()方法中,第一个参数为关键词key,第二个参数为其对应的值value
return phonebook;
// 返回修改后的phonebook
}
private static String queryPhone(HashMap<String, String> phonebook, String keyword) {
String result = new String();
// 创建存放结果的字符串result
result = phonebook.get(keyword);
// 使用get()方法查询keyword所对应的电话号码,并赋给result
// put()方法中,参数为关键词key,返回值为其对应的值value,未找到对应值时,返回值为null
if (result == null)
return "Can not find this user.";
// 如果未找到该用户的电话号码,则将查询结果修改为“未找到该用户”
return result;
// 返回查询结果
}
}
请查阅资料,回答下面几个问题:
- Collection与Collections的区别?
- List、Set和Map是否继承自Collection接口?
- ArrayList与Vector的区别?
- HashMap与Hashtable的区别?
五、捕获异常
,创建包com.shiyanlou.course
和类CatchException
,添加下面的关键代码:
package com.shiyanlou.course;
public class CatchException {
public static void main(String[] args) {
try {
// 下面定义了一个try语句块
System.out.println("I am try block.");
Class<?> tempClass = Class.forName("");
// 声明一个空的Class对象用于引发“类未发现异常”
System.out.println("Bye! Try block.");
} catch (ClassNotFoundException e) {
// 下面定义了一个catch语句块
System.out.println("I am catch block.");
e.printStackTrace();
//printStackTrace()的意义在于在命令行打印异常信息在程序中出错的位置及原因
System.out.println("Goodbye! Catch block.");
} finally {
// 下面定义了一个finally语句块
System.out.println("I am finally block.");
}
}
}
编写完成后,请点击编译并运行,可以在控制台看到如下的输出信息:
六、读取文件:
字节流中读取文件的方式主要有两种方法:
int read()
,从此输入流中读取一个数据字节。返回:下一个数据字节。如果已到达文件末尾,则返回 -1。int read(byte[] b)
,从此输入流中将最多b.length
个字节的数据读入一个 byte 数组中。返回:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
这里使用前者来读取,代码片段如下,我们在注释中继续进行说明。
package com.shiyanlou.course;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ReadFileTest {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream("/home/shiyanlou/Desktop/shiyanlou.txt");
//声明一个文件输入流file,并指明该文件在系统中的路径以方便定位
int data = 0;
//声明一个整型变量用于存放读取的数据
while ((data = file.read()) != -1) {
//在while循环中使用read()方法持续读取file,数据赋到data中
//如果读取失败或者结束,则将返回-1,这个特殊的返回值可以作为读取结束的标识
System.out.println(data);
//输出读取到数据
}
file.close();
//文件读取结束之后一定要通过close()方法关闭这个流对象
} catch (FileNotFoundException e) {
//如果文件未找到,则捕获该异常
e.printStackTrace();
} catch (IOException e) {
//如果输入输出时发生错误,则捕获该异常
e.printStackTrace();
}
}
}
读取文件其他方式:
BufferedInputStream file = new BufferedInputStream(new FileInputStream("文件的路径"));
对于字符流:
FileReader file = new FileReader("/home/shiyanlou/Desktop/shiyanlou.txt");
//声明一个文件输入流file,并指明该文件在系统中的路径以方便定位
int data = 0;//声明一个整型变量用于存放读取的数据
while((data=file.read())!=-1){
//在while循环中使用read()方法持续读取file,数据赋到data中
//如果读取失败或者结束,则将返回-1,这个特殊的返回值可以作为读取结束的标识
System.out.print((char)data);
//输出读取到数据
}
file.close();
//一定要记得读取结束后要关闭文件
BufferedReader file = new BufferedReader(new FileReader(“文件的路径”));
文件导出:
使用FileOutputStream写入文件
在熟悉了读取文件的过程后,写入文件就显得比较简单了。我们动手来实践一下。
在Eclipse中,请继续在同一个项目FileIO
的同个com.shiyanlou.course
包下面创建类WriteFileTest
。
代码片段如下:
package com.shiyanlou.course;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteFileTest {
public static void main(String[] args) {
try {
String path = "/home/shiyanlou/Desktop/newfile.txt";
//这一次我们提前声明一个字符串用于存放待写入文件的路径
String content = "shiyanlou";
//声明一个字符串存放待写入的内容
FileOutputStream file = new FileOutputStream(path);
//声明一个文件输出流对象,并指定路径
file.write(content.getBytes());
//通过write()方法将数据写入到文件中
//getBytes()方法是将字符串转化为二进制序列
file.close();
//记得关闭文件
System.out.println("File created successfully.");
//提示用户创建成功
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
编译并运行,在控制台可以看到写入成功的提示。