2018/09/19
java高级之数组及扩展
数组:Array( Arrays 数组的工具类)
01.在内存中开辟一连串的空间
02.保存相同数据类型的集合
03.便于我们查询 因为有下标(索引)
04.增删的效率低,因为元素之后的数据都要改变
05.长度一旦被定义,不允许被改变
链表:
01.查询效率低
02.增删的效率高
03.分为单向,双向(互相链),循环(首尾链)
集合:
Collection(集合的工具类:Collections)
List public interface List<E> extends Collection<E>
ArrayList:
01.采用数组的形式来保存数据,默认10,每次扩充是1.5倍(有关于位移的内容)
02.查询的效率高(因为有下标)
03.增删的效率低(牵一发而动全身)
LinkedList:
01.采用的是链表结构
02.查询的效率低
03.增删的效率高
Set public interface Set<E> extends Collection<E>
存储的是唯一且无序的对象!
HashSet:
为什么Set存储的值是唯一的?
01.底层实现其实是HashMap
02.hashSet.add() 底层是hashMap.put()
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
03.把我们新增的元素作为了map的key进行存储了
HashMap的key怎么唯一的?
分析:
p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k)))
01.首先认识到一点:两个字符串的内容一致,hashCode绝对一致,
两个字符串的内容不一致,hashCode有可能一致
02.hash算法是效率最快的(比较字符串内容)
03.如果hash不一致,后续判断压根没必要执行
04.如果hash一致,还有可能内容不一致,所以继续判断
05.再比较内存地址,如果地址一致,证明内容一致,后续判断不执行
如果地址不一致,后续判断继续执行
06.实在没办法了,只能使用效率最低的equals
TreeSet:
可以排序
Map public interface Map<K,V>
HashMap
TreeMap
关于==和equals
==比较的是地址
equals比较的是值
eg: String a="abc"; /** * 01.在栈中开辟空间存储a * 02.拿“abc”字符串去常量池中查询有没有,没有(第一次创建) * 03.在常量池中开辟空间存储"abc" * 04.栈中的a就指向了常量池中的"abc"地址 */ String b="abc"; /** * 01.在栈中开辟空间存储b * 02.拿“abc”字符串去常量池中查询有没有,有 * 03.在常量池中不会开辟空间存储 * 04.栈中的b就指向了常量池中的"abc"原有地址 */ String c=new String("abc"); /** * 01.在栈中开辟空间存储c * 02.拿“abc”字符串去常量池中查询有没有,有 * 有:直接去堆中开辟空间保存"abc" * 没有:在常量池中开辟空间存储"abc",之后再去堆中开辟空间保存"abc" * 03.栈中的c指向了堆的"abc" * */ String d=new String("abc"); /** * 01.在栈中开辟空间存储d * 02.拿“abc”字符串去常量池中查询有没有,没有,不用管堆中有没有 * 03.栈中的c指向了堆的"abc" * */ System.out.println(a==b); //true System.out.println(a==c); //false System.out.println(c==d); //false //如果是equals则都相等
关于integer
-128 127 存在常量池中,超出存在堆中