java编程自学记录(day14)

HashSet
 1)HashSet查找一个元素时,会先比较hashCode值,若hashCode值相同,则调用equals方法进行比较,若hashCode
 不同,则直接认为不相等,直接返回false
 2)HashSet在存入一个元素时,会通过元素的hashCode进行散列算法得到存储位置,若存储位置上有元素,则调用该元素的
 equals方法进行比较,若相同则拒绝在此存储,若不同则将该元素放在旁边(与原位置的元素使用链表相连)
 3)HashSet的内部结构:每个位置上可以存放多个元素,这几个元素之间使用LinkedList相连,但是应该尽量避免一个位置
 存储多个元素的情况,因为这样会使得Set的检索效率变低。
 4)使用HashSet集合存放元素时
  应该保证:equals与hashCode方法在API上定义的要求存放规则:不同对象存放时,不会保存hashCode相同并且
 equals相同的对象。缺一不可。否则HashSet不认为他们是重复对象

Map集合
 1)Map接口定义的集合又称查找表,用于存储所谓“Key-Value”映射对。Key可以看成是Value的索引,作为Key的对象在
 集合中的不可以重复,但Value可以重合
 2)根据内部数据结构的不同,Map接口有多种实现类,最常用的由内部为hash表实现的HashMap和内部为排序二叉树实现的
 TreeMap。Map中提供最常用的两个方法:get、put
  V put(K key , V value) (这里的V、K是泛型)
  将Key-Value对存入Map,如果在集合中已经包含了该Key,则操作将替换该Key所对应的Value,返回值为该Key原来
 所对应的Value,如果没有则返回null
  V get(Object key)
  返回与参数Key所对应的Value对象,如果不存在则返回null
 3)Map在获取元素方面相对于集合有针对性,效率更高。集合中获取元素需要遍历集合内容。而Map不需要,只要给定key就可
 以获取该元素。劣势在于多维护了一个key,占用了较多内存

HashMap
 1)基本原理
  HashMap的原理跟HashSet的原理一样,只不过HashMap以Key的hashCode进行存储位置映射。其结构也是一样的,
 即每个位置可以存储多个元素,元素之间使用链表的方式进行组织。
  其实是现有HashMap,在其基础上将value值指定为null得到了HashSet,所以两个东西其实就是一个东西。
 2)性能调优(知道即可)
  a. Capacity:容量,hash表里bucket的数量,即散列数组的大小
  b. Initial capacity:初始容量,创建hash表时,初始bucket的数量,默认构建容量是16,也可以使用特定容量。
  c. Size:大小,当前散列表中存储数据的数量
  d. Loader factor:加载因子,默认值0.75,当向散列表增加数据时,如果size/capacity的值大于
 Load factor则发生扩容并且重新散列(rehash)
  e. 性能优化:加载因子较小时,散列查找性能会提高,同时也浪费了散列桶空间容量,0.75是性能相对平衡的结果,在创
 建散列表时制定合理的容量,减小rehash提高性能。这个加载因子一般不要去动它。
 3)遍历
  方法一:获取所有的Key并根据Key获取value从而达到遍历的效果
  ps:获取所有Key的方法:keySet() 可以获取保存在该map下所有的key并以set集合的形式返回
  方法二:以键值对的形式迭代
  ps:获取键值对的方法:entrySet() 返回一个Set集合,里面的元素是Entry类型,是map中的每一组键值对,
 Entry描述一个键值对,也需要泛型约束,其中有两个方法:
  getKey(): 获取key值
  getValue(): 获取value值
  得到Entry集合的方法:Set<Entry<String, Point>> set = map.entrySet();
 4)应用场景:用于动态对象的创建,一个对象有多个属性的动态管理,如联系人管理、用户信息管理等。
  
LinkedHashMap
 1)带链表特性的HashMap,即map中key的存放顺序与存进去时是一致的,其他部分与hashmap没有任何区别

什么是设计模式
 1)设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
 2)使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性
 3)简单的说,设计模式是经典问题的模式化解决方案
 4)经典设计模式分为三种类型,共23类
  a. 创建型模式:单例模式、工厂模式等
  b. 结构型模式:装饰模式、代理模式等
  c. 行为型模式:模板方法模式、迭代器模式等

设计模式--单例
 1)意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点
 2)适用性:当类只能有一个实例而用户可以从一个众所周知的访问点访问它。
 3)实现方法
 任何情况下,该类只能创建一个实例!
  a. 不能使用new关键字创建该类的实例: 私有化构造方法
  b. 外界能够创建或引用已经创建好的唯一实例:提供静态的可以获取当前类实例的方法
   c. 该类永远只有一个实例: 定义一个私有的静态的当前类的属性,且在2中的方法中每次被调用时都要判断是否已经创建
   了实例 ,若没有创建,则创建该实例,若已经创建,则直接将该实例返回。
  4)使用场景:
   可用作管理器(只需要一个,但是很多地方都会获取该实例)、全局共享的类的实例

设计模式--模板
 1)定义一个操作中的短发过程的骨架,而将一些步骤延迟到子类中实现。使用抽象类实现
  特点:父类是一个抽象类,一些方法是抽象方法,一些方法是已经实现好的方法,实现好的方法会调用抽象方法,抽象方法
 等待继承该父类的子类去实现
 2)程序中的模板模式:
  定义一个抽象类。将实现相同功能的方法定义好,将存在差异的部分定义为抽象方法由子类实现

良好的编程习惯:
 1)在获取的对象可能为空时,为了保证不出现空指针异常,我们应该习惯在使用之前先判断获取的对象是否为null
 2)计算机中有一句话:
  越灵活的程序性能越差,因为需要顾及的太多了。

补充知识:
 1)String的split方法。
 当字符串分割的最后几个字符串为空字符,最后几个字符串会被省略,但是若空字符串在前面,则不会被舍弃。
 eg:"111,222,,"拆分之后会变成2个字符差U呢;"111,,,222"和",,111,222"拆分后都会变成4个字符串
 2)第一次遇到泛型里面嵌套泛型:
 Set<Entry<String, Point>> set = map.entrySet();

对象是用什么标识的,不是hashCode吗?
 暂时的解答:
 对象用引用标识,引用变量存在栈中,存放的是对象的物理地址。hashcode不是物理地址,即不是对象的地址,二者不能混为
 一谈。在调用Object的equals方法时,只有同一个对象的引用才想同,同一个类的其他对象的引用不可能与此对象相同,因此
 不同对象的equals结果必然为false。调用Object的toString方法打印的字符串并不能表示引用,只能体现hashcode
 

猜你喜欢

转载自blog.csdn.net/zou8944/article/details/52374343