黑马程序员--java 知识回顾

来源:互联网 发布:js数组添加对象 编辑:程序博客网 时间:2024/05/08 04:11

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------


通过近10天的java学习,对java的体系结构有了深入的理解,学到了新的java技术。在这十天之前,我甚至不知道java里面还有反射,以前java课上没学过集合,自己在写程序时,遇到List,Set,Map这些东西都是现学现用,也仅仅停留在知道怎么用的层面。一直都明白线程很重要,特别是自己之前在模仿flappy bird写一个Android小游戏时,怎么都实现不了。在用java写聊天窗口时,也是没有实现socket接收的消息和显示面板的信息的同步显示,在最近10天的学习中,深入学习线程之后,之前的那两个问题一目了然,就是哪个动作一直在执行,就单独为那个动作创建一个线程。

这是从最近的几次课上学习到的,比如在银行业务调度系统中,服务窗口要不停的向号码生成器取号,这就要用一个单独的线程,让这个线程一直执行。

Executors.newSingleThreadExecutor().execute(
new Runnable(){
public void run(){
while(true){

                                                            ...................


线程的同步是非常重要的,只要遇到不同的线程操作同一份数据的情况,就要使用同步,还要保证使用的是同一个锁。

同步可以修饰代码块,可以仅仅是一两句代码,也可以是整个方法。但是一定得注意,在保证数据安全性的情况下,同步的代码要尽可能少,这样才能体现多线程的意义。


集合就是可变数组,在以前写程序的过程中,只会用数组,虽然在数据结构课上学过各种数据结构,但当时用的并不多,很少几次在C程序中用过。通过最近几天集合的学习,又回顾了一下数据结构。LinkedList使用的存储结构是链表,链表的操作特点是:查询较慢,增删较快。ArrayList使用的是数组结构,数组的操作特点是:查询较快,增删较慢。一般情况下用ArrayList就可以了,但在某些特别的地方,比如要进行的数据增删比较频繁,而且对程序时间复杂度的要求较高的话,就要用LinkedList。

HashSet:存入的自定义对象时,要重写hashCode方法,并重写equals方法,以实现唯一性。

hashCode方法中,返回一个HashCode值,让每个对象的HashCode值相同,这样的话每个对象创建时HashCode值相同,就会调用equals方法进行比较,在equals方法中自定义比较的代码。

public int hashCode()
{
System.out.println(this.name+".....hashCode");
return 60 ;
}

public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false ;
Person o = (Person)obj ;
System.out.println(this.name+"..equals.."+o.name);
return (this.name.equals(o.name))&&(this.age.equals(o.age));
}



TreeSet:存入TreeSet的对象必须具有可比较性。

         存字符串的话可以直接存,会按照ASCii码顺序进行排序。

         存入自定义对象的话,必须让该对象具有可比较性,让对象具有可比较性的方法是让该类实现Comparable接口,并重写compareTo方法。在compareTo方法中可以自定义按什么排序。该方法返回值类型为int。如果该对象大于被比较得到对象,则返回整数,小于则返回负数,等于则返回0。


class Student implements Comparable

{

        @Override
public int compareTo(Object o) {
Student s = (Student)o;
if(Integer.parseInt(this.age)>Integer.parseInt(s.age))
return 1 ;
if(Integer.parseInt(this.age)==Integer.parseInt(s.age))
{
return this.name.compareTo(s.name);
}
return -1;
}

}


I/O也是比较重要的一部分内容,以前没有弄明白,这次遇到普通流,下次遇到缓冲流,这次遇到字节流,下次遇到字符流......被弄得晕头转向,通过这几天的学习,清晰地认识到各种流的特点和用法。

字符流操作文本文件,字节流操作媒体文件。

缓冲字符流的readLine方法是把文本内容都到一个数组中,在读的过程中,通过判断连续的两个字符是\r\n,结束一行的读取。

字节流的read方法可以把数据先读到一个自定义的数组中。

不管是字符流还是字节流,缓冲的作用都是为了提高效率。

在使用玩I/O流后,要关闭流。


泛型是很有用的东西,C++中有泛型的概念,就是模板Temple,可以写模板方法,也可以写模板类,C++中泛型的作用仅仅是实现模板。

java中的泛型有两个作用,一个是和其他编程语言具有同样性质的模板作用,另一个是安全作用。所谓安全,就是保证前后数据类型一致。拿集合来说,集合中存入的数据类型必须一致,使用ArrayList存数据时,如果不用泛型,即便前后存入集合的数据类型不一致,编译时也不会出错,但运行是一定会出现异常。而如果使用了异常,前后数据类型不一致是不能通过编译的,这就避免了运行时错误。


不使用泛型:



使用泛型:



枚举的意义也很特别。

在学习枚举之前,大多数时候定义变量都是随便定义的,比如要用一个颜色类定义红绿蓝三个对象,就直接定义为1,2,3。在使用时,就用1,2,3来表示。

学习枚举之后,就不用在定义1,2,3。直接写一个枚举类,里面写三个实例:RED,GREEN,BLUE。

这样的话程序具有更好的可阅读性,看一眼就明白意思。

枚举的意义就是规定对象的范围。如果一个类只有固定的几个对象,就用枚举。

比如交通灯只有三种颜色:红绿黄。就可以定义一个枚举类,里面三个元素:


又比如一周只有七天,周一到周日,也可以定义一个枚举类:



反射也是java的新技术。

反射就是把一个类中的元素提取为一个类,这个类的对象就代表原来类中的那个元素。

反射类有三个:Constructor,Method,Field。分别对应构造方法,成员方法,成员变量。

要想得到一个类的反射类对象,首先要获得这个类的字节码对象。然后用字节码对象的getConstructor(),getMethod(),getField()方法获得对应的反射类对象。



要注意得到私有成员变量后要调用setAccessible(true)方法使私有成员变量变为可用的。


AOP:

面向切面编程,以前学过一些javaEE,所以对AOP并不陌生,Spring中的依赖注入就是AOP,不过以前学校Spring的过程中并没有使用到动态代理,都是使用的静态代理类。

java中使用代理的目的就是在原有功能的基础上添加一些功能。

代理类必须包含原有类的一切。



最后说说面向对象程序设计的思想。

其实以前虽然感觉java学的还可以,类啊,方法啊,对象啊,这些概念都非常清晰。但是就是没有面向对象程序设计的思想,遇到一个项目,要费很大的力才能做出来,但是程序的结构并不好,究其原因都是没有使用面向对象的方法设计。通过学习张孝祥老师讲的两个7K面试题,学习了面向对象,对面向对象的设计思路有了一些意识,清晰地记得张老师的一句话:“谁拥有数据,对数据进行操作的方法就由谁提供”。

但这并不能保证以后拿到一个项目就能很好的运用面向对象的方法设计出来。要想熟练运用面向对象的设计,以后还要多练习,多总结。



通过这段时间的学习,受益还是很多的。能学到东西是最喜悦的。程序设计的学习必须要找到好的方法,不然会做很多无用功,花费很多精力却学不到太多东西。以前学习都是通过看书,最近的学习都是通过看视频。其实不能说那个方法更好,这两种方法要相辅相成,才能达到最好的效果。



---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

   详细请查看 www.itheima.com


0 0