java中的常用集合

集合

Collection接口

是List接口和Set接口的父接口,接口中规范了List集合和Set集合的操作方式

List接口

List是一个接口,接口中定义了规范,要使用这些接口,就必须实现这个接口,并给接口方法补上方法体

List结合常用的api

boolean add(Object)  给集合添加对象
int size()  获取集合的元素个数
Object get(int) 从集合中获取指定下标位置的元素
void clear() 清除集合中的所有元素
boolean isEmpty()  判断集合是否为空,指的是集合内容是否为空
List subList(int,int) 从起始索引到终止索引,包括开头不包括结尾
void remove(int) 删除指定索引位置的对象
void remove(Object) 删除指定对象
void remove(Collection) 删除集合中的一个子集
等等…

ArrayList类

ArrayList类:有具体的下标,通过下标查询,查询速度快,不适合增删
Person为接口,CommonPerson实现了接口,Student类和Teacher类继承CommonPerson
Person为接口

	/**
	 * 增加:给集合添加数据 1.无论什么对象,被添加到allPerson集合中,就会变成<T>类型的对象了, 说明无论什么对	象,进入集合后都变成
	 * <T>对象,属于自然转换 2.add方法的返回值是boolean值,这个返回值没有被使用
	 * 3.泛型写法,Java认为此写法是安全的,java建议使用泛型
	 */
	ArrayList<Person> allPerson = new ArrayList<Person>();
	Student stu1 = new Student("张三", 20, "S001");
	Student stu2 = new Student("李四", 21, "S002");
	Teacher tea1 = new Teacher("赵六", 30, 10000);
	Teacher tea2 = new Teacher("田七", 35, 20000);
	allPerson.add(stu2);
	allPerson.add(tea1);
	allPerson.add(stu1);
	allPerson.add(tea2);
	//查询时候先循环遍历,在判断是学生类还是老师类,强转之后输出学生的信息和老师的信息
	for (int i = 0; i < allPerson.size(); i++) {
			Person p = allPerson.get(i);
			if (p instanceof Student) {
				Student stu = (Student) p;
				System.out.println("name=" + stu.getName() + "	age=" + stu.getAge() + "	stuNo=" + stu.getStuNo());
			} else if (p instanceof Teacher) {
				Teacher tea = (Teacher) p;
				System.out.println("name=" + tea.getName() + "	age=" + tea.getAge() + "	salary=" + tea.getSalary());
			}
		}
		//此方法为查询方法在修改和删除的时候使用
		private Person findPersonByName(ArrayList<Person> allPerson, String name) {
			Person p = null;
			for (Person p1 : allPerson) {
				CommonPerson cp = (CommonPerson) p1;
				if (name != null && name.equals(cp.getName())) {
					p = cp;
					break;
				}
			}
			return p;
		}
		//修改,循环遍历找到要修改数据修改即可,例:老师的薪水X2
		Object obj = this.findPersonByName(allPerson, name);
		if (obj != null && obj instanceof Teacher) {
			Teacher tea = (Teacher) obj;
			tea.setSalary(tea.getSalary() * 2);
		}
		//删除
		.clear();//全部删除
		.removeAll();//小括号中要放入想要删除的集合名
		.remove(int index);//删除指定下边的集合
		.remove(Object obj);//删除指定的集合内容
		//难点.removeIf()
		/**
		 * 基于指定的条件删除集合中的数据 多态,Predicate接口作为函数的参数 匿名内部类 策略 每一个Predicate接口的子实现都是一种实现
		 * 回调函数
		 * @param allPerson
		 */
		public void deletePersonByIf(ArrayList<Person> allPerson) {
			Predicate<Person> p1 = new Predicate<Person>() {
				// 回调函数
				@Override
				public boolean test(Person p) {
					boolean flag = false;
					if (p.getClass() == Teacher.class) {
						flag = true;
					}
					return flag;
				}
			};
			allPerson.removeIf(p1);
			//两种写法
			boolean flag = allPerson.removeIf(new Predicate<Person>() {
				// 回调函数
				@Override
				public boolean test(Person p) {
					boolean flag = false;
					CommonPerson cp = (CommonPerson) p;
					if (cp.getAge() == 35) {
						flag = true;
					}
					return flag;
				}
			});
		}

LinkedList类

LinkedList类:没有下标,是链状,不是和做查询,但适合做增和删
用法和ArrayList基本相同

Set接口

集合中不能有重复的元素出现,所有Set集合中的元素只能唯一,没有顺序
能存null,线程不安全

HashSet类

HashSet:集合越小遍历的速度和效率越好

	//添加
		HashSet<Person> allPerson = new HashSet<Person> ();
		Student stu1 = new Student("张三", 20, "S001");
		Student stu2 = new Student("李四", 21, "S002");
		Teacher tea1 = new Teacher("赵六", 30, 10000);
		Teacher tea2 = new Teacher("田七", 35, 20000);
		allPerson.add(stu1);
		allPerson.add(stu2);
		allPerson.add(tea1);
		allPerson.add(tea2);
	//查询
		for(Person p : allPerson){
			if(p instanceof Student){
				Student stu = (Student) p;
				System.out.println("name=" + stu.getName() + "	age=" + stu.getAge() + "	stuNo=" + stu.getStuNo());
			} else if (p instanceof Teacher) {
				Teacher tea = (Teacher) p;
				System.out.println("name=" + tea.getName() + "	age=" + tea.getAge() + "	salary=" + tea.getSalary());
			}
		}
	//此方法是查询方法,后面删除和修改有应用
		private CommonPerson findPersonByName(HashSet<Person> allPerson,String name){
			CommonPerson cp = null;
			for(Person p : allPerson){
				CommonPerson cpp = (CommonPerson)p;
				if(name!=null && name.equals(cpp.getName())){
					cp=cpp;	
				}	
			}
			return cp;
		}
	//修改,老师的薪水*2
		public void updateSalaryByName(HashSet<Person> allPerson,String name){
			CommonPerson cp = findPersonByName(allPerson,name);
			if(cp!=null && name!=null && cp instanceof Teacher){
				Teacher tea = (Teacher)cp;
				tea.setSalary(tea.getSalary()*2);
			}
		}
	//删除,按照名字删除
		public void deletePersonByName(HashSet<Person> allPerson,String name){
			Person p = findPersonByName(allPerson,name);
			boolean flag = allPerson.remove(p);
			if(flag){
				System.out.println("删除成功");
			}
		}


