超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
HTTP是一个客户端和服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。

————————————————————————————————————————–

小明的妈妈再一次让小明去打酱油,这次我们的重构了打酱油流程,先定义一个酱油类,用于在打酱油过程中表示具体的酱油,具体类如下:

[code lang=”java”]
public class Soy {
private int id;
public Soy(int id) {
this.id = id;
}
}
[/code]

我们再定义一个商店类,商店需要存货n个酱油,才可以销售,所以我们需要用到集合类持有所有酱油。我们可以使用java.util.List类型的属性,代码如下:
public class Shop {
private String name;
/**
* 酱油列表
*/
private List<Soy> soyList;

public Shop(String name) {
this.name = name;
this.soyList = new ArrayList<Soy>();
int i = 0;
while (i < 100) {
this.soyList.add(new Soy(i++));
}
}
}
代码中有几个知识点:
1、private List<Soy> soyList;查看List的定义发现List是一个接口,声明对象的时候多了一个”<Soy>”泛型定义,soyList只能保存Soy类的对象
2、this.soyList = new ArrayList<Soy>();为变量赋值,ArrayList是List的子类,子类对象可以赋值给父类变量
3、this.soyList.add(new Soy(i++)); List的add方法,向List集合中添加一个对象
4、i++,先做为执行后i=i+1;new Soy(i++),可以分解为new Soy(i);i=i+1;
验证一下商店的酱油情况,代码如下:
public static void main(String[] args) {
Shop shop = new Shop(“打酱油便利店”);
List<Soy> soyList = shop.getSoyList();
for (int i = 0; i < soyList.size(); i++) {
Soy soy = soyList.get(i);
System.out.println(“ID为” + soy.getId() + “的酱油”);
}
}
代码中的知识点:
1、soyList.size(),获取当前集合中对象总数量
2、soyList.get(i),返回第i个对象。

商店已经创建了,小明的定义如下:

[code lang=”java”]
public class Person {
private String name;
private List<Soy> soyList;

public void buy(Soy soy) {
if (soyList == null) {
this.soyList = new ArrayList<Soy>();
}
this.soyList.add(soy);
}

public Person(String name) {
this.name = name;
}
}
Person xiaoming = new Person("小明");
[/code]

我们再商店添加一下销售方法:

[code lang=”java”]
public boolean sell(Person person, int size) {
if (size > this.soyList.size()) {
return false;
}
for (int i = 0; i < size; i++) {
Soy soy = soyList.get(0);
person.buy(soy);
}
for (int i = 0; i < size; i++) {
Soy soy = person.getSoyList().get(i);
soyList.remove(soy);
}
return true;
}
[/code]

修改main方法:

[code lang=”java”]
Person xiaoming = new Person("小明");
shop.sell(xiaoming, 5);
for (int i = 0; i < xiaoming.getSoyList().size(); i++) {
Soy soy = xiaoming.getSoyList().get(i);
System.out.println(xiaoming.getName() + "购买了ID为" + soy.getId() + "的酱油");
}
[/code]

执行结果发现,打印的id都是0,原来小明被商店骗了只给了他一袋酱油,这里我们就可以发现List本身是不能去除重复的,并且是有顺序的。是否有容器满足这个场景,去除重复的对象呢?答案是有,java.util.Set,可以去除重复对象,并且容器是无序的。重构代码如下:

[code lang=”java”]
public class Person {
private String name;
private Set<Soy> soyList;

public void buy(Soy soy) {
if (soyList == null) {
this.soyList = new HashSet<Soy>();
}
this.soyList.add(soy);
}
}
public class Shop {
private String name;
private List<Soy> soyList;
public Shop(String name) {
this.name = name;
this.soyList = new ArrayList<Soy>();
int i = 0;
while (i < 100) {
this.soyList.add(new Soy(i++));
}
}
public boolean sell(Person person, int size) {
if (size > this.soyList.size()) {
return false;
}
for (int i = 0; i < size; i++) {
Soy soy = soyList.get(0);
person.buy(soy);
}
for (Soy soy : person.getSoyList()) {
soyList.remove(soy);
}
return true;
}
}
Person xiaoming = new Person("小明");
shop.sell(xiaoming, 5);
for (Soy soy : xiaoming.getSoyList()) {
soyList.remove(soy);
}
[/code]

Set和List的操作很多都类似,因为无序所有没有下标,所以遍历的方式不同。Java在1.5版本以后增加了foreach的遍历方式,for(Object obj : 容器)就是foreach的语法结构,大大简化了原来使用Itrator的方式,使用Itarator的方式如下:

