数据结构:
定义: 数据结构是计算机存储和组织数据的方式。
常见的数据结构有:
- 数组(Array): 数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。
- 栈( Stack): 栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作(读取的时候先进后出)。
- 队列(Queue): 队列也是特殊的线性表,不过它的插入和删除操作分别在队尾后队头(读取的时候先进先出)。
- 链表(Linked List): 每个节点都不是连续的连接,每个节点包括数据域和指针,所以一个节点存储着本节点的地址还存在着下一节点的地址。
- 树( Tree): 树是典型的非线性结构,只有一个根节点。
- 堆(Heap): 是一种特殊的树,其特点是根节点是所有节点最小的。
- 哈希表: 指存在一个节点与T节点相等的记录,那么必定在T能够找到相等的记录,以节省查找时间。
扩展:
线性结构: 线性结构是一个有序数据元素的集合。
特点:
- 集合中必存在唯一的一个"第一个元素"。
- 集合中必存在唯一的一个"最后一个元素"。
- 除最后元素之外,其它数据元素均有唯一的"后继"。
- 除第一元素之外,其它数据元素均有唯一的"前驱"。
注意:后继指的是每一个元素都有其确定的后继元素,即2后面是3;前驱与其相反;列如(a0,a1,a2,a3…an),a0是其唯一的第一个元素,an是其唯一的最后一个元素,所以此为线性结构。
非线性结构: 非线性结构就是每一个节点都有多条联系。
特点:每个节点具有前驱和多个后继。
数组与集合的比较:
区别:数组的长度是固定的(未定义长度,默认长度为10),集合的长度可以随数据的长度对应增长。
集合结构:
TreeMap:自动排序,非线程安全,键允许为空,值不允许,插入删除比HashMap稍差,二叉树映射结构。
HashMap:无序,非线程安全(不过可以靠ConcurrentHashMap来实现安全),键和值都允许为空,插入删除都快,哈希映射结构。
HashTable:无序,线程安全,键和值都不允许为空,键和值都不允许为空,插入删除最慢,哈希字典结构。
LinkedList:有序,非线程安全,元素允许为空,插入删除快(插入删除时,元素的位置不变),遍历慢(有指针),链表结构。
ArrayList:有序,非线程安全,元素允许为空,插入删除慢(插入删除时,元素的位置会改变),遍历快(没有指针),数组结构。
Verctor:有序,线程安全,元素允许为空,插入删除慢,遍历快,数组结构。
HashSet:无序,非线程安全,元素允许为空,存取快,哈希结构。
TreeSet:无序,非线程安全,元素不允许为空,存取稍慢,树结构。
名称 | 遍历 | 插入删除 | 随机访问 |
---|---|---|---|
List | 快 | 慢 | 快 |
Map | 慢 | 快 | 快 |
Set | 快 | 快 | 慢 |
集合常用的操作:
//List的操作
List<String> llt=new LinkedList<String>(); //默认类型是Object
llt.add("name");//添加
llt.add("wish");
llt.add("age");
llt.set(0,"id");//修改,索引是从0开始
llt.remove("name");//删除name
llt.clear();//清楚llt中元素
llt.get(0);//获取索引为0的数据
llt.indexof("age");//获取age的索引值
llt.contains("age");//判断是否含有age
llt.isEmpty();//判断llt中是否有元素
llt.length();//获取llt的长度
-------------------------------------------------------------
//foreach遍历
for(String s:llt){
System.out.println(s);
}
//迭代遍历
Iterator it=llt.Iterator();//生成llt的迭代子
while(it.hasnext())//判断是否有元素
{
System.out.println(it.next());//输出
}
//for循环遍历
for(int i=0,i<llt.size(),i++)//size()方法是获取元素个数
{
System.out.println(llt[i]);//输出
}
//Map的操作
Map map=new HashMap();
map.put("1","one");//增加元素
map.put("2","two");
map.put("3","three");
map.putall(map1);//将map1中元素全部放入map中
map.clear();//清除map中元素
map.remove("1");//删除键为1的元素
map.isEmpty();//判断是否为空
map.containValue("one");//判断是否有值为one的
map.containKey("1");//判断是否有键位1的
map.get("1");//查找键为1的
map.size();//元素的个数
------------------------------------------------------------------
//用keySet()遍历,获取key值
for(String key:map.keySet())
{
System.out.println("元素值:"+map.get(key)+"key值"+key);
}
//用迭代器遍历
Iterator it=map.Iterator();
while(it.hasnext())
{
System.out.println(it.next());
}
数组结构:
String[] i={"12","32","33","445","253"};//直接创建数组
String[] i1=new String[3];//先初始化,再添值
i1[0]="23s";
i1[1]="for";
i1[2]="ois";
String i2=new String[]{"fr","sdf","ge","go"};//初始化时直接赋值