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

  • 相关阅读:
    <经验杂谈>C#/.Net中xml的Serialization序列化与DeSerializetion反序列化
    <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数
    应用highcharts做直观数据统计
    ASP.net获取当前页面的文件名,参数,域名等方法
    C#中唯一标识符GUID的一些知识点
    理清fineuploader无刷新上传的一些事
    webform开发经验(一):Asp.Net获取Checkbox选中的值
    C#/.Net Post获取数据流的一种简单写法
    C#中的一种按日期分文件夹的日志写法
    C# Datatable导出Excel方法
  • 原文地址:https://www.cnblogs.com/zhangxuuy/p/9674638.html
Copyright © 2020-2023  润新知