关闭

java编程自学记录(day14)

标签: java编程
98人阅读 评论(0) 收藏 举报
分类:
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
 
0
0
查看评论

java编程自学记录(day07)

(1)什么是程序?  程序 = 数据结构 + 算法  在java中,算法放在方法区,而数据结构放在堆和栈中。 (2)对象实例化时,在堆中是没有方法的,只有对象属性,方法是放在方法区中,由所有对象共享,  不同的对象可以通过this关键字调用方法,达到修改本身属性...
  • zou8944
  • zou8944
  • 2016-08-20 08:38
  • 194

java编程自学记录(day12)

基本类型和包装类  1)8种基本的数据类型分别对应了8种包装类,每个包装类都封装了一个对应的基本类型成员变量  同时还提供一些针对该数据类型的实用方法:  java.lang.Integer 对应  int  java.l...
  • zou8944
  • zou8944
  • 2016-08-27 18:35
  • 202

java编程自学记录(day02)

编程语言:接近于人类语言的语法  经过编译为计算机的指令+数据 上一节课的补充: (1)疑问:long是64位,float是32位,为什么long可以赋值给float。  解答:举例两种类型的存储方法   long  3141592...
  • zou8944
  • zou8944
  • 2016-08-20 08:20
  • 110

java编程自学记录(day05)

数据的复制与扩容 (1)数组变量额度赋值,是并不会复制数组对象,是两个变量引用了同一个数组对象。 (2)数组的复制的本质是创建了新数组,将原来数组的内容复制过来。 (3)扩容:创建新数组,新数组容量大于原数组,将原数组内容复制到新数组,  并且丢弃原数组,简单说,就是更换更大的数组...
  • zou8944
  • zou8944
  • 2016-08-20 08:36
  • 202

java编程自学记录(day11)

正则表达式(续)  1)正则表达式首尾(全匹配与部分匹配)  ^:表示字符串必须以其后面约束的内容开始  $:表示字符串必须以其前面约束的内容结尾  若正则表达式不书写^或&,则其代表匹配字符串的部分内容,都加上则表示完全匹配。  ...
  • zou8944
  • zou8944
  • 2016-08-26 22:43
  • 285

java编程自学记录(day03)

day04笔记 continue语句:重新开始当前循环 break语句:终止当前循环 本章所使用的案例: 1、水仙花数问题。  水仙花数:一个整数,满足其值等于各个数位的立方和。  eg:153 = 1^3 + 5^3 + 3^3 所以153是水仙花数...
  • zou8944
  • zou8944
  • 2016-08-20 08:34
  • 208

java编程自学记录(day13)

day04学习笔记 昨天的复习: 泛型:  泛型可以在我们使用某个类时向传递参数一样来想类中的某些内容传递一个类型,动态的决定这一个被创建出来的类的实例的 方法和返回值、属性的类型,从而提高程序的灵活性。这个特性是Java1.5之后出来的新特性。 新知识: 增强型for循环 ...
  • zou8944
  • zou8944
  • 2016-08-28 15:22
  • 231

java编程自学记录(day17)

I/O流:可以类比管道,流动的是字节。 FileInputStream和FileOutputStream是低级流,数据源是明确的。 缓冲字节输入输出流BIS/BOS  1)BufferedInputStream:缓冲字节输入流  2)BufferedOutputS...
  • zou8944
  • zou8944
  • 2016-09-08 23:48
  • 173

java编程自学记录(day04)

day05 学习笔记 上节课知识的复习: (1)for循环  最常用的,甚至只用for循环就可以解决任何循环问题。  for最常用的还是在与次数有关的循环处理。 (2)while循环  很常用,用在循环时候要先检查循环条件,再处理循环体。 ...
  • zou8944
  • zou8944
  • 2016-08-20 08:35
  • 224

java编程自学记录(day06)

类、对象、引用的区别 (1) 对象:真实存在的一个东西 (2) 类:概念,是同类东西的概念。可以看成 名词 (3) 引用:代词,是对象的引用,就像拴着对象的绳子,引用的值是对象的地址值  Point p1 = new Point();  以...
  • zou8944
  • zou8944
  • 2016-08-20 08:37
  • 254
    个人资料
    • 访问:7231次
    • 积分:316
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:3篇
    • 译文:1篇
    • 评论:1条
    文章存档
    最新评论