一、 什么是集合:
在Java中提供了一些可以保存同一数据类型的数据集称为集合,就是规定了一些集合的规范(接口、抽象类、实现类)及方法,
方便我们程序在保存数据时进行增、删、改、查操作,编程更加高效。
二、 List集合:
List集合特性:List集合(ArrayList、LinkedList)是可重复的、有序的(是原始顺序)
1、ArrayList实现类:底层采用数组实现,查询可以通过下标快速点位,查询速度快,针对添、删、改速度慢
2、LinkedList实现类:底层采用双向链表实现,添加、删除时通过修改操作元素的前后索引值即可,效率高;
针对查询就需要从第一个查询到最后一个,查询效率低
package com.oop.ch07.test; import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
import com.oop.ch07.Dept; /**
*练习List集合的使用:ArrayList、LinkedList
*
*/
public class ListTest { //测试arraylist的基本用法
@Test
public void testArrayList1() {
List arrayList1 = new ArrayList();
//将元素值追加到集合中
arrayList1.add("aa");
arrayList1.add("gg");
arrayList1.add("bb");
arrayList1.add("cc");
//将元素值插入到index(从0开始)指定的位置,其他的元素往后挪
arrayList1.add(1, "mm");
for (Object a : arrayList1) {
System.out.println(a);
}
System.out.println("----------------------");
Integer element0 = (Integer) arrayList1.get(0);
System.out.println(element0); } //泛型
@Test
public void testArrayList2() {
//在创建实现类ArrayList的对象时,Java7.0及以上的版本泛型会参考左边
List<String> arrayList1 = new ArrayList<String>();
//将元素值追加到集合中
arrayList1.add("aa");
arrayList1.add("gg");
arrayList1.add("bb");
arrayList1.add("cc");
//将元素值插入到index(从0开始)指定的位置,其他的元素往后挪
arrayList1.add(1, "mm");
for (Object a : arrayList1) {
System.out.println(a);
}
System.out.println("----------------------");
//添加泛型以后可以将运行时异常提前为检查性异常,更容易被发现此异常,并及时处理
//Integer element0 = (Integer) arrayList1.get(0);
String element0 = arrayList1.get(0);
System.out.println(element0); } //基本数据类型和包装数据类型
@Test
public void arrayList3() {
List<Float> studentNos = new ArrayList<Float>();
//自动装箱:能将基本数据类型(float)自动转换为包装数据类型(Float)
studentNos.add(1.0F);
studentNos.add(2.0F);
//自动拆箱:能将包装数据类型自动转换为基本数据类型
float no1 = studentNos.get(1);
System.out.println(no1);
} /**
* 练习List(ArrayList、LinkedList)集合中提供的常用方法
*/
@Test
public void arrayList4() {
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("aaa"); //在集合中从前向后查找指定的元素值对应的索引位置
int index1 = list.indexOf("aaa"); //从前往后
System.out.println(index1); //在集合中从后向前查找指定的元素值对应的索引位置
int index2 = list.lastIndexOf("aaa"); //从后往前
System.out.println(index2); //判断集合中是否包含指定的元素,包含为true
//list.contains("ccc");
System.out.println(list.contains("ccc")); //通过索引删除指定位置的元素,返回删除的元素值
list.remove(3);
System.out.println(list.remove(3)); //通过元素删除对应的元素,返回是否删除成功
//list.remove("bbb");
System.out.println(list.remove("bbb")); //返回集合元素个数
System.out.println(list.size()); //Iterator迭代器,循环遍历元素
/*
* 返回该集合的所有元素,并把他们放置到一个iterator迭代器中,
* it.hasNext():返回迭代器中是否还有下一个元素
* it.net():返回正在迭代的元素值,将指针向下移动一个单位
*/
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
} /**
* 练习LinkedList集合中提供的常用方法
*/
@Test
public void testLinledList() {
List<String> list = new LinkedList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("aaa"); for (String element : list) {
System.out.println(element);
} //在集合中从前向后查找指定的元素值对应的索引位置
int index1 = list.indexOf("aaa"); //从前往后
System.out.println(index1); //在集合中从后向前查找指定的元素值对应的索引位置
int index2 = list.lastIndexOf("aaa"); //从后往前
System.out.println(index2); //判断集合中是否包含指定的元素,包含为true
//list.contains("ccc");
System.out.println(list.contains("ccc")); //通过索引删除指定位置的元素,返回删除的元素值
list.remove(3);
System.out.println(list.remove(3)); //通过元素删除对应的元素,返回是否删除成功
//list.remove("bbb");
System.out.println(list.remove("bbb")); //返回集合元素个数
System.out.println(list.size()); //Iterator迭代器,循环遍历元素
/*
* 返回该集合的所有元素,并把他们放置到一个iterator迭代器中,
* it.hasNext():返回迭代器中是否还有下一个元素
* it.net():返回正在迭代的元素值,将指针向下移动一个单位
*/
Iterator<String> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
} /*
* 在List中放实体,实体类代码放在最后
*/
@Test
public void testArrayListEntity() {
List<Dept> deptList = new ArrayList<Dept>();
deptList.add(new Dept("人事部","北京"));
deptList.add(new Dept("财务部","上海"));
deptList.add(new Dept("公关部","昆明"));
deptList.add(new Dept("综合部","山东")); for (Dept dept : deptList) {
System.out.println(dept);
}
}
}
三、 Set集合:
1、HashSet实现类:不可重复的、是无序的,Hash算法就是随机算法。
package com.oop.ch07.test; import java.util.*; /*
* 练习HashSet集合的使用
*/
public class HashSetTest { public static void main(String[] args) {
Set<String> set = new HashSet<String>(); System.out.println("set集合是否为空:" + set.isEmpty()); set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ddd");
set.add("eee");
set.add("aaa"); for (String element : set) {
System.out.println(element);
}
System.out.println("---------"); //只能通过值删除
set.remove("eee");
for (String element : set) {
System.out.println(element);
} //集合的长度
System.out.println("Set集合的长度:" + set.size()); //Iterator迭代器,遍历set
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next()); }
} }
2、TreeSet实现类:不可重复的、是有序的(自然顺序,a-z、0-9)
package com.oop.ch07.test; import java.util.*; /*
* 练习TreeSet集合的使用:自然顺序
TreeSet集合的大多数方法都和HashSet一样的
*/
public class TreeSetTest {
public static void main(String[] args) {
Set<String> set = new TreeSet<String>();
set.add("aaa");
set.add("ccc");
set.add("bbb");
set.add("ddd");
set.add("eee");
set.add("aaa"); for (String element : set) {
System.out.println(element);
}
}
}
四、 Map集合:
Map集合采用“键值对”的entry结构,每一个元素由key(键)和value(值)构成,可以通过指定key方便的获取value。
1、 HashMap实现类:是无序的(Hash是一种随机算法),针对Key是不可重复的,若放相同的Key,
新的entry会替换老的entry;针对value没有限制(可重复)。
2、 TreeMap实现类:针对key是自然排序,不可重复,若key重复,新的entey会替换老的entry。针对value没有限制(可重复)。
package com.oop.ch07.test; import java.util.Map.*;
import java.util.*;
import org.junit.Test;
import com.oop.ch07.Dept; /*
* 练习map集合的使用:HashMap、TreeMap
*/
public class MapTest {
/**
* 练习HashMap
*/
@Test
public void testHashMap() {
Map<Object, Object> map = new HashMap<Object, Object>();
map.put("k1","k1的值");
map.put("k2","k2的值");
map.put("k3","k3的值");
map.put("k4","k4的值");
map.put("k3","k3的新值");
map.put("k5","k3的值"); //通过key获取该entry中的value
System.out.println(map.get("k3")); //entry的个数
System.out.println("entry的个数:" + map.size()); //map.keySet():将Map集合中所有entry的key都获取并放置到Set集合中
Set<Object> keySets = map.keySet();
for (Object key : keySets) {
//针对放置了Map集合中所有Key的Set集合进行遍历,可以取到Key值,再通过get(Object Key)方法获取到对应的value
System.out.println("键:" + key + ",值:" + map.get(key));
} //entrySet():将Map集合中的所有entry(key和Value)一次性取出来放到一个Set集合中,
//再通过entry的getKey和getValue方法,获取到Map集合中放置的Key和value
//Entry<Object, Object>:相当于一个object
System.out.println();
Set<Entry<Object, Object>> entrySet = map.entrySet();
for (Entry<Object, Object> entry : entrySet) {
System.out.println("键:" + entry.getKey() + ",值:" + entry.getValue());
} //containsKey(Object key):Map集合的Key中是否包含key,包含为true
System.out.println(map.containsKey("k2"));
//containsValue(Object value):Map集合的Value中是否包含value
System.out.println(map.containsValue("K2")); } /**
* 练习TreeMap
*/
@Test
public void testTreeMap() {
Map<Object, Object> map = new TreeMap<Object, Object>();
map.put("k1","k1的值");
map.put("k2","k2的值");
map.put("k3","k3的值");
map.put("k4","k4的值");
map.put("k3","k3的新值");
map.put("k5","k3的值"); //通过key获取该entry中的value
System.out.println(map.get("k3")); //entry的个数
System.out.println("entry的个数:" + map.size()); //map.keySet():将Map集合中所有entry的key都获取并放置到Set集合中
Set<Object> keySets = map.keySet();
for (Object key : keySets) {
//针对放置了Map集合中所有Key的Set集合进行遍历,可以取到Key值,再通过get(Object Key)方法获取到对应的value
System.out.println("键:" + key + ",值:" + map.get(key));
} //entrySet():将Map集合中的所有entry(key和Value)一次性取出来放到一个Set集合中,
//再通过entry的getKey和getValue方法,获取到Map集合中放置的Key和value
//Entry<Object, Object>:相当于一个object
System.out.println();
Set<Entry<Object, Object>> entrySet = map.entrySet();
for (Entry<Object, Object> entry : entrySet) {
System.out.println("键:" + entry.getKey() + ",值:" + entry.getValue());
} //containsKey(Object key):Map集合的Key中是否包含key,包含为true
System.out.println(map.containsKey("k2"));
//containsValue(Object value):Map集合的Value中是否包含value
System.out.println(map.containsValue("K2")); } @Test
/*
* 在HashMap中放实体
*/
public void testHashMapEntity() {
Map<String,Dept> deptMap = new HashMap<String, Dept>();
deptMap.put("dept1", new Dept("人事部","北京"));
deptMap.put("dept2", new Dept("财务部","上海"));
deptMap.put("dept3", new Dept("公关部","昆明"));
deptMap.put("dept4", new Dept("综合部","山东")); //打印一个value
System.out.println(deptMap.get("dept1")); //使用entrySet遍历Map集合
System.out.println("使用entrySet遍历Map集合");
for (Entry<String, Dept> map : deptMap.entrySet()) {
System.out.println(map);
} //使用keySet遍历集合
System.out.println("使用keySet遍历集合");
//Set<String> key = deptMap.keySet();
for (String map : deptMap.keySet()) {
System.out.println(map + "=" + deptMap.get(map));
}
}
}
实体类:
package com.oop.ch07; /**
* 练习封装tb_dept表对应的实体类Dept 八种基本数据类型对应的有八种引用数据类型(包装数据类型),
* byte short int long loat double char boolean
* Byte Short Integer Long Float Double Character Boolean
*
*/
public class Dept {
private Integer deptNo; // 部门编号
private String dName; // 部门名称
private String loc; // 部门所在地
//setter、getter方法的区域:
public void setDeptNo(Integer deptNo) {
this.deptNo = deptNo;
}
public Integer getDeptNo() {
return deptNo;
} public void setDName(String dName) {
this.dName = dName;
}
public String getDName() {
return dName;
} public void setLoc(String loc) {
this.loc = loc;
}
public String getloc() {
return loc;
} //构造方法的区域:
//默认的构造方法,当手动写了一个带参的构造方法,默认的就会失效
public Dept() { }
//有参的构造方法
public Dept(Integer deptNo) {
this.deptNo = deptNo;
}
public Dept(String dName,String loc) {
this.dName = dName;
this.loc = loc;
}
public String method1() {
return null;
} /*
* 重写toString()方法,在Object类中就定义过该方法,一个类若重写了toString()方法
* 当输出该类的对象信息时,就会以toString方法的格式输出该类中“属性名 = 属性值”的格式,更方便我们观察对象的属性信息
* 此方法不需要手动调用,而是在输出对象时,JVM会自动调用
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Dept [deptNo=" + deptNo + ", dName=" + dName + ", loc=" + loc + "]";
}
}
五、 泛型:
在集合框架中默认放置的数据都是Object类型(让集合可以存放任何类型的数据),但实际运用过程中通常需要将类型具体化,
更利于代码的编写,因此Java提供了泛型来指定集合中放置数据的真实类型,以避免后期数据类型转换异常。