[code lang=”java”]
Iterator<Soy> iterator = xiaoming.getSoyList().iterator();
for (; iterator.hasNext();) {
Soy soy = iterator.next();
System.out.println(xiaoming.getName() + "购买ID为" + soy.getId() + "的酱油");
}
[/code]

现在是打印一个了,数据是正确了,但是商店应该返回size个酱油的,所以我们去把Shop的sell方法修改正确:”Soy soy = soyList.get(i);”,再次测试小明确实买到了5个酱油。

商店升级了,可以销售多种品牌的酱油,并且可以分品牌销售,所以我们要按照每个品牌保存一个集合,因为可能存在无限多种品牌,我们不能定义多个List属性,我们需要一个容器可以存储品牌名称(key),对应值(value)这里是List的容器,jdk定义了Map容器支持,支持品牌酱油购买的流程代码重构如下:

[code lang=”java”]
//Soy添加String brand属性,并新增入参为id和brand的构造方法
private String brand;
public Soy(int id, String brand) {
this.id = id;
this.brand = brand;
}
//Shop类添加存储品牌酱油列表的Map属性,构造方法中初始化Map,新增购买品牌酱油的方法
private Map<String, List<Soy>> soys;
public Shop(String name) {
this.name = name;
this.soyList = new ArrayList<Soy>();
int i = 0;
while (i < 100) {
this.soyList.add(new Soy(i++));
}
i = 0;
soys = new HashMap<String, List<Soy>>();
String brandA = "品牌A";
List<Soy> brandAList = new ArrayList<Soy>();
soys.put(brandA, brandAList);
while (i < 100) {
brandAList.add(new Soy(i++, brandA));
}
i = 0;
String brandB = "品牌B";
List<Soy> brandBList = new ArrayList<Soy>();
soys.put(brandB, brandBList);
while (i < 100) {
brandBList.add(new Soy(i++, brandB));
}
i = 0;
String brandC = "品牌C";
List<Soy> brandCList = new ArrayList<Soy>();
soys.put(brandC, brandCList);
while (i < 100) {
brandCList.add(new Soy(i++, brandC));
}
i = 0;
}
public boolean sell(Person person, int size, String brand) {
List<Soy> list = this.soys.get(brand);
if (size < list.size()) {
return false;
}
for (int i = 0; i < size; i++) {
Soy soy = list.get(i);
person.buy(soy);
}
for (Soy soy : person.getSoyList()) {
list.remove(soy);
}
return true;
}
//main方法中的执行如下
xiaoming.getSoyList().clear();
shop.sell(xiaoming, 5, "品牌A");
for (Soy soy : xiaoming.getSoyList()) {
System.out.println(xiaoming.getName() + "购买品牌为" + soy.getBrand() + ",ID为" + soy.getId() + "的酱油");
}
[/code]

以上代码新知识点:
1、Map属性变量声明,子类HashMap初始化
2、Map的put方法添加键值对
3、Map的get(key)方法获取key对应的值
4、List的clear方法,清空集合

存在一种另外的集合数组,它是java语言支持的容器,工作中某些场合可能会用到,我们把小明买到的酱油使用数组存储,代码如下:

[code lang=”java”]
Soy[] soyArray = new Soy[5];
int index = 0;
for (Soy soy : xiaoming.getSoyList()) {
soyArray[index++] = soy;
}
for (Soy soy : soyArray) {
System.out.println(xiaoming.getName() + "购买品牌为" + soy.getBrand() + ",ID为" + soy.getId() + "的酱油");
}
[/code]

总结一下,常用容器有4种:
List容器,主要特点有序,值可以重复,主要子类ArrayList,另外一个文章没有提到的LinkedList,在容器中值更新频繁的场合下使用。
Set容器,主要特点,无序,值不可重复,主要子类HashSet
Map容器,键值对存储,无序,不可重复,主要子类HashMap
数组,主要特点有序

小练习:
第八章-Java字符串练习题中,按照a-z出现的次数排序,从高到底依次打印字母和出现次数。

课程中的代码:

