Java数据结构
-
枚举 (Enumeration) 接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很 广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。
- 位集合 (BitSet),位集合类实现了一组可以单独设置和清除的位或标志。
- 向量 (Vector),向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。
- 栈 (Stack)实现了一个后进先出(LIFO)的数据结构
- 字典 (Dictionary)类是一个抽象类,它定义了键映射到值的数据结构。
- 哈希表 (Hashtable)Hashtable类提供了一种在用户定义键结构的基础上来组织数据的手段。
- 属性 (Properties)Properties 继承于 Hashtable.Properties 类表示了一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。
以上这些类是传统遗留的,在Java2中引入了一种新的框架 (Collection) 。
Java ArrayList
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
图示:
ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.ArrayList;//引入 ArrayList 类
ArrayList<E> objectName = new ArrayList<>();//初始化
- E表示: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
Java LinkedList
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。
LinkedList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
// 引入 LinkedList 类
import java.util.LinkedList;
LinkedList<E> list = new LinkedList<E>(); // 普通创建方法
或者
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合创建链表
Java HashSet
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。
基本类型对应的包装类表如下:
基本类型 | 引用类型 |
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
HashSet 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.HashSet;//引入 HashSet 类
以下示例我们创建一个HashSet对象sites,用于保存字符串元素:
HashSet<String> sites = new HashSet<String>();
Java HashMap
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。存储的内容是键值对(key-value)映射。
图示:
HashMap 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.HashMap;//引入 HashMap 类
以下示例我们创建一个 HashMap 对象 Sites, 整型(Integer)的 key 和字符串(String)类型的 value:
HashMap<Integer,String> Sites = new HashMap<Integer,String>();
Java Iterator(迭代器)
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
Iterator 是 Java 迭代器最简单的实现,ListIterator 是 Collection API 中的接口, 它扩展了 Iterator 接口。
Iterator 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.Iterator; // 引入 Iterator 类
Java Object类
Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。
Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。
Object类可以显示继承,也可以隐式继承,以下两种方式是一样的:
public class Runoob extends Object{
}
隐式继承:
public class Runoob{
}
类的方法
序号 | 方法&描述 |
1 | protected Object clone() 创建并返回一个对象的拷贝 |
2 | boolean equals(Object obj) 比较两个对象是否相等 |
3 | protected void finalize() 当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。 |
4 | Class<?> getClass() 获取对象的运行时对象的类 |
5 | int hashCode() 获取对象的 hash 值 |
6 | void notify() 唤醒在该对象上等待的某个线程 |
7 | void notifyAll() 唤醒在该对象上等待的所有线程 |
8 | String toString() 返回对象的字符串表示形式 |
9 | void wait() 让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 |
10 | void wait(long timeout) 让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。 |
11 | void wait(long timeout, int nanos) 与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。 |
Java 多线程编程
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
一个线程的生命周期
线程是一个动态执行的过程,它也有一个从生产到死亡的过程
线程完成的生命周期图示:
为了实现 Runnable,一个类只需要执行一个方法调用 run(),声明如下:
public void run();
你可以重写该方法,重要的是理解的 run() 可以调用其他方法,使用其他类,并声明变量,就像主线程一样。
在创建一个实现 Runnable 接口的类之后,你可以在类中实例化一个线程对象。
Thread 定义了几个构造方法,下面的这个是我们经常使用的:
Thread(Runnable threadOb,String threadName);
这里,threadOb 是一个实现 Runnable 接口的类的实例,并且 threadName 指定新线程的名字。
新线程创建之后,你调用它的 start() 方法它才会运行。
void start();
高级教程总结
多敲!多练!多问!多看!