Java知识体系目的:为了更好的认识java体系1、java基础知识1.1基础知识1.1.1配置环境变量新建java_home变量(安装目录),值为:C:\ProgramFiles\Java\jdk1.6.0_14;此值为JDK的安装位置。新建classpath变量(类加载路径),值为:.;%java_home%\lib;%java_home%\lib\tools.jar修改path变量(使得系统可以在任何路径下识别java命令),值为:%java_home%\bin;%java_home%\jre\bin1.1.2访问修饰符Public:任何地方可以访问Private:只有自身可以访问Protected:同一个包和子类可以访问默认:只有同一个包内可以访问1.2对象的清理1.2.1认识Java的自动垃圾回收垃圾回收是Java语言的一大特性,方便了编程,是以消耗性能为代价的。而垃圾在这里只无用的对象。而C++是需要程序员自己写析构函数来释放内存的,麻烦,也有可能忘记而导致内存泄露。Java语言对内存的分配管理是通过JVM内部机制决定的。程序员可以不关心其处理。1.2.2垃圾回收的原理和意义Java虚拟机中有个称之为垃圾回收器的东西,实际上这个东西也许真正不存在,或者是已经集成到JVM中了,但这无关紧要,我们仍然可以称为为垃圾回收器。垃圾回收器的作用是查找和回收(清理)无用的对象。以便让JVM更有效的使用内存。垃圾回收器的运行时间是不确定的,由JVM决定,在运行时是间歇执行的。虽然可以通过System.gc()来强制回收垃圾,但是这个命令下达后无法保证JVM会立即响应执行,但经验表明,下达命令后,会在短期内执行你的请求。JVM通常会感到内存紧缺时候去执行垃圾回收操作。垃圾回收过于频繁会导致性能下降,过于稀疏会导致内存紧缺。这个JVM会将其控制到最好,不用程序员担心。但有些程序在短期会吃掉大量内存,而这些恐怖的对象很快使用结束了,这时候也许有必要强制下达一条垃圾回命令,这是很有必要的,以便有更多可用的物理内存。从上面了解到,没有用的对象就是垃圾。准确的说,当没有任何线程访问一个对象时,该对象就符合垃圾回收的条件。对于String,存在一个字符串池,这个不属于本文讨论的范围,字符串池中的垃圾回收,算法和这里所讨论的垃圾回收完全是两码事。但是不得不说的是,字符串的胡乱拼接,往往导致性能急剧下降,尤其是在庞大的循环语句中,拼接字符串就是在让程序慢性自杀。这也是很多Java程序员容易犯的毛病。字符串既然是池,就是为了缓冲,为了有更高的命中率,因此垃圾回收的频率也许会比JVM对象垃圾回收器要低很多。垃圾回收器仅仅能做的是尽可能保证可用内存的使用效率,让可用内存得到高效的管理。程序员可以影响垃圾回收的执行,但不能控制。1.2.3通过编程影响垃圾回收虽然程序员无法控制JVM的垃圾回收机制。但是可以通过编程的手段来影响,影响的方法是,让对象符合垃圾回收条件。分别说来有一下几种:1、将无用对象赋值为null.2、重新为引用变量赋值。比如:Personp=newPerson(aaa);p=newPerson(bbb);这样,newPerson(aaa)这个对象就是垃圾了——符合垃圾回收条件了。3、让相互联系的对象称为“岛”对象Personp1=newPerson(aaa);Personp2=newPerson(bbb);Personp3=newPerson(ccc);p1=p2;p2=p3;p3=p1;p1=null;p2=null;p3=null;在没有对p1、p2、p3置null之前,它们之间是一种三角恋关系。分别置null,三角恋关系依然存在,但是三个变量不在使用它们了。三个Person对象就组成了一个孤岛,最后死在堆上——被垃圾回收掉。1.2.4强制的垃圾回收System.gc()实际上这里的强制,是程序员的意愿、建议,什么时候执行是JVM的垃圾回收器说了算。调用垃圾回收也不一定能保证未使用的对象一定能从内存中删除。唯一能保证的是,当你内存在极少的情况,垃圾回收器在程序抛出OutofMemaryException之前运行一次。1.3集合1.4文件流1.4.1输出字节流1.4.2输入字节流1.4.3输入输出字符流1.5网络1.5.1TCP和UDP的区别TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠的无差别错的数据传输。UDP是无连接通信协议,UDP不保证可靠的数据的传输,但能够向若干个目标发送数据,接受发自若干个源的数据。1.6多线程1.6.1实现多线程实现多线程:继承自Thread类,可以重写run()方法去覆盖去Thread中的run()方法;实现Runnable接口并实现它的run()方法。线程的优先级代表该线程的重要程度(不是绝对的),当有多个线程同时处于可执行状态并等待获得CPU时间时,线程调度系统根据各个线程的优先级来决定给谁分配CPU时间,优先级高的线程有更大的机会获得CPU时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。1.6.2多线程方法的解释和区别1.start()是启动一个线程。2.join()是直到执行完(或强制执行一段时间)当前的线程后才往下执行主线程或其他的线程3.stop()是停止当前的线程。阻塞线程比较多sleep()方法:sleep()允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU时间,指定的时间一过,线程重新进入可执行状态。可能给其他线程执行的机会(自私,睡着了,不释放锁,时间到了才放锁)suspend()和resume()方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。yield()方法:yield()使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得CPU时间。调用yield()的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。不过yield()只能使同等级别的线程获取执行的机会(公平竞争,释放大家再次选举)。而sleep(1000)使同级别或不同级别的都有可能。wait()和notify()和notifyAll()方法是Object中定义的方法:必须在synchronized代码块中使用,在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象的锁标志,进入等待的状态,并且可以调用notify()或者notifyAll()方法通知正在等待的其他线程。notify()通知的是等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有数量。几个方法配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的notify()被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的notify()被调用。1.6.3wait和sleep的区别wait()在object类里定义;sleep()在Thread类里定义。wait()方法只能放在同步方法或同步块中,表示资源同步时,线程需要等待。sleep()方法可放在任何位置,表示当前线程睡眠。wait()方法会释放对象锁;sleep()不会释放对象锁。wait()方法要等待唤醒之后,线程才会继续执行。sleep()则是休眠一段时间,线程自动恢复执行.sleep()必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常1.6.4notify()和notifyAll()的区别notify()方法导致解除阻塞的线程是从因调用该对象的wait()方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。notifyAll()方法将把因调用该对象的wait()方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。1.6.5run和start的区别run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;start()方法是启动(即开辟)一个线程的方法,因此线程的启动必须通过此方法,而run()方法,只是Thread类的一个方法,它本身并不能开辟线程。1.7异常运行时异常和Error是catch不了的。throw和throws的区别throw是抛出一个具体的异常类,产生一个异常。throws则是在方法名后标出该方法会产生何种异常需要方法的使用者捕获并处理。自定义异常必须继承Exception类。1.8格式化略1.9数字运算略1.10正则表达式1.10.1次数限定符*0次或多次+至少1次?0或1次{n}指定n次{n,}至少n次{n,m}匹配n-m次2、JAVA面向对象的基础知识2.1面向对象的三个特征2.1.1封装属性是私有,方法的公开的。自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。2.1.2继承它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。2.1.3多态实现多态有2种方式:静态多态(编译时的多态,在同一个类中)和动态多态(一个对象可以有多种类型)。是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。一句话:允许将子类对象赋值给父类的引用或父类指向子类的对象。2.1.4总结封装可以隐藏实现细节,使得代码模块化。继承可以扩展已存在的代码模块(类)。封装和继承属于代码重用。多态是为了接口重用。2.1.5继承、聚合、组合、关联的区别继承很好理解,下图表示(实线):实现也很好理解,下图表示(虚线):依赖(代码中通常表示的是局部变量、方法参数、返回值),下图表示:关联(代码中通常表示的类的属性),下图表示:聚合(关联的一种,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;has-a,空心菱形),下图表示组合(关联的一种,表示更强的关系,整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,contains-a,实心菱形),下图表示2.2抽象、接口定义及区别抽象类里面可以有非抽象方法但接口里只能有抽象方法声明方法的存在而不去实现它的类被叫做抽像类(abstractclass),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义staticfinal成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。2.3匿名类、内部类、匿名内部类在一个类中定义另外一个类,这个类就叫做内部类或内置类(innerclass)。内部类分为成员内部类、静态嵌套类、方法内部类、匿名内部类。内部类仍然是一个独