一:数据结构:
1:数据的存储一般分线性存储结构和链式存储结构两种。前者是一种顺序的存储方式,在内存中用一块连续的内存空间存储数据.
即逻辑上相连的物理位置相邻,比较常见的就是数组;后者是一种链式存储方式,不保证顺序性,逻辑上相邻的元素之间用指针所指定,它不是用一块连续的内存存储,逻辑上相连的物理位置不一定相邻。
这就是数组和链表的区别。
栈:先进后出
栈是一种“后进先出”的数据结构,对栈的插入和删除操作都是在栈头位置进行的,这与在单向链表的表头插入和删除元素的原理类似,因此可以用单向链表实现栈。
队列:先进先出
队列是一种“先进先出”的数据结构,队列的插入操作是在队尾进行的,而删除操作是在队头进行的,这与在双端链表的表尾插入和在表头删除操作是类似的,因此可以用双端链表实现队列。
数组:查询快:数据的地址是连续的,我们通过数组的首 地址可以找到数据,通过数组的索引可以快速查询。
增删慢:数组的长度的是固定的,想要增加或者删除,必须创建一个新数组,把原数组的数据复制过来。
链表:查询慢:地址不是连续的,每次查询都是从头开始 查询。
增删快:链表结构,新增删除一个原始对链表的整体结构没有影响。
链表中的每一个元素也成为一个节点,一个节点包含了一个数据源(存储数组) ,两个指针(存储地址)
[自己的地址,数据,下一个节点的地址]
单项链表:链表中只有一条链子,不能保证元素的顺序,存储元素和取出元素的顺序可能不一致。
无序的,删除,增加快。
双向链表:链表中有两条链子,双向链表的每个结点既能指向下一个结点,又能指向前一个结点,双向链表既能从头结点向尾结点遍历,又能从尾结点向头结点遍历,既有一个头结点,又有一个尾结点。
二.collection
1.list:有序,可重复,有索引,查询快
arrayList:有序可重复多线程 底层数组,查询快增删慢
LinkedList :有序看可重复多线程底层链表,查询慢增删快
vector:有序可重复单线程 底层数组
2.set:不重复,无索引,不能使用普通的for循环遍历。
不重复的原因:当两个元素的.hashCode()方法返回的哈希值相同,并且两个元素的.equals()返回true时 认为两个元素是同一个元素所以就存一个,当两个元素hashCode相同当时equals返回false是认为不是同一个元素,会存进去。
set集合存储元素不重复的元素前提是:存储的元素必须重写hashCode()方法和equals()方法。
hashSet:哈希表结构查询速度快,无序,不可重复。
结构:哈希表=数组+链表或红黑树
链表是为了解决hash冲突。
LinkedHashSet:有序,不重复
结构:数组+链表或红黑树+链表
有序就是多一个链表来记录数据顺序。
三.hash
1.哈希值:是一个十进制的整数,有系统随机给出(就是对象地址,是一个逻辑地址,是模拟出来的地址,不是数据存储的物理地址)。
2. object类的 hashcode() 方法的源码
public nation int hashCode()
nation:代表改方法调用的是本地操作系统的方法。
如果不重写object的hashCode() 就调用他的方法,
重新了hashCode()方法,可以随意返回值。
string 类 重写了hashCode()
String s1= new String("abc")
String s1= new String("abc")
system.out.println(s1==s2)//ture
哈希表
jdk1.8之前 哈希表= 数组+链表
jdk1.8会后 哈希表= 数组+链表
哈希表= 数组+红黑树
特点:速度快
哈希表:数组是把相同哈希值的元素进行分组 链表/红黑树把这些哈希值相同的元素连接到一起,当链表长度大于8后把链表转换成红黑树。
collections
collections的方法
collections.addAll()
collections.sort() 排序方法
如果是自定义类型 如 List<Student> st= new ArrayList<>();
student 类型的
这个student类必须重写 comparable方法定义排序规则
排序规则:this.参数-参数 升序
参数-this.参数 降序
hashMap 特点: 1.存储是无序的 2.key和value都可以为空,但是可以只能有一个空 3.key是唯一的,底层的数据结构控制的 4.jdk1.8之前的数据结构:链表+数组 jdk1.8之后:链表+数组+红黑树 5.当链表长度大于8并且长度大于64,才将链表转换为红黑树,变为红黑树的目的是为了高效的查询。