1. 数据结构
Java2中引入了一种新的框架-集合框架(Collection)
2. 集合框架
(1) 集合接口
a. 用得最多的是list接口和set接口。
b. List 接口存储的是有序的,可以重复的元素。
Set 接口存储的是无序的,不重复的数据。
c. List接口检索效率高,插入和删除效率低。
Set接口检索效率低,插入和删除效率高。
d. Map.Entry: 描述Map中的一个元素(键/值对)。
(2) 集合实现类
a. ArrayList: 实现了List的接口, 随机访问和遍历元素时效率高,插入删除效率低。多线程不安全。
b. TreeSet: 实现了Set接口,随机访问和遍历元素时效率低,插入删除效率高。多线程不安全。可以实现排序等功能。
c. HashMap: 实现了Map接口,根据键的HashCode值存储数据,具有很快的访问速度。多线程不安全。
d. 此外常用的还有Vector,ConcurrentHashMap
(3) 线程安全与不安全
a. Vector,HashTable,ConcurrentHashMap 是线程安全的。
b. ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet都不是线程安全的。
(4) 使用迭代器
a. 遍历 ArrayList
方法1: For-Each 遍历 List
for (String str : list) {
System.out.println(str);
}
方法2: 链表变为数组进行遍历
list.toArray(strArray);
for(int i=0;i<strArray.length;i++)
{
System.out.println(strArray[i]);
}
b. 遍历 Map
方法1: 普遍使用,二次取值
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
方法2: 通过Map.entrySet遍历key和value, 推荐,尤其是容量大时
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
(5) 其他
a. 集合框架的类和接口均在java.util包中。
b. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
3. ArrayList具体用法
(1) 创建数组队列: ArrayList<String> sites = new ArrayList<String>();
(2) 添加元素:sites.add("Google");
(3) 访问元素:sites.get(1); // 访问第二个元素
(4) 修改元素:sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
(5) 删除元素:sites.remove(3); // 删除第四个元素
(6) 计算大小:使用size() 方法
(7) 排序:使用 sort()方法
(7) ArrayList 中的元素实际上是对象, 所以基本类型要换成包装类
int | Integer |
long | Long |
float | Float |
char | Character |
4. LinkedList 具体用法
(1) LinkedList 是一个链表,增加和删除效率更高,查找和修改效率较低。
(2) 需要频繁的在开头、中间、末尾添加和删除元素的话使用LinkedList,否则使用ArrayList
(3) 创建数组队列: LinkedList<String> sites = new LinkedList<String>();
(4) 添加元素:sites.addFirst("Wiki"); sites.addLast("Google");
(5) 访问元素:sites.getFirst(); sites.getLast(); sites.get(1);
(6) 修改元素:sites.set(2, "Wiki"); // 第一个参数为索引位置,第二个为要修改的值
(7) 删除元素:sites.removeFirst(); sites.removeLast();
5. HashMap 具体用法
(1) HashMap 对象: HashMap<Integer, String> Sites = new HashMap<Integer, String>();
(2) 添加和修改元素: Sites.put(1, "Google");
(3) 访问元素:Sites.get(1)
(4) 删除元素:Sites.remove(1);
(5) 迭代 HashMap:
a. 输出 key 和 value
for (Integer i : Sites.keySet()) {
System.out.println("key: " + i + " value: " + Sites.get(i));
}
b. 输出每一个value
for(String value: Sites.values()) {
// 输出每一个value
System.out.print(value + ", ");
}
6. 迭代器 Iterator
(1) 使用方法:
ArrayList<String> sites = new ArrayList<String>();
Iterator<String> it = sites.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
(2) 删除元素
Iterator<Integer> it = numbers.iterator();
while(it.hasNext()) {
Integer i = it.next();
if(i < 10) {
it.remove(); // 删除小于 10 的元素
}
}
7. 泛型
(1) 使用例子:
public class Box<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> integerBox = new Box<Integer>();
Box<String> stringBox = new Box<String>();
integerBox.add(new Integer(10));
stringBox.add(new String("菜鸟教程"));
System.out.printf("整型值为 :%d\n\n", integerBox.get());
System.out.printf("字符串为 :%s\n", stringBox.get());
}
}
(2) 类型通配符 ?。例如 List<?> 是 List<String>,List<Integer> 等的父类。
public static void getData(List<?> data) {
System.out.println("data :" + data.get(0));
}
(3) 类型通配符限定: extends Number
public static void getUperNumber(List<? extends Number> data) {
System.out.println("data :" + data.get(0));
}
表示类型只能接受 Number 及其上层父类类型,String 不在这个范围之内,会报错
8. 序列化
(1) 序列化对象
{
Employee e = new Employee();
try {
FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
}catch(IOException i) {
i.printStackTrace();
}
}
注意要捕捉 IOException异常
(2) 反序列化对象
{
Employee e = null;
try {
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
}catch(IOException i) {
i.printStackTrace();
return;
}catch(ClassNotFoundException c) {
System.out.println("Employee class not found");
c.printStackTrace();
return;
}
}
}
注意要捕捉 IOException和ClassNotFoundException异常
9. 网络编程
(1) 服务端部分:
{
//创建ServerSocket,绑定端口
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(10000);
//接受客户端,创建Socket
Socket server = serverSocket.accept();
//创建数据输入流,读取数据
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
}
(2) 客户端部分
{
//输入host和port,连接服务器
Socket client = new Socket(serverHost, port);
//创建数据输出流,向服务端发送数据
OutputStream outToServer = client.getOutputStream();
DataOutputStream out = new DataOutputStream(outToServer);
out.writeUTF("Hello from " + client.getLocalSocketAddress());
//创建数据输入流,接收服务端数据
InputStream inFromServer = client.getInputStream();
DataInputStream in = new DataInputStream(inFromServer);
System.out.println("服务器响应: " + in.readUTF());
//关闭socket
client.close();
}