TreeSet类

TreeSet:要求集合中的数据要排序
要求要存储的元素对象所对应的类必须实现Coparable接口

Map接口

若干键值对组成的集合
map集合中的所有的key也是一个集合,而且是一个Set集合,这就说明key不能重复
map集合中的所有valus也是一个集合,是Collection集合或者Map集合,即集合套集合

  1. Map集合的应用场景广泛:

    原因:前提是能确定key值,就一定会快速获取key对应的value 很多的框架中的数据都是用Map集合存储的
         Spring框架,springMVC框架,strutcts框架,myBatis框架,tomcat框架,redis框架等…
    
  2. 从map集合中取出集合数据有三种方式:

	//1.一次取出一个价值对
		For(Entry<String, Person> entry : allPerson.entrySet()){
			String key = entry.getKey();
			Person p = entry.getValue();
			//判断类型的代码
		}
	//2.先取出所有的key,循环遍历key,根据key老取出value
		Set<String> keys = allPerson.keySet();
			for(String key : keys){
				Person p = allPerson.get(key);
				//判断类型的代码
			}	
	//3.直接取出所有的value,进行遍历找到合适的value即可
		Collection<Person> allValues = allPerson.values();
			for (Person p: allValues) {
				//判断类型的代码
			}

HashMap类

HashMap:可以存储null,线程不安全,异步

	//添加
	Map<String, Person> allPerson = new HashMap<String, Person>();
		Student stu1 = new Student("张三", 20, "S001");
		Student stu2 = new Student("李四", 21, "S002");
		Teacher tea1 = new Teacher("赵六", 30, 10000);
		Teacher tea2 = new Teacher("田七", 35, 20000);
		//以老师和学生的名字作为key存入数据
		allPerson.put(stu1.getName(), stu1);
		allPerson.put(stu2.getName(), stu2);
		allPerson.put(tea1.getName(), tea1);
		allPerson.put(tea2.getName(), tea2);
	//查询
		//方式一 循环遍历,每次只取出一个元素(键值对)
		for (Entry<String, Person> entry : allPerson.entrySet()) {
			String key = entry.getKey();
			Person p = entry.getValue();
			if (p instanceof Student) {
				Student stu = (Student) p;
				System.out.println("name=" + stu.getName() + "	age=" + stu.getAge() + "	stuNo=" + stu.getStuNo());
			} else if (p instanceof Teacher) {
				Teacher tea = (Teacher) p;
				System.out.println("name=" + tea.getName() + "	age=" + tea.getAge() + "	salary=" + tea.getSalary());
			}
		}
		//方式二 获取map集合中的所有的key得集合
		Set<String> allKeys = allPerson.keySet();
		for (String key : allKeys) {
			// 根据指定key来获取指定的value
			Person p = allPerson.get(key);
			if (p instanceof Student) {
				Student stu = (Student) p;
				System.out.println("name=" + stu.getName() + "	age=" + stu.getAge() + "	stuNo=" + stu.getStuNo());
			} else if (p instanceof Teacher) {
				Teacher tea = (Teacher) p;
				System.out.println("name=" + tea.getName() + "	age=" + tea.getAge() + "	salary=" + tea.getSalary());
			}
		}
		//方式三 获取map集合中的所有的key得集合
		Collection<Person> ps = allPerson.values();
		for (Person p : ps) {
			if (p instanceof Student) {
				Student stu = (Student) p;
				System.out.println("name=" + stu.getName() + "	age=" + stu.getAge() + "	stuNo=" + stu.getStuNo());
			} else if (p instanceof Teacher) {
				Teacher tea = (Teacher) p;
				System.out.println("name=" + tea.getName() + "	age=" + tea.getAge() + "	salary=" + tea.getSalary());
			}
		}
	//修改,把老师的薪水*2
		Person p = allPerson.get(name);
		if(p!=null && p instanceof Teacher){
			Teacher tea = (Teacher) p;
			tea.setSalary(tea.getSalary()*2);
		}
	//删除
	//全部删除
	allPerson.clear();
	//删除所有的key
	allPerson.remove(key);
	//根据指定年龄删除
	String[] keys = new String[allPerson.size()];
		int count = 0;
		for(String key : allPerson.keySet()){
			Person p = allPerson.get(key);
			CommonPerson cp = (CommonPerson)p;
			if(cp.getAge() == age){
				keys[count++] = key;
			}
		}
		for (int i = 0; i < count; i++) {
			allPerson.remove(keys[i]);
		}

Hashtable类

不可以存储null,线程安全,同步

  1. 总结

有关一些常用集合的小总结,可能不是很详细,之后我会继续补充的,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值