Java集合

集合

集合的类型

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 接口

Collection接口、List接口、Set接口以及相关类的关系

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接口
  1. 无序的
  2. 存储数据时,不可重复

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接口

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记录日志文件步骤
  1. 在项目中加入log4j的jar文件

  2. 创建log4j.properties文件

    log4j.appender.D.File = 可以定义存储路径

  3. 配置日志信息

  4. 使用log4j记录日志信息

在类中使用
  1. 导入Logger

    import org.apache.log4j.Logger;
    
  2. 引入Log4j java反射 dom4j解析xml文件

    private Logger log = Logger.getLogger(TestException.class);3.使用:
    
  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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值