JAVA给我印象最深的地方就是各种各样的方法。这让我能够更加关注程序要实现什么,而不用花过多的时间纠结于基本的数据结构。
在数据结构课程上,我们要花大量的时间搞明白各种数据结构的实现方法。就拿图来说,我们关注二叉树。二叉树如何生成、如何遍历、如何插入,这些基础但繁琐的代码都是我们自己一行一行的敲出来的,然而JAVA丰富多样的内库为我们省下了很多构建基础数据结构实现代码的时间,让我们能够更加专注于项目而非程序。还是拿图来说,虽然只接触了HashMap,但我已经为JAVA方法的丰富所深深震撼。
构建一个哈希图很简单:
1 HashMap<String, Integer> map = new HashMap<String, Integer>();
这里我们创建了一个Key值为String类型,value值为Int类型的哈希图。
对哈希图的操作,JAVA提供了丰富多彩的方法,我自己最常用到的是下面几个:
1 this.map.containsKey(key) //<是否含有key>
2 this.map.get(key) //<获取key的value>
3 this.map.put(key,value) //<插入数据>
4 this.map.replace(key,value) //<替换数据>
然后就是对HashMap的排序了,一般来说,将排序的结构存储到ArrayList中,实现代码如下:
1 public ArrayList<Entry<String, Integer>> sortmap(HashMap<String, Integer> oldmap){
2 ArrayList<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(oldmap.entrySet());
3 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>(){
4 public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2){
5 return (o2.getValue() - o1.getValue());
6 }
7 });
8 return list;
9 }
这里要说的是HashMap的Entry,代表的是<Key,Value>构成的数据实体,想要使用它,不能简单这样做
1 import java.util.Map;
而要导入这个:
1 import java.util.Map.Entry;
这样就能使用Entry了,排序的实现顺序是这样的:
1 构建ArrayList(通过Entry) --> 使用Collection方法对ArrayList进行排序(通过自定义的Comparator比较器实现)
需要注意的是,对HashMap自身进行排序是没有意义的,我们只能获取排序结果而不能改变HashMap本身的数据结构。
感觉上面的称述有些繁琐了,但自我感觉HashMap这个数据结构的快速与强大,而JAVA自带的方法也让其如虎添翼。
好吧,我应该详细讲讲自己在面向对象方面的收获与感受的。
第一点:无论如何不要将class中的数据设置为public,这是面向对象的大忌。
设置为public就意味着用户可以随意修改你程序的数据,这是十分危险而且不可接收的,老师用一个例子生动的阐述了这一点。
比如,我们现在构造一个很简单的类getVolumn,用户输入长、宽、高,通过这个类计算出长方体的体积。
好的,要实现这个目的,我们需要创建一个volumn对不对?
1 public double volumn;
这样一来,坏了。我们这样:
1 gotVolumn myvol = new getVolumn(); //a,b,c分别为长宽高
2 myvol.a = 100;
3 myvol.b = 1;
4 myvol.c = 2;
5 myvol.calculate();
6 myvol.vol = 300;
7 System.out.println("the volumn is : ",myvol.vol);
这个输出结果是啥?显然是300和原来的结果200根本不相符。所以说,让用户能够直接修改数据是很危险的,而我们应该做的就是将数据封装起来。
最简单的封装当然就是构造所谓的setter()和getter()方法,当然,这是为了让你明白封装的原理,真正写程序的时候,只要满足:
1 private/protected 数据类型 变量名;
就基本OK了,然后通过类的各种方法修改变量的值。其本质就是限制用户对程序的行为,让用户只能通过程序规定的方法获取或修改数据,大大提高程序的安全性。
第二点,继承
为什么要继承?继承可以看成对类功能的扩展。在继承原有类的基础上,进一步扩展。这样的效果就是让一个类能更专注于实现本类的功能,让这个类不太累,从而提升程序的运行效率。
继承的实现方法如下:
1 public class 本类 extends 被继承类{
2 方法1;
3 方法2;
4 }
继承后,需要注意的是构造方法:
1.对于被继承类无参的构造方法,不需要任何特殊操作(实际上是编译器自动生成super());
2.对于被继承类有参的构造方法,需要在本类构造方法的<第一行>调用:
super(参数1,参数2,参数3,···);
继承之后,本类可以直接使用被继承类中的方法和protected数据。
继承方面实际上作为初学者我了解和使用的并不多,但它的让一个类更专注别太忙什么都干的思想确实让我很受用。
第三点、多态,说实在的,多态虽然了解,但我还没有用到一次,水平有限,嘿嘿。
第四点、接口。
如何创建接口呢?
这样就可以创建接口了,接口专注与程序应该实现什么方法,而不是如何实现这些方法,可以说,接口是一个规范。
来一个小小的安利
以看到,接口根本不用管怎么实现方法,甚至连{}都扔了,对于接口中规定的方法,可以这样实现
可以看到,实例化之后,直接使用接口中的方法就OK了,如果多个类实现了接口中的方法,直接对接口实例化,这样就能让代码显得更简洁,同时,这也是多态的一个体现。
到这里,对面向对象的感想就结束了,其实比起面向对象,我更喜欢JAVA丰富多彩的类库和各种各样的方法。
投入JAVA的怀抱之后无法自拔了,使用JAVA不仅提高了写程序的速度,也提高了程序的质量,有面向对象的规范,还有通过构造不同的类实现不同的功能,以及JAVA集成的数据结构,让代码更加简洁高效。
作为一位初学者,我的感触也就这些了,并不多,但觉得是我个人代码能力提高的一个里程碑吧。
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群346942462,我们一起学Java!