关于数据结构和面向对象


20161030 图书馆301-18
 
今天无意间看到了一个有关 hashmap的应用,由于对hashmap并不怎么了解,就以为可能会看不懂了吧。但是实际上,没我想的那么复杂,hashmap就是个对应关系。就功能方面来说,算不上强大,实现方法也不是很复杂,但是感觉很实用。由此想到数据结构的强大,而我和大部分周围同学在学习数据结构或者学完数据结构时都不知道这玩楞有什么用,我也只是最近刚刚懂了数据结构的重要。于是,想写写我对数据结构和面向对象的理解(大神请走开)。
首先还是看看这个hash(hashmap是基于hash表对map接口的实现)。有各种中译名,比如哈什表、哈希表,更过分的也有叫散列表的,我大一下用的课本上就叫散列表。在这里吐槽一下当前各种计算机方面的中译名。首先不同的老师都有各自的叫法,一个老师,自己对一个东西也有不同的叫法,让后辈们在交流时,明明是在说同一个东西,但是大家都不知道对方在说什么,有时候老师这节课用“散列表”说,下节课说“哈希表”,学生还以为讲了新课,在网上找资料也是很费劲。其次,对单词的翻译过于装逼以致晦涩,这就好像很多家长给孩子起名字非要在字典里找那些连自己都不认识的不常见字以示自己很有学问,当然这还可以忍,毕竟是父母对孩子的一种期盼。但是散列表,什么是散列表,好像只知道是个什么表,但是什么是散列,反正我现在也不知道。所以呢,本文就用hashmap的原名——hashmap。
开头跑题两分钟,下面再次进入正题 ,看看这个hashmap。码就不现写了,主要看看有什么用,以及实现机制。
java里有个叫hashmap的类,有这样的用处,当信息量比较大且信息之间有两两对应的关联时,比如一个网站有很多账户,每个账户有账号和密码,如果单纯用String来存这些信息,在密码验证的时候,就很费劲,一个萝卜一个坑,哪个才是我的坑?但是如果用一个String数组,好像就能方便一点,在用户注册的时候,把账户的密码存在账号后面,这样在验证的时候,就可以先找到账号,然后比较一下账号后面的String和输入的String是否一样,就O了。但是,由于数组在插入删除方面天然的劣势(每删一个元素,都要将后面的每一个元素往前移,当账户有很多的时候……),必然是不能用数组来存的,或者要写很复杂很复杂的算法,来回调用以提高效率。这个时候其实可以考虑一下用链表的方法,单链表就行。用一个 结构体(先不用类,类的实现都是后话了),存两个String(账号和密码),一个引用(下一个结构体的地址,c相关语言里也叫指针,但是java等其他语言里没有指针的概念,所以,这里就用引用这个概念吧)。这样账号和密码就可以永远幸福快乐地生活在一起了,这样是不是方便多了?想象一下结构体的出现会给编程从业者(这里不叫程序猿,因为当时会编程,基本可以叫科学家)带来怎样的福音(再扯一点题外话,其实真的是福音吗?并不是,技术的进步都是伴随着惨烈的牺牲,比如蒸汽机的发明,会使多少手工生产者失业以至于饿死?二战又是怎么爆发的?结构体是方便了编程,同时也降低了编程的门槛,以前很高智商的人才会编程,现在是个人都能编程,所以……?科学家沦为程序猿。科学技术的进步真的能推动人类的进步并使人类过上更美好的生活吗?也许会有人认为前人的牺牲是为后人更好的生活,像现在我们就过得很好,但是万一明天又有革命性的科学进步呢?万一明天辽科大的老师发明了时光穿梭机?…………??然后又过了若干年后,时光穿梭机也成为人们的日用品后,会不会又有科技的 革 命 性 进步?你总不会以为科技的发展会有尽头吧)。回来,刚才说到福音,不管对编程从业者来说是怎样的体验,单单就编程这一方面来说,还是较大的进步。
其实,上面说的那个有两个String和一个引用的结构体已经算得上是一个数据结构了,是一个很简单的数据结构。然后现在我们调用指针回到文章的开头,hash。
开头说要介绍hashmap的用处和实现机制,其实用处和机制都已经说了,和上面那个很简单的结构体差不多,把账号和密码放在一起,当一个xx在门口叫"账号,你给我出来”时,账号就可以对躺在床上的密码说“老公,外面有人叫我,我好怕,你陪我一起出来吧”,hashmap就是实现这样的两两对应关系。
看到这里,可能还有人没想到我说的数据结构和书上的数据结构有什么关系,”没什么相似点啊,书上的数据结构都是类啊,还有很多函数(方法)“,简单解释一下,书上的数据结构不是“一个很简单的数据结构”[偷笑]。回到正题,如果我把那两个String和一个引用放在一个类(比如就叫account类)里,然后,这个类可以放很多方法(函数),这些方法可以实现很多功能,其中一个功能(方法、函数)可以写成这样:当账号、密码作为参数传来时,在方法体里,首先先通过遍历找到含有传来账号的那个”账号-密码“对,然后比较传来密码和”账号-密码“对里的密码,如果一样,返回(return)”密码正确“,否则返回”密码错误“。这样,在用这个用户系统的时候,就不用编写专门的算法来获取、验证密码,只需要穿过去两个参数就行了。而且,这个”账号系统“是可以移植的,游戏的账号系统可以这么用,学生成绩单系统也可以这么用,这就大大提高了代码的可重用性,如果说结构体的出现,让科学家变成技术员,那么类的出现,技术员就变成了码农,或者程序猿。(前几天我买了一本用c写的数据结构,boom)。课本上的数据结构功能很强大,很实用,但是有一点很多同学都不明白,因为,像链表或者队列等其他的一些数据结构,一般的编程语言里都提供了封装好的类,为什么还要我们自己写?这是因为,练习编写那些东西,能帮助我们更深入理解数据结构的原理,锻炼刚刚会打点c代码的我们的编程能力,最重要的一点,学会如何自己创建一个适合各种情景的数据结构。
其实刚才把那个“验证密码”的功能添加到account类里时,我们已经进入了文章的第二部分,面向对象。
还是先跑题三分钟,很多外行人都认为程序猿大都没有感情思维,其中有很多都是没有对象的单身狗,然而,我想说,对象能干什么?有个很傻的xx回答给我说:把“什么”去掉。这个人平日里净说胡话,我一句都听不懂。再说,我随手写上几行代码,对象想来多少就有多少。你以为我的“对象”们什么都没有很虚无吗?其实不是,你可以看看我的一个很普通的对象——elizabeth(光听名字是不是就已经石更了?):

