一些常见的数据结构:
List集合:
ArrayList:
特点:内部基于数组实现的一个集合类。查询比较快,添加和删除相对比较慢
遍历方式:如迭代器和for循环(还有其他遍历方式,这里就不全部举例了,下同)
ArrayList bag = new ArrayList();//创建集合对象
bag.add("电脑");//往数组里面添加数据
bag.add(200);
bag.add("鼠标");
bag.add("小人书");
bag.add("教材");
bag.add("牛奶");
For循环:
for(int i=0;i<bag.size();i++){
System.out.println(bag.get(i));
}
迭代器iterator:
//使用迭代器遍历集合ArrayList bag
// 获得一个迭代器
Iterator it = bag.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
双向迭代器:
Iterator 单向的迭代器接口,从左到右依次获得数据,判断是否有下一个;获得下一个
|-- ListIterator 双向的迭代器接口,它的主要方法如下:
Iterator中有的它也有;
boolean hasPrevious() 判断是否有上一个;
Object previous() 获得上一个元素;
LikedList:(是双向链表)
基于链表的List集合
1、 内部是基于双向链表结构实现的。添加和删除比较快,查询相对ArrayList比较慢
2、 内部相对于ArrayList而言多了一些操作头和尾的方法
3、 可以充当队列,堆栈
4、 不是线程安全的(同步的)
总结:LinkedList底层是基于双向链表容器类,添加和删除比较快。查找和修改较慢。
ArrayList与LinkedList的区别;
都是list的实现类
ArrayList : 数组集合(线程不安全)
特点:查询修改效率高,插入删除效率低
LinkedList:链表集合(双向链表)(线程不安全)拥有
特点:插入删除效率高
Set集合:不重复,添加无序的集合(底层是map,使用的map中的key键部分,value部分均为map的同一个静态常量)
HashSet
a、HashSet特点:
①不能添加重复元素,无序的(添加顺序和打印顺序不一致:不记录添加顺序);
②HashSet容器对象:添加完一种类型的数据之后,还能够添加其他类型(如果不定义什么类型就可以)
b、HashSet判断重复的标准通过:
①判断hashcode
②判断equals
如果两个对象的hashCode值相等,并且equals返回为true 就表示对象相等(重复)
在定义类时可以覆写这两个方法(为什么加这一句,废话不多说看下面的使用)
c、HashSet的使用
HashSet<自定义类> st = new HashSet ();//自定义类为存放的数据的类型
例如:
HashSet<MyType> st = new HashSet<>();
class MyType{
//覆写这两个方法,可以在st.add()方法添加数据的时候虚拟机调用
//快捷方式:shitf+alt + s 自动生成,建议equals 自己写,hashcode的方法不要动
Hashcode(){}
equals (){}
}
St.add(new MyType());(或者具体的对象)
TreeSet
a、TreeSet特点:
①不能添加重复元素,无序的(添加顺序和打印顺序不一致:不记录添加顺序);
②TreeSet容器对象:添加一种类型之后不能再添加其他类型
b、TreeSet判断重复的标准通过:
TreeSet<自定义类> st = new TreeSet();//自定义类为存放的数据的类型
①自然排序:通过自定义类实现Comparable接口 ,通过compareTo()覆写进行判断重复
②自定义排序:通过实现比较器comparator接口,通过compare()覆写进行判断重复
这两个方法返回的结果值都是一样的作用
(返回 0:重复 1:表示按add前后进行排序添加 -1:表示按add前后的倒序进行排序添加)
Map:
a、Map的解释:
键值对集合,上面两种都是collector的实现类,map不是,里面需要存放的是泛型entry<K,V>的类型(这个entry是Map接口里面的内部接口)(K\V是泛型,也就是可以自定义类型的,也可以自定义类型范围的泛型)
b、判断重复的标准
使用key作为判断重复的标准.只拿key 和已经存在的一对一对key进行比较;就少拿了一个value而已;这个原理和HashSet,TreeSet一样。设计Map的时候,并没有说具体按照什么进行判断重复,而是通过实现类进行判断;
因此实现类:HashMap、TreeMap的使用原理一样都是,但是HashSet,TreeSet里面不是键值对
c、Map的存储原理:
利用封装的,如果要封装,首先有个类型,这个类型是Entry,
Entry类型作用:Entry用来封装用户添加的一对数据.Entry类型有两个字段,添加的时候,使用Entry把两个值封装成一个对象,然后放到Map容器里面。对于Map而言,看到的只有Entry对象。
d、遍历方式:
通过转换成set或者list集合进行遍历:调用的是
entrySet() 返回:entry的set集合
KeySet() 返回:key的set集合
values() 返回:V(值的类型)的Collection集合