集合
集合的类型
Java中的集合类型主要可以分为两种,一种是实现Collection接口,另一类是实现Map接口。
Collection是一个基本的集合接口,Collection中可以容纳一组集合元素(Element)。
Map没有继承Collection接口,与Collection是并列关系。Map提供键(key)到值(value)的映射。一个Map中不能包含相同的键,每个键只能映射一个值。
Collection有两个重要的子接口List和Set。List表达一个有序的集合,List中的每个元素都有索引,使用此接口能够准确的控制每个元素插入的位置。用户也能够使用索引来访问List中的元素,List类似于Java的数组。Set接口的特点是不能包含重复的元素。对Set中任意的两个元素element1和element2都有element1.equals(element2)= false。另外,Set最多有一个null元素。此接口模仿了数学上的集合概念。
Collection 接口
List接口
ArrayList
实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问的效率比较高。
package feature.list;
public class Dog {
private String name;
private String strain;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {
super();
}
public Dog(String name, String strain) {
super();
this.name = name;
this.strain = strain;
}
// 重写toString
public String toString() {
return name + "\t" + strain;
}
}
package feature.list;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
/**
* 集合测试
* @author XRY
*
*/
public class TestCollection {
/**
* ArrayList案例
*/
@Test
public void testArrayList() {
//创建四条狗狗对象
Dog dogOne = new Dog("欧欧", "金毛");
Dog dogTwo = new Dog("亚亚", "金毛");
Dog dogThree = new Dog("菲菲", "金毛");
Dog dogFour = new Dog("美美", "金毛");
//创建ArrayList对象
List list = new ArrayList();
//添加四条狗狗到list集合中
list.add(dogOne);
//list.add(dogOne);
list.add(dogTwo);
list.add(dogThree);
list.add(dogFour);
//输出集合里的元素个数
System.out.println("共计有" + list.size() + "条狗狗");
System.out.println("分别是:");
//获取集合里的每一个对象里的属性值
for(int i = 0; i < list.size(); i++) {
//向下转型,原因是当前是Object类,没有get..方法,解决这个情况可以重写toString方法
if(list.get(i) instanceof Dog) {
Dog dog = (Dog)list.get(i);
System.out.println(dog.getName() + "\t" + dog.getStrain());
}
}
//重写后
for(int j = 0; j < list.size(); j++) {
System.out.println(list.get(j));
}
System.out.println("删除狗狗前共有" + list.size() + "条狗狗");
//删除集合里的元素
list.remove(1);
list.remove(dogThree);
System.out.println("删除后还有" + list.size() + "条狗狗");
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//检查集合中是或否包含这条狗狗对象
if(list.contains(dogFour)) {
System.out.println("集合里面有美美");
}else {
System.out.println("集合里没有美美");
}
}
}
//输出结果:
共计有4条狗狗
分别是:
欧欧 金毛
亚亚 金毛
菲菲 金毛
美美 金毛
欧欧 金毛
亚亚 金毛
菲菲 金毛
美美 金毛
删除狗狗前共有4条狗狗
删除后还有2条狗狗
欧欧 金毛
美美 金毛
集合里面有美美
LinkedList:
采用链表存储方式。插入、删除元素时效率较高。
package feature.list.linkdlist;
public class Dog {
private String name;
private String strain;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public Dog() {
super();
}
public Dog(String name, String strain) {
super();
this.name = name;
this.strain = strain;
}
// 重写toString
public String toString() {
return name + "\t" + strain;
}
}
/**
* LinkedList示例
*/
@Test
public void testLinkedList() {
Dog dogOne = new Dog("欧欧", "金毛");
Dog dogTwo = new Dog("亚亚", "金毛");
Dog dogThree = new Dog("菲菲", "金毛");
Dog dogFour = new Dog("美美", "金毛");
LinkedList list = new LinkedList();
list.add(dogTwo);
list.addFirst(dogOne);
list.add(dogThree);
list.addLast(dogFour);
//向下转型
System.out.println("第一条狗狗的昵称是:" + ((Dog)list.getFirst()).getName());
System.out.println("最后一条狗狗的昵称是:" + ((Dog)list.getLast()).getName());
list.removeFirst();
list.removeLast();
System.out.println("\n删除部分狗狗后还有" + list.size() + "条狗狗");
//foreach循环,迭代
for(Object obj:list) {
System.out.println(obj);
//需要重写toString
}
}
//输出结果:
第一条狗狗的昵称是:欧欧
最后一条狗狗的昵称是:美美
删除部分狗狗后还有2条狗狗
亚亚 金毛
菲菲 金毛
再现foreach循环
for的简化形式,与for的区别仅仅是隐藏了循环条件,不需要使用下标,适合再不关心下标,需要把数组或集合全部遍历的情况(jdk1.5或以上)
foreach 迭代不会数组越界,适合循环输出所有元素。默认全部输出数组或列表对象
结构:
for(数据类型 迭代元素(元素名or对象名):迭代对象(数组或集合)){
}
Set接口
- 无序的
- 存储数据时,不可重复
Set接口下面的常用方法
增加:add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false
删除:remove(Object obj) : 删除Set集合中的元素,删除成功返回true,否则返回false。
判断是否为空:isEmpty() :如果Set不包含元素,则返回 true ,否则返回false
元素个数:size() :返回Set集合中的元素个数
包含:contains(Object o):如果Set包含指定的元素,则返回 true,否则返回false
清空:clear() : 移除此Set中的所有元素
迭代器:iterator() :返回在此Set中的元素上进行迭代的迭代器
/**
* Set集合案例
* 唯一 无序
*/
@Test
public void testHashSet() {
//给你一串数字,要求去除重复的数字,
//集合里面不能够添加基本数据类型
Integer[] nums = {1, 2,3,4,2,3,4,2,1,2,3,3,4,3,5,4,5,4,3,4,3,3,6,4,6,3};
Set set = new HashSet();
for(Integer i:nums) {
set.add(i);
}
//输出内容
System.out.println("去重后的数字是:");
for(Object obj:set) {
System.out.println(obj + " ");
}
}
//输出结果:
去重后的数字是:
1
2
3
4
5
6
Map接口
Map集合,无序不唯一,value不唯一,key是唯一的
常用的方法:
Object put(Object key, Object value)
get方法:获取指定键(key)所对应的值(value)
remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。
如何遍历Map集合
方法1:通过迭代器Iterator实现遍历
获取Iterator:Collection接口的iterator()方法。
Iterator方法:
boolean hasNext():判断是否存在另一个可访问的元素
Object next():返回访问的下一个元素
方法2:foreach循环
Map集合案例
/**
* Map集合案例,无序不唯一,value不唯一,key是唯一的
*/
@Test
public void testHashMap() {
//创建Map集合
Map map = new HashMap();
//添加到map
map.put("CN", "中华人民共和国");
map.put("US", "美利坚合众国");
map.put("RU", "亚特兰斯帝国");
//根据key获得value值
System.out.println("CN对应的国家是:" + map.get("CN"));
//元素个数
System.out.println("Map中共有:" + map.size() + "组数据");
//包含RU的Key码?
System.out.println("Map中包含RU的key吗?" + map.containsKey("RU"));
//删除RU的元素
map.remove("RU");
//是否还包含key为RU的信息
System.out.println("Map中包含RU的key吗?" + map.containsKey("RU"));
//输出key的Set
System.out.println(map.keySet());
//输出value的集合
System.out.println(map.values());
//输出map集合里的key-value的内容
System.out.println(map);
//清空map集合里的所有内容
map.clear();
System.out.println("已清空Map中数据!!");
}
//输出结果
CN对应的国家是:中华人民共和国
Map中共有:3组数据
Map中包含RU的key吗?true
Map中包含RU的key吗?false
[CN, US]
[中华人民共和国, 美利坚合众国]
{CN=中华人民共和国, US=美利坚合众国}
已清空Map中数据!!
泛型集合:genericity
/**
* 泛型集合 泛型(规定数据类型,存和取都不需要数据转型)
*/
@Test
public void testGenericityList() {
Dog dog = new Dog("oo", "博美");
List<Dog> list = new ArrayList<Dog>();
list.add(dog);
System.out.println(list.get(0));
//Map也是一样的
Map<String, Dog> map = new HashMap<String, Dog>();
map.put(dog.getName(), dog);
map.get(dog.getName());
//泛型能规定基本数据类型吗?不可以用基本数据类型,只可以使用规定数据类型。
List<Integer> listTwo = new ArrayList<Integer>();
}
//输出结果:
oo 博美
穿插知识:开源日志文件log
需要使用到的文件
log4j.properties
log4j- 1.4.17jar
使用log4j记录日志文件步骤
-
在项目中加入log4j的jar文件
-
创建log4j.properties文件
log4j.appender.D.File = 可以定义存储路径
-
配置日志信息
-
使用log4j记录日志信息
在类中使用
-
导入Logger
import org.apache.log4j.Logger;
-
引入Log4j java反射 dom4j解析xml文件
private Logger log = Logger.getLogger(TestException.class);3.使用:
-
使用
@Test public void testLog4j() { try { System.out.println("请输入被除数:"); log.debug("请输入被除数"); int numOne = scan.nextInt(); log.debug("numOne = " + numOne); System.out.println("请输入除数:"); log.debug("请输入除数"); int numTwo = scan.nextInt(); log.debug("numTwo = " + numTwo); System.out.println(String.format("%d / %d = %d", numOne, numTwo, numOne / numTwo)); log.debug("numOne / numTwo = " + numOne / numTwo); }catch(Exception e) { log.error(e.getMessage()); System.out.println("出错了!!"); }finally { System.out.println("感谢使用本程序"); } }
[log4j具体内容可参考:](Java日志软件Log4j的基本使用教程_java_脚本之家 (jb51.net))