Java数组

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 存在常量池中,超出存在堆中

posted @ 2018-09-19 15:02  之。  阅读(126)  评论(0编辑  收藏  举报