privite class mazi{
  String name=new String(“elizabeth”);
  String 外貌=new String(”美若天仙“);
  char 找杯=‘e’;//我从不打错别字
  String 性格=new String(int n){//这里做个String类重载
  if(n==1)
    return “外向活泼型”;
  else
    return “温柔体贴型”;
  };
  boolean 是否对我百般服从=“true”;
  String 陪我玩(){
    return “来呀~~快活呀~~~~反正有~~~~大把时光~~~~~~”;
  }
};

我还有很多车,比如我的这辆
private class Car{
……//不用我说你都知道有多屌
};

而我的生活是这样的
private class mylife{
  Car car[]={“ 布加迪威龙”,“科尼塞克”,“迈巴赫”,……(还有几辆宝马奔驰那样的杂牌车我就不说了)};
  mazi mazi1=new mazi(”elizabeth“);
  mazi mazi2=new mazi(”angelababy“);
  ……(还有很多);
  void 早上(){
    开车去东北,带6个mazi,开迈巴赫;
  }
  void 中午(){
    让6个mazi背我回家,并且把迈巴赫砸了;
  }
  void 晚上(){
    ……;
  }
};

如果没有面向对象,你是否觉得这些这些牛逼很难吹出来?或者,很难吹出来这些美丽的牛逼。
面向对象就是一个假想的世界模型,你根本不用去想用什么算法实现什么样的功能,你只要知道各种”对象“(什么是对象?万物皆对象)可以干什么,并写出来,当你在编程的时候不知道某一步该怎样的时候,你只要想想在真正的生活中,是怎样的。

版权声明:本文为csdn372301467原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。