[code lang=”java”]
package com.sunhaojie.learntest.tenth;
/**
* @ClassName Soy
* @Description 酱油实体类
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午1:37:02
*/
public class Soy {
/**
* 酱油id
*/
private int id;
/**
* 品牌
*/
private String brand;
/**
* @param id
*/
public Soy(int id) {
this.id = id;
}
public Soy(int id, String brand) {
this.id = id;
this.brand = brand;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
}
package com.sunhaojie.learntest.tenth;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @ClassName Shop
* @Description 商店
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午2:56:12
*/
public class Shop {
/**
* 商店名称
*/
private String name;
/**
* 酱油列表
*/
private List<Soy> soyList;
/**
* 带有品牌的酱油容器
*/
private Map<String, List<Soy>> soys;

/**
* @param name
*/
public Shop(String name) {
this.name = name;
this.soyList = new ArrayList<Soy>();
int i = 0;
while (i < 100) {
this.soyList.add(new Soy(i++));
}
i = 0;

soys = new HashMap<String, List<Soy>>();
String brandA = "品牌A";
List<Soy> brandAList = new ArrayList<Soy>();
soys.put(brandA, brandAList);
while (i < 100) {
brandAList.add(new Soy(i++, brandA));
}
i = 0;

String brandB = "品牌B";
List<Soy> brandBList = new ArrayList<Soy>();
soys.put(brandB, brandBList);
while (i < 100) {
brandBList.add(new Soy(i++, brandB));
}
i = 0;

String brandC = "品牌C";
List<Soy> brandCList = new ArrayList<Soy>();
soys.put(brandC, brandCList);
while (i < 100) {
brandCList.add(new Soy(i++, brandC));
}
i = 0;
}

/**
*
* @Title sell
* @Description 销售酱油
* @param person
* @param size
* @return
* @return boolean
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午5:05:08
*/
public boolean sell(Person person, int size) {
if (size > this.soyList.size()) {
return false;
}

for (int i = 0; i < size; i++) {
Soy soy = soyList.get(i);
person.buy(soy);
}

for (Soy soy : person.getSoyList()) {
soyList.remove(soy);
}

return true;
}

/**
*
* @Title sell
* @Description 按照品牌销售酱油
* @param person
* @param size
* @param brand
* @return
* @return boolean
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午10:34:05
*/
public boolean sell(Person person, int size, String brand) {
List<Soy> list = this.soys.get(brand);

if (size > list.size()) {
return false;
}

for (int i = 0; i < size; i++) {
Soy soy = list.get(i);
person.buy(soy);
}

for (Soy soy : person.getSoyList()) {
list.remove(soy);
}

return true;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Soy> getSoyList() {
return soyList;
}

public void setSoyList(List<Soy> soyList) {
this.soyList = soyList;
}
}
package com.sunhaojie.learntest.tenth;

import java.util.HashSet;
import java.util.Set;

/**
* @ClassName Person
* @Description 人
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午1:38:30
*/
public class Person {
/**
* 名字
*/
private String name;
/**
* 酱油列表
*/
private Set<Soy> soyList;

/**
*
* @Title buy
* @Description 买酱油
* @param soy
* @return void
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午4:59:31
*/
public void buy(Soy soy) {
if (soyList == null) {
this.soyList = new HashSet<Soy>();
}

this.soyList.add(soy);
}

/**
* @param name
*/
public Person(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Set<Soy> getSoyList() {
return soyList;
}

public void setSoyList(Set<Soy> soyList) {
this.soyList = soyList;
}

}
package com.sunhaojie.learntest.tenth;

import java.util.Iterator;
import java.util.List;

/**
* @ClassName DaJiangYou
* @Description 打酱油测试集合
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午3:36:03
*/
public class DaJiangYou {

/**
* @Title main
* @Description main方法
* @param args
* @return void
*
* @author sunhaojie 3113751575@qq.com
* @date 2016年2月3日 下午3:36:03
*/
public static void main(String[] args) {
Shop shop = new Shop("打酱油便利店");
List<Soy> soyList = shop.getSoyList();
for (int i = 0; i < soyList.size(); i++) {
Soy soy = soyList.get(i);
System.out.println("ID为" + soy.getId() + "的酱油");
}

Person xiaoming = new Person("小明");
shop.sell(xiaoming, 5);

for (Soy soy : xiaoming.getSoyList()) {
System.out.println(xiaoming.getName() + "购买ID为" + soy.getId() + "的酱油");
}

Iterator<Soy> iterator = xiaoming.getSoyList().iterator();
for (; iterator.hasNext();) {
Soy soy = iterator.next();
System.out.println(xiaoming.getName() + "购买ID为" + soy.getId() + "的酱油");
}

xiaoming.getSoyList().clear();
shop.sell(xiaoming, 5, "品牌A");
for (Soy soy : xiaoming.getSoyList()) {
System.out.println(xiaoming.getName() + "购买品牌为" + soy.getBrand() + ",ID为" + soy.getId() + "的酱油");
}

Soy[] soyArray = new Soy[5];
int index = 0;
for (Soy soy : xiaoming.getSoyList()) {
soyArray[index++] = soy;
}
for (Soy soy : soyArray) {
System.out.println(xiaoming.getName() + "购买品牌为" + soy.getBrand() + ",ID为" + soy.getId() + "的酱油");
}
}
}
[/code]

****************************************************************************************************
****************************************************************************************************
*******                                     Java免费在线培训学员招募                                          *******
****************************************************************************************************
****************************************************************************************************