一、数据结构
在学习一门语言时,分析他的数据结构是必要工作。JAVA中的数据结构包括以下几种类和接口:
- 枚举
- 位集合
- 向量
- 栈
- 字典
- 哈希表
- 属性
1、枚举,
不必多说,基础教程中讲过。
2、位集合
一个Bitset类创建一种特殊类型的数组来保存位置。通俗点讲,Bitset是用来记录位置索引的一种数组。BitSet中数组大小会随需要增加。他有两种构造方式,分别如下:
BitSet bits1 = BitSet();
BitSet bits2 = BitSet(int size);
3、向量
向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。
和数组一样,Vector对象的元素也能通过索引访问。使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。
vector支持四种构造方法:
Vector();//创建一个默认的向量
Vector(int size);//创建指定大小的向量
Vector(int size,int incr);//创建指定大小的向量,并且增量用incr指定. 增量表示向量每次增加的元素数目
Vector(Collection c);//创建一个包含集合c元素的向量
使用如下所示:
Vector v = new Vector(3, 2);
System.out.println("Initial size: " + v.size());
System.out.println("Initial capacity: " + v.capacity());
v.addElement(new Integer(1));
v.addElement(new Double(2));
System.out.println("Capacity after four additions: " + v.capacity());
4、栈
他是一个后进先出的数据结构。示例如下:
Stack st = new Stack();
st.push(new Integer(a));//入栈
System.out.println("push(" + a + ")");
Integer a = (Integer) st.pop();//出栈
System.out.println(a);
5、字典
字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用Dictionary。由于Dictionary类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。
Dictionary类已经过时了。在实际开发中,你可以实现Map接口来获取键/值的存储功能。
Map使用如下所示:
Map m1 = new HashMap();
m1.put("Zara", "8");
6、哈希表(Hashtable)
它和HashMap类很相似,但是它支持同步。像HashMap一样,Hashtable在哈希表中存储键/值对。当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值。然后,该键经过哈希处理,所得到的散列码被用作存储在该表中值的索引。
用法如下:
Hashtable balance = new Hashtable();
double bal;
balance.put("Zara", new Double(3434.34)); //添加键值对
bal = ((Double)balance.get("Zara")).doubleValue(); //通过键获取值
balance.put("Zara", new Double(bal+1000));
System.out.println("Zara's new balance: " + balance.get("Zara"));
7、属性
Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。
Properties 类被许多Java类使用。例如,在获取环境变量时它就作为System.getProperties()方法的返回值。
用法如下:
import java.util.*;
public class PropDemo {
public static void main(String args[]) {
Properties capitals = new Properties();
Set states;
String str;
capitals.put("Illinois", "Springfield");
capitals.put("Missouri", "Jefferson City");
capitals.put("Washington", "Olympia");
capitals.put("California", "Sacramento");
capitals.put("Indiana", "Indianapolis");
// Show all states and capitals in hashtable.
states = capitals.keySet(); // get set-view of keys
Iterator itr = states.iterator();
while(itr.hasNext()) {
str = (String) itr.next();
System.out.println("The capital of " +
str + " is " + capitals.getProperty(str) + ".");
}
System.out.println();
// look for state not in list -- specify default
str = capitals.getProperty("Florida", "Not Found");
System.out.println("The capital of Florida is " + str + ".");
}
}
二、集合框架
集合框架被设计成要满足以下几个目标。
- 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。
- 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
- 对一个集合的扩展和适应必须是简单的。
为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet等,除此之外你也可以通过这些接口实现自己的集合。
三、序列化
序列化说白了就是将对象表示成一个字节序列,该字节序列能够表示对象的数据、有关对象类型的信息和存储在对象中数据的类型。序列化一般都是将对象序列化成字节,然后存入文件中。反序列化就是从文件中读取字节,然后根据字节反序列化出该对象以及他包含的信息。
文件的存储与读过程就是一个很好的序列化与反序列化的例子。
四、网络编程
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。
java.net包中提供了两种常见的网络协议的支持:
- TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称TCP/IP。
- UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
五、多线程编程
一个线程的完整周期如下所示:
- 新建状态: 一个新产生的线程从新状态开始了它的生命周期。它保持这个状态直到程序start这个线程。
- 运行状态:当一个新状态的线程被start以后,线程就变成可运行状态,一个线程在此状态下被认为是开始执行其任务。
- 就绪状态:当一个线程等待另外一个线程执行一个任务的时候,该线程就进入就绪状态。当另一个线程给就绪状态的线程发送信号时,该线程才重新切换到运行状态。
- 休眠状态: 由于一个线程的时间片用完了,该线程从运行状态进入休眠状态。当时间间隔到期或者等待的事件发生了,该状态的线程切换到运行状态。
- 终止状态: 一个运行状态的线程完成任务或者其他终止条件发生,该线程就切换到终止状态。