JAVA数据结构
列表(ArrayList,LinkedList,Vector)
ArrayList(不支持同步)
ArrayList中的常用方法
- add():向末尾添加元素
- size() :获取数组元素的长度
- get():获取元素的值
- remove():删除元素
ArrayList中常用的三种遍历方式
- 迭代器遍历
- 索引遍历
- for循环遍历
三种遍历方法的代码实现及其效率
//对于线性的列表,适合用for循环进行遍历
import java.util.ArrayList;
import java.util.Iterator; //迭代器
public class ListDemo {
public static void main(String[] args) {
//ArrayList创建100000个元素的列表
ArrayList<Integer> a = new ArrayList<Integer>();
int count = 100000;
for(int i = 0; i< count;i++)
a.add(i);
traverByIterator(a);
traverByIndex(a);
traverByFor(a);
}
//迭代器遍历
public static void traverByIterator(ArrayList<Integer> a) {
System.out.println("迭代器遍历");
Iterator<Integer> iterator = a.iterator(); //不能new
long startTime = System.nanoTime(); //获取系统时钟
while(iterator.hasNext()) { //存在下一个
iterator.next();
}
long endTime = System.nanoTime();
long time = endTime - startTime;
System.out.println(time);
}
//索引遍历
public static void traverByIndex(ArrayList<Integer> a) {
System.out.println("索引遍历");
long startTime = System.nanoTime();
for(int i = 0; i < a.size(); i++) {
a.get(i);
}
long endTime = System.nanoTime();
long time = endTime - startTime ;
System.out.println(time);
}
//for循环进行遍历
public static void traverByFor(ArrayList<Integer> a) {
System.out.println("for循环遍历");
long startTime = System.nanoTime();
for(Integer item:a) {
;
}
long endTime = System.nanoTime();
long time = endTime - startTime;
System.out.println(time);
}
}
运行结果
由运行结果可以看出,对于线性表的遍历适合用for循环和索引方式进行遍历,运行
时间较短,效率比较高。
LinkedList(不支持同步)
常用方法
和ArrayList的方法基本相同
三种遍历方式
- 迭代器遍历
- 索引遍历
- for循环遍历
三种遍历方式的代码实现
和ArrayList代码相同,仅仅是将ArrayList换成LinkedList
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
//链表的演示
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<Integer> b = new LinkedList<Integer>();
for(int i = 0; i < 100000;i++) {
b.add(i, i);
}
traverByFor(b);
traverByIndex(b);
traverByIterator(b);
}
//迭代器遍历
public static void traverByIterator(LinkedList<Integer> a) {
System.out.println("迭代器遍历");
Iterator<Integer> iterator = a.iterator(); //不能new
long startTime = System.nanoTime(); //获取系统时钟
while(iterator.hasNext()) { //存在下一个
iterator.next();
}
long endTime = System.nanoTime();
long time = endTime - startTime;
System.out.println(time);
}
//索引遍历
public static void traverByIndex(LinkedList<Integer> a) {
System.out.println("索引遍历");
long startTime = System.nanoTime();
for(int i = 0; i < a.size(); i++) {
a.get(i);
}
long endTime = System.nanoTime();
long time = endTime - startTime ;
System.out.println(time);
}
//for循环进行遍历
public static void traverByFor(LinkedList<Integer> a) {
System.out.println("for循环遍历");
long startTime = System.nanoTime();
for(Integer item:a) {
;
}
long endTime = System.nanoTime();
long time = endTime - startTime;
System.out.println(time);
}
}
执行结果:
因此对于链表的遍历应该采用迭代器方式,效率最高,最不适宜用索引进行顺序遍历。
Vector(支持同步,适合于多线程)
- 与ArrayList相似,属于最早的数据结构,性能上较差
- 对于非同步的情况下应该使用Arraylist
- 现在已很少使用,一般都用ArrayList代替
使用方法同ArrayList基本相同,不同的是它多了一种遍历方式---------Enumeration
集合
特点
- 确定性:集合中的元素一定是确定的
- 互异性:没有重复元素
- 无序性:元素的位置和顺序无关
集合接口Set的子类
- HashSet: 基于散列函数的集合,无序,不支持同步
- TreeSet:基于树结构的集合,可排序,不支持同步(不能容纳null)
- LinkedHashSet:j基于散列和双向链表的集合,可排序,不支持同步
集合常用操作
- add :添加元素
- clear:清空结合
- contains:判断是否包含
- remove:删除
- retainALL:计算两个集合的交集
- size:集合元素个数
- compareTo或Comparator:排序(TreeSet)
集合遍历的顺序
- HashSet:无序
- LinkedHashSet:j:按照插入时的顺序
- TreeSet:按照从小到大的顺序
映射Map
- 相当于python中的字典数据类型
映射的几种类型
- Hashtable(同步,数据量小,慢)
- HashMap(不支持同步,快,数据量大)
- Properties(同步,文件形式,数据量小)
Map的遍历方法
- HashMap
- LinkedHashMap
- TreeMap
Hashtable
- K-V对都不允许为空
- 同步,多线程安全
- 无序
Hashtable操作方法
- clear:清空
- contains/containsValue:是否包含值
- containsKey:是否包含关键字
- get:获取值
- put:添加
- remove:删除
- size:长度
HashMap
- K-V对都允许为null
- 不同步,多线程不安全
- 无序
HashMap操作方法
同Hashtable基本一致
Properties
唯一一种能够以文件形式存储的Map
Properties操作方法
包含以上的方法,但是多出四种独有的方法
- load:将文件进行加载
- store:写入到文件
- getProperty:获取属性
- setProperty:设置属性