1.数据结构
1.堆栈结构 特点:先进后出
2.队列结构 特点:先进先出
3.数组结构 查询快 增删慢
4.链表结构 查询慢 增删快
5.哈希表结构:(数组结构+链表结构) 查询较快 增删较快
2.List接口的特点
a.有下标
b.有序的(有序不是自然顺序,不是123,abc,有序指的是存和取的顺序一致)
c.可重复
实现类:
ArrayList,LinkedList,Vector
ArrayList:底层采用数组结构,查询快,增删慢
LinkedList:底层采用链表结构,查询慢,增删快
Vector:底层采用数组结构,查询快,增删慢(现在用的少了)
List结构中具有的方法:
增: add(E e);add(int index,E e);
删: remove(Object obj);remove(int index);
改: set(int index,E e);
查: get(int index);
其他方法有:
size(),clear(),contains(Object obj),toArray() ,iterator(),isEmpty()
实现类的方法:
1.ArrayList:方法基本和List中定义的一模一样
2.LinkedList:除了和List接口中一样的方法之外
3.Set接口的特点
a.无下标
b.无序的(无序指的是存和取的顺序不一定一致,LinkedHashSet和TreeSet除外)
c.不可重复
实现类:HashSet,LinkedHashSet,TreeSet
HashSet:底层采用哈希表结构,查询快,增删快,无序的
LinkedHashSet:底层采用 链表+哈希表,查询快,增删快,有序的
Set接口中的特有方法:没有,和父接口Collection基本一模一样
实现类:
HashSet和LinkedHashSet中的方法基本和Set接口一模一样
4.对象的哈希值
任何对象,都有一个哈希值,哈希值是对象的一个数字表示
对象的字符串表示,toString方法,默认表示格式:包名.类名@地址值
1.如果获取对象的哈希值?
每一个对象都有一个方法,hashCode方法,这方法定义在了Object类中,所以每个对象都具有
2.我们以前说的地址值,实际上根本不是地址值,而是哈希值的16进制
3.在java中怎么看真正的地址值? 答案是----看不了
4.哈希值的由来
是由真正的地址值计算的,通过一种散列算法(哈希算法)
所以 一般来说 地址值 不一样, 哈希值也是不一样的
5.不可逆算法(MD5,WPA2)
6.碰撞算法(一个一个式)
7.暴力破解&字典破解(破解wifi教程)
5.字符串的哈希值
只要字符串内容一样,哈希值 必定一样
两个字符串的内容不一样,哈希值可能一样
String s1 = new String("abc");//0x111
String s2 = new String("abc");//0x222
System.out.println(s1==s2);//== 比较的就是真正的地址值,false
System.out.println(s1.hashCode()==s2.hashCode());//true
System.out.println(s1.equals(s2));//true,比较内容
哈希表结构,判断元素是否重复的原理:
1.先判断 新元素的哈希值 和 所有旧元素的哈希值是否相同
如果都不相同,直接判断不重复,添加
2.再调用 新元素 和 哈希值相同的旧元素的equals方法 如果返回是true 判定重复元素 ,不添加 如果返回是false 判定不重复,添加
总结: 只有哈希值相同,并且equals返回true,才判定重复
定义一个标准的类:
1.封装(private+get/set)
2.构造(无参+全参)
3.toString(快速打印对象信息)
4.hashCode和equals(保证元素使用哈希表结构存储时的唯一性)
contains方法,判断是否包含某一个元素
ArrayList的contains方法:
names.contains(“abc”);//判断 names集合中是否包含 “abc”
只比较 equals的返回值,如果某一个元素和要判断的元素equals方法true,那么就是包含该元素
HashSet的contains方法:原理和add方法一样
set.contains(“abc”);// 先判断哈希值
再使用equals方法 只有旧元素和判断的元素 的哈希值相同 并且 euqals方法true 才判定包含