<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[进阶的Java蜗牛]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/zzh_408</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; zzh_408]]></copyright><item><title><![CDATA[方法的参数传递机制]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50212595</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50212595</guid><author>zzh_408</author><pubDate>Tue, 08 Dec 2015 00:16:25 +0800</pubDate><description><![CDATA[Java里的方法是不能独立存在的，调用方法必须由类或者对象作为主调者，如果声明方法时包含了形参声明，则调用方法时必须给这些形参指定参数值，调用方法时实际传递给形参的参数值也被称为实参。
Java的参数传递只有一种方式：值传递。所谓值传递，就是将实际参数值的副本（复制品）传入方法内，而参数本身不受任何影响。
下面程序演示了方法参数传递的效果。
public class C {
	private]]></description><category></category></item><item><title><![CDATA[线程的同步]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50211629</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50211629</guid><author>zzh_408</author><pubDate>Mon, 07 Dec 2015 22:07:41 +0800</pubDate><description><![CDATA[多线程编程时有趣的事情，它常常容易突然出现“错误情况”，这是由于系统的线程调度具有一定的随机性。即使程序在
运行过程中偶尔出现问题，那也是由于我们编程不当引起的。当使用多个线程来访问同一个数据时，非常容易出现线程安全

问题。

线程安全问题

关于线程安全的问题，有一个经典的问题：银行取钱的问题。银行取钱的基本流程基本可以分为如下几个步骤：
1、用户输入账户、密码，系统判断用户的]]></description><category></category></item><item><title><![CDATA[控制线程]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50211615</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50211615</guid><author>zzh_408</author><pubDate>Mon, 07 Dec 2015 22:06:52 +0800</pubDate><description><![CDATA[join线程

Thread提供了让一个线程等待另一个线程完成的方法：join()方法。当在某个程序执行流中调用其他线程的join()方法
时，调用线程将被阻塞，知道被join方法加入的join线程完成为止。
join()方法通常由使用线程的程序调用，以将大问题划分为许多小问题。如下面程序：





[java] view
 plaincopy






p]]></description><category></category></item><item><title><![CDATA[线程的生命周期]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50211609</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50211609</guid><author>zzh_408</author><pubDate>Mon, 07 Dec 2015 22:06:01 +0800</pubDate><description><![CDATA[当线程被创建并开启以后，它既不是已启动就进入了状态，也不是一直处于执行状态，在线程的生命周期中，它要经过
新建（New）、就绪（Runnable）、运行（Running）、阻塞（Blocked）和死亡（Dead）五种状态.尤其是当线程启动以后，

它不能一直“霸占”着CPU独自运行。所以CPU在多条线程之间切换，于是线程状态也会多次在运行、阻塞之间切换。



新建和就绪状态
当程]]></description><category></category></item><item><title><![CDATA[线程的创建和启动]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50211599</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50211599</guid><author>zzh_408</author><pubDate>Mon, 07 Dec 2015 22:05:22 +0800</pubDate><description><![CDATA[Java使用Thread类代表线程，所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务，

实际上就是执行一段程序流（一段顺序执行的代码）。Java使用run方法来封装这样一段程序流。



继承Thread类创建线程类
通过继承Thread类来创建并启动多线程的步骤如下：
1、定义Thread类的子类，并重写该类的run方法，该run方法的方法体就]]></description><category></category></item><item><title><![CDATA[线程概述]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50211589</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50211589</guid><author>zzh_408</author><pubDate>Mon, 07 Dec 2015 22:04:07 +0800</pubDate><description><![CDATA[几乎所有操作系统都支持同时运行多个任务，一个任务通常就是一个程序，每个运行中的程序就是一个进程。当一个程序

运行时，内部可能包含了多个顺序执行流，每个顺序执行流就是一个线程。

线程和进程
几乎所有操作系统都支持进程的概念，所有运行中的任务通常对应一条进程（Process）。当一个程序进入内存运行，即变
成进程。进程是处于运行过程中的程序，并且具有一定独立功能，进程是系统进行资源分配]]></description><category></category></item><item><title><![CDATA[String、StringBuffer和StringBuilder类]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095511</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095511</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 13:01:26 +0800</pubDate><description><![CDATA[字符串是一连串的字符序列，Java提供了String和StringBuffer两个类来封装字符串，并提供了系列方法来操作字符串
String类是不可变类，即一旦一个String对象呗创建以后，包含在这个对象的字符串序列是不可改变的，直至这个对象
销毁。
StringBuffer对象则代表一个字符串序列可变的字符串，当一个StringBuffer被创建以后，通过StringBuffer提供的]]></description><category></category></item><item><title><![CDATA[java中的堆、栈和常量池]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095509</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095509</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 13:00:50 +0800</pubDate><description><![CDATA[说到java中堆、栈和常量池，首先还是看看他们各自存放的数据类型吧！
堆：存放所有new出来的对象；栈：存放基本类型的变量数据和对象的引用，对象（new出来的对象）本身并不存在栈中，而是存放在堆中或者常量池中（字符串常量对象存放在常量池中）；常量池：存放基本类型常量和字符串常量。
对于栈和常量池中的对象可以共享，对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的，当没有引用指向数据]]></description><category></category></item><item><title><![CDATA[系统相关]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095499</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095499</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 13:00:18 +0800</pubDate><description><![CDATA[Java程序在不同操作系统上运行时，可能需要取得平台相关的属性，或者调用平台命令来完成特定功能。Java提供了
System类和Runtime类来与程序的平台进行交互。


System类
System类代表当前Java程序的运行平台，程序不能创建System类的对象，所以它提供了一些类属性和类方法，运行直接
通过System类名来调用这些属性和方法。
1、通过System类的get]]></description><category></category></item><item><title><![CDATA[泛型入门]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095493</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095493</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:59:35 +0800</pubDate><description><![CDATA[Java集合有个特点：当我们把一个对象“丢进”集合里后，集合就会“忘记”这个对象的数据类型，当再次取出该对象时，
该对象的编译类型就变成了Obejct类型（其运行时类型没变）。
Java集合之所以设计成这样，是因为设计集合的程序员不会知道我们需要它来保存什么类型的对象，所以他们把集合
设计成能保存任何类型的对象，只要求具有很好的通用性，但这样做也带来了两个问题：
== 集合对元素类型没有任]]></description><category></category></item><item><title><![CDATA[操作集合的工具类：Collections]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095487</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095487</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:58:54 +0800</pubDate><description><![CDATA[Java提供了操作Set、List和Map等集合的工具类：Collections，该工具类里提供了大量方法对集合元素进行排序、查询
和修改等操作，还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。 


排序操作
Collections提供了如下几个方法用于对List集合元素进行排序：
== static void reverse(List list):反转指定List集合]]></description><category></category></item><item><title><![CDATA[Map]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095483</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095483</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:58:06 +0800</pubDate><description><![CDATA[Map用于保存具有映射关系的数据，因此Map集合里保存这两组值，一组用于保存Map里的key，另一组值用于保存Map里
的value，key和value都可以是任何引用类型的数据。Map的key不允许重复，即同一个Map对象的任何两个key通过equals
方法比较总是返回false。
key和value之间存在单向一对一关系,即通过指定的key，总能找到唯一的、确定的value。如果把Ma]]></description><category></category></item><item><title><![CDATA[Queue接口]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095479</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095479</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:57:18 +0800</pubDate><description><![CDATA[Queue用于模拟队列这种数据结构，队列通常是指“先进先出”的容器。队列的头部保存在队列中时间最长的元素，队列的
尾部 保存在队列中时间最短的元素。新元素插入到队列的尾部，访问元素操作会返回队列头部的元素。通常，队列不允许
随机访问队列中的元素。
Queue接口中定义了如下操作方法：
== void add(Object e):将指定元素加入此队列的尾部。
== Object eleme]]></description><category></category></item><item><title><![CDATA[List接口]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095473</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095473</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:56:32 +0800</pubDate><description><![CDATA[List集合代表一个有序集合，集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素，可以通过索引来访问
指定位置的集合元素。
与Set只提供了一个iterator()方法不同，List还额外提供了一个listIterator()方法，该方法返回一个ListIterator
对象，ListIterator接口继承了Iterator接口，提供了专门操作List的方法，ListIter]]></description><category></category></item><item><title><![CDATA[Set集合]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095469</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095469</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:55:42 +0800</pubDate><description><![CDATA[前面已经介绍了Set集合类似于一个罐子，一旦对象丢进Set集合，集合里多个对象之间没有明显的顺序。Set集合与Collection
基本完全一样，没有提供任何额外的方法。
Set集合不允许包含相同的元素，如果试图把两个相同元素加入到同一个Set集合中，则添加失败，add方法返回false，且
新元素不会被加入。
Set判断两个对象相同不是使用==运算符，而是根据equals方法。也就是说，]]></description><category></category></item><item><title><![CDATA[Collection、Iterator接口、foreach循环]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095463</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095463</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:54:44 +0800</pubDate><description><![CDATA[Collection接口时List、Set和Queue接口的父接口，该接口里定义的方法既可以用于操作Set集合，也可以用于操作List
和Queue集合

下面程序示范了如何操作Collection集合里的元素





[java] view
 plaincopy






package package1;  
  
import java.util.A]]></description><category></category></item><item><title><![CDATA[Java集合概述]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095457</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095457</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:53:39 +0800</pubDate><description><![CDATA[集合类和数组不一样，数组元素既可以是基本类型的值，也可以是对象（实际上保存的是对象的引用变量）；而集合只能保存
对象（实际上也是对象的引用变量，但习惯上认为集合里保存的是对象）。
Java的集合类主要由两个接口派生而出：Collection和Map，Collection和Map是Java集合框架的根接口，这两个接口

又包含了一些子接口或实现类。如下图是Collection接口和子接口及其]]></description><category></category></item><item><title><![CDATA[抽象类和接口]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095453</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095453</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:53:00 +0800</pubDate><description><![CDATA[当编写一个类时，常常会为该类定义一些方法，这些方法用以描述该类的行为方式，那么该方法都有具体的方法体。但在某些
情况下，某个父类只是知道了其子类应该包含怎样的方法，但无法准确知道这些子类如何实现这些方法，例如定义了一个Shape
类，这个类应该提供一个计算周长的方法calPerimeter()，但不同Shape子类对周长的计算方法是不一样的，即Shape类方法
无法准确知道其子类计算周长的方]]></description><category></category></item><item><title><![CDATA[final修饰符]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095443</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095443</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:52:17 +0800</pubDate><description><![CDATA[final 变量

final修饰变量时，表示该变量一旦获得了初始值之后就不可被改变，final既可修饰成员变量（包括类变量和实例变量），也
可以修饰局部变量、形参。严格的说final修饰的变量不可被改变，一旦获得初始值之后，该final变量的值就不能被重新赋值。
因为final变量获得初始值之后不能被重新赋值，因此final修饰成员变量和修饰局部变量时有一定的不同。




f]]></description><category></category></item><item><title><![CDATA[初始化块]]></title><link>https://blog.youkuaiyun.com/zzh_408/article/details/50095435</link><guid>https://blog.youkuaiyun.com/zzh_408/article/details/50095435</guid><author>zzh_408</author><pubDate>Sun, 29 Nov 2015 12:51:39 +0800</pubDate><description><![CDATA[Java使用构造器对单个对象进行初始化操作，使用构造器先把整个Java对象的状态初始化完后才能，然后将Java对象返回给
程序，从而让该Java对象的信息更加完整。与构造器作用非常类似的是初始化块，它也可以对Java对象进行初始化操作。

初始化块是Java类里可出现的第四种成员（前面依次有属性、方法和构造器），一个类里面可以有多个初始化块，相同类型的
初始化块之间有顺序；前面定义的初始化]]></description><category></category></item></channel></rss>