zoukankan      html  css  js  c++  java
  • 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 存在常量池中,超出存在堆中

  • 相关阅读:
    28完全背包+扩展欧几里得(包子凑数)
    HDU 3527 SPY
    POJ 3615 Cow Hurdles
    POJ 3620 Avoid The Lakes
    POJ 3036 Honeycomb Walk
    HDU 2352 Verdis Quo
    HDU 2368 Alfredo's Pizza Restaurant
    HDU 2700 Parity
    HDU 3763 CDs
    POJ 3279 Fliptile
  • 原文地址:https://www.cnblogs.com/zhangxuuy/p/9674638.html
Copyright © 2011-2022 走看看