JavaSe——集合

A.对象数组

学生类:

package com.core.collection;

/**
 * @author Administration
 * 
 */
public class Student {
	private String name;
	private int age;

	public Student() {
	}

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}

}

测试类:

package com.core.collection;

public class Test {
	public static void main(String[] args) {
		// 我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息。
		Student[] ss = new Student[5];
		ss[0] = new Student("张三", 12);
		ss[1] = new Student("李四", 13);
		ss[2] = new Student("王五", 14);
		ss[3] = new Student("赵六", 17);
		ss[4] = new Student("小马", 14);
		//遍历
		for (int i = 0; i < ss.length; i++) {
			System.out.println(ss[i]);
		}
	}
}

B.集合框架



l  为什么出现集合类?

•    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。

l  数组和集合类同是容器,有何不同?

•    数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。

l  集合类的特点

•    集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。


集合的继承体系图解




C.Collection集合框架

/*

 * 集合的由来:

 *      我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。

 *      而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?

 *      数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。

 *      而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。

 *

 * 数组和集合的区别?

 *      A:长度区别

 *          数组的长度固定

 *          集合长度可变

 *      B:内容不同

 *          数组存储的是同一种类型的元素

 *          而集合可以存储不同类型的元素

 *      C:元素的数据类型问题

 *          数组可以存储基本数据类型,也可以存储引用数据类型

 *          集合只能存储引用类型

 *

 * 刚说过集合是存储多个元的,但是呢,存储多个元素我们也是有不同需求的:比如说,我要这多个元素中不能有相同的元素,

 * 再比如说,我要这多个元素按照某种规则排序一下。针对不同的需求,Java就提供了不同的集合类,这样呢,Java就提供了很多个集合类。

 * 这多个集合类的数据结构不同,结构不同不重要的,重要的是你要能够存储东西,并且还要能够使用这些东西,比如说判断,获取等。

 * 既然这样,那么,这多个集合类是有共性的内容的,我们把这些集合类的共性内容不断的向上提取,最终就能形成集合的继承体系结构。

 *

 * 数据结构:数据的存储方式。

 *

 * Collection:是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。(后面会慢慢的讲解)

 *

 * Collection的功能概述:

 * 1:添加功能

 *      booleanadd(Object obj):添加一个元素

 *      booleanaddAll(Collection c):添加一个集合的元素

 * 2:删除功能

 *      voidclear():移除所有元素

 *      booleanremove(Object o):移除一个元素

 *      booleanremoveAll(Collection c):移除一个集合的元素(是一个还是所有)

 * 3:判断功能

 *      booleancontains(Object o):判断集合中是否包含指定的元素

 *      booleancontainsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)

 *      booleanisEmpty():判断集合是否为空

 * 4:获取功能

 *      Iterator<E>iterator()(重点)

 * 5:长度功能

 *      intsize():元素的个数

 *      面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?

 * 6:交集功能

 *      booleanretainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?

 * 7:把集合转换为数组

 *      Object[]toArray()

 */


Collection的基本功能:

package com.core.collection.demo1;

import java.util.ArrayList;
import java.util.Collection;

public class Test {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add("hello");
		c.add("world");
		c.add("java");
		c.add("hello");
		System.out.println(c);//[hello, world, java, hello]
		
		c.remove("hello");
		System.out.println(c);//[world, java, hello]
		c.remove("world");
		System.out.println(c);//[java, hello]
		
		System.out.println(c.contains("java"));//true
		System.out.println(c.contains("android"));//false
		
		System.out.println(c.isEmpty());//false
		c.clear();//清除所有元素
		System.out.println(c);//[]
		System.out.println(c.isEmpty());//true
		
	}

}

Collection的高级功能:

package com.core.collection.demo1;

import java.util.ArrayList;
import java.util.Collection;

public class Test {

	public static void main(String[] args) {
		Collection c1 = new ArrayList();
		c1.add("hello");
		c1.add("world");
		c1.add("java");
		System.out.println(c1);//[hello, world, java]
		
		Collection c2 = new ArrayList();
		c2.add("11");
		c2.add("22");
		c2.add("33");
		System.out.println(c2);//[11, 22, 33]
		c1.addAll(c2);
		System.out.println(c1);//[hello, world, java, 11, 22, 33]
		
		c1.removeAll(c2);
		System.out.println(c1);//[hello, world, java]
		
		Collection c3 = new ArrayList();
		c3.add("hello");
		c3.add("android");
		c1.removeAll(c3);
		System.out.println(c1);//[world, java]
		
		Collection c4 = new ArrayList();
		c4.add("world");
		c4.add("other");
		c4.add("math");
		System.out.println(c1.containsAll(c4));//false
		
		Collection c5 = new ArrayList();
		c5.add("world");
		System.out.println(c1.containsAll(c5));//true,只有包含所有的元素,才叫包含
		
		Collection c6 = new ArrayList();
		c6.add("11");
		c6.add("22");
		c6.add("33");
		Collection c7 = new ArrayList();
		c7.add("22");
		c7.add("44");
		System.out.println(c6.retainAll(c7));//true
		System.out.println(c6);//[22]
		System.out.println(c7);//[22, 44]
		//boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
		//假设有两个集合A,B。
		//A对B做交集,最终的结果保存在A中,B不变。
		//返回值表示的是A是否发生过改变。

	}

}


D.Collection集合遍历-数组

l  Object[] toArray()

•    把集合转成数组,可以实现集合的遍历

Iteratoriterator()

•    迭代器,集合的专用遍历方式


1.存储String对象并遍历-使用数组

package com.core.collection.demo3;

import java.util.ArrayList;
import java.util.Collection;

public class Test {

	public static void main(String[] args) {
		Collection c = new ArrayList();
		c.add("hello");
		c.add("world");
		c.add("java");
		c.add("hello");

		//集合遍历,方法1.把集合转成数组
		Object[] array = c.toArray();
		for (int i = 0; i < array.length; i++) {
			System.out.println(array[i]);
		}
//		hello
//		world
//		java
//		hello

	}

}


2.存储自定义对象并遍历-使用数组


package com.core.collection.demo4;

import java.util.ArrayList;
import java.util.Collection;

public class Test {

	public static void main(String[] args) {
		//创建三个学生
		Student s1 = new Student("张三",23);
		Student s2 = new Student("李四",12);
		Student s3 = new Student("王五",34);
		
		Collection c = new ArrayList();
		c.add(s1);
		c.add(s2);
		c.add(s3);
		
		//遍历-数组方式
		Object[] array = c.toArray();
		for (int i = 0; i < array.length; i++) {
			Student s = (Student) array[i];
			System.out.println(s.getName()+"--"+s.getAge());
		}
	}

}

E.Collection集合遍历-迭代器

package com.core.collection.demo5;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {

	public static void main(String[] args) {
		//存储并遍历String对象
		Collection c1 = new ArrayList();
		c1.add("hello");
		c1.add("world");
		c1.add("java");
		//使用迭代器来遍历集合
		Iterator iterator = c1.iterator();
		while (iterator.hasNext()) {
			String next = (String) iterator.next();
			System.out.println(next);
		}
		System.out.println("-----");
		//存储并遍历自定义对象
		Student s1 = new Student("张三",23);
		Student s2 = new Student("李四",12);
		Student s3 = new Student("王五",34);
		
		Collection c2 = new ArrayList();
		c2.add(s1);
		c2.add(s2);
		c2.add(s3);
		
		//遍历-迭代器
		Iterator iterator2 = c2.iterator();
		while (iterator2.hasNext()) {
			Student s = (Student) iterator2.next();
			System.out.println(s.getName()+"---"+s.getAge());
		}
		
	}

}

for循环改进,可以提高效率
package com.core.collection.demo5;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {

	public static void main(String[] args) {
		//存储并遍历String对象
		Collection c1 = new ArrayList();
		c1.add("hello");
		c1.add("world");
		c1.add("java");
		//使用迭代器来遍历集合
		Iterator iterator = c1.iterator();
		while (iterator.hasNext()) {
			String next = (String) iterator.next();
			System.out.println(next);
		}
		System.out.println("-----");
		//存储并遍历自定义对象
		Student s1 = new Student("张三",23);
		Student s2 = new Student("李四",12);
		Student s3 = new Student("王五",34);
		
		Collection c2 = new ArrayList();
		c2.add(s1);
		c2.add(s2);
		c2.add(s3);
		
		//遍历-迭代器
		Iterator iterator2 = c2.iterator();
		while (iterator2.hasNext()) {
			Student s = (Student) iterator2.next();
			System.out.println(s.getName()+"---"+s.getAge());
		}
		
		//For循环改进,效率高
		for (Iterator iterator3 = c2.iterator();iterator3.hasNext();) {
			Student s = (Student) iterator3.next();
			System.out.println(s.getName()+"**"+s.getAge());
		}
		
	}

}


F.迭代器原理


public interface Inteator {

    boolean hasNext();

    Object next();

}

 

public interface Iterable {

    Iterator iterator();

}

 

public interface Collection extends Iterable {

    Iterator iterator();

}

 

public interface List extends Collection {

    Iterator iterator();

}

 

public class ArrayList implements List {

    public Iteratoriterator() {

        return new Itr();

    }

   

    private class Itr implementsIterator {

        public boolean hasNext() {}

       public Object next(){}

    }

}

 

 

Collection c = new ArrayList();

c.add("hello");

c.add("world");

c.add("java");

Iterator it = c.iterator(); //new Itr();

while(it.hasNext()) {

    String s = (String)it.next();

    System.out.println(s);

}



G.List集合存储和遍历

List集合的存储和遍历和Collection差不多。
特点:

l  List接口概述

•    有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。

•    与 set 不同,列表通常允许重复的元素。

H.List集合特有功能

package com.core.collection.demo6;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Test {

	// List特有功能

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("hello");
		list.add("world");
		list.add("java");
		System.out.println(list);//[hello, world, java]
		
		list.add(1, "android");
		System.out.println(list);//[hello, adroid, world, java]
		
//		list.add(5,"xixi");//错误java.lang.IndexOutOfBoundsException:
//		System.out.println(list);
		Object obj = list.get(2);
		System.out.println(obj);//world
		
		Object obj2 = list.remove(2);
		System.out.println("移除的元素:"+obj2+",list:"+list);//移除的元素:world,list:[hello, android, java]
		
		/*
		 * List集合的特有遍历功能:
		 * 		size()和get()方法结合使用
		 */

		for (int x = 0; x < list.size(); x++) {
			String s = (String) list.get(x);
			System.out.println(s);//hello android java
		}

	}

}


List集合特有的迭代器——列表迭代器
package com.core.collection.demo7;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Test {

	// List特有功能

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("hello");
		list.add("world");
		list.add("java");
		System.out.println(list);//[hello, world, java]
		Iterator iterator = list.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		System.out.println("----List集合特有迭代器ListIterator---");
		
		ListIterator iterator2 = list.listIterator();
		while (iterator2.hasNext()) {
			System.out.println(iterator2.next());
		}
		System.out.println("***");
		while (iterator2.hasPrevious()) {
			System.out.println(iterator2.previous());
		}

	}

}



I.并发修改异常的产生原因及解决方案


package com.core.collection.demo8;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Test {

	// List特有功能

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add("hello");
		list.add("world");
		list.add("java");
		System.out.println(list);// [hello, world, java]
		Iterator iterator = list.iterator();
		// while(iterator.hasNext()){
		// String next = (String) iterator.next();
		// if("world".equals(next)){
		// list.add("android");//报错,java.util.ConcurrentModificationException
		// }
		// }
		// 解决方案:
		// A.迭代器遍历元素,迭代器修改元素
		// B.集合遍历元素,集合修改元素
		// 迭代器
		while (iterator.hasNext()) {
			String next = (String) iterator.next();
			if ("world".equals(next)) {
				//list.add("android");// 报错,java.util.ConcurrentModificationException
			}
		}
		ListIterator iterator2 = list.listIterator();
		while (iterator2.hasNext()) {
			String next = (String) iterator2.next();
			if ("world".equals(next)) {
				iterator2.add("android");
			}
		}
		System.out.println(list);//[hello, world, android, java]
		System.out.println("---------");
		for (int i = 0; i < list.size(); i++) {
			String next = (String) list.get(i);
			if ("world".equals(next)) {
				list.add("C++");
			}
		}
		System.out.println(list);//[hello, world, android, java, C++]
	}

}



J.List三个子类的特点



l  ArrayList类概述

•    底层数据结构是数组,查询快,增删慢

•    线程不安全,效率高

l  ArrayList案例

•    存储字符串并遍历

•    存储自定义对象并遍历

 

l  Vector类概述

•    底层数据结构是数组,查询快,增删慢

•    线程安全,效率低

l  Vector类特有功能

•    public void addElement(E obj)

•    public E elementAt(int index)

•    public Enumeration elements()

l  Vector案例

•    存储字符串并遍历

•    存储自定义对象并遍历

l  LinkedList类概述

•    底层数据结构是链表,查询慢,增删快

•    线程不安全,效率高

l  LinkedList类特有功能

•    public void addFirst(E e)及addLast(E e)

•    public E getFirst()及getLast()

•    public E removeFirst()及public E removeLast()

l  LinkedList案例

•    存储字符串并遍历

•    存储自定义对象并遍历


K.Vector特有功能


l  Vector类概述

•    底层数据结构是数组,查询快,增删慢

•    线程安全,效率低

l  Vector类特有功能

•    public void addElement(E obj)

•    public E elementAt(int index)

•    public Enumeration elements()


package com.core.collection.demo9;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

public class Test {

	// Vector特有功能

	public static void main(String[] args) {
		Vector v = new Vector();
		v.addElement("hello");
		v.addElement("world");
		v.addElement("java");
		
		//变量
		for (int i = 0; i < v.size(); i++) {
			String next = (String) v.elementAt(i);
			System.out.println(next);
		}
		System.out.println("-------");
		Enumeration en = v.elements();
		while(en.hasMoreElements()){
			String next = (String) en.nextElement();
			System.out.println(next);
		}
	}

}

L.LinkedList的特有功能


l  LinkedList类概述

•    底层数据结构是链表,查询慢,增删快

•    线程不安全,效率高

l  LinkedList类特有功能

•    public void addFirst(E e)及addLast(E e)

•    public E getFirst()及getLast()

•    public E removeFirst()及public E removeLast()

l  LinkedList案例

•    存储字符串并遍历

•    存储自定义对象并遍历

package com.core.collection.demo10;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

public class Test {

	// LinkedList特有功能

	public static void main(String[] args) {
		LinkedList list = new LinkedList();
		list.add("hello");
		list.add("world");
		list.add("java");
		System.out.println(list);//[hello, world, java]
		
		list.addFirst("begin");
		list.addLast("end");
		System.out.println(list);//[begin, hello, world, java, end]
		
		String first = (String) list.removeFirst();
		System.out.println(list+","+first);//[hello, world, java, end],begin
		String last = (String) list.removeLast();
		System.out.println(list+","+last);//[hello, world, java],end
	}

}

M.ArrayList集合去除重复元素


l  ArrayList

•    去除集合中字符串的重复值(字符串的内容相同)

•    去除集合中自定义对象的重复值(对象的成员变量值都相同)


去除相同字符串

package com.core.collection.demo9;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

public class Test2 {

	// ArrayList
	// 去除集合中字符串的重复值(字符串的内容相同)
	// 去除集合中自定义对象的重复值(对象的成员变量值都相同)

	public static void main(String[] args) {
		ArrayList list1 = new ArrayList();
		list1.add("hello");
		list1.add("world");
		list1.add("java");
		list1.add("android");
		list1.add("hello");
		list1.add("java");
		System.out.println(list1);// [hello, world, java, android, hello, java]
		// 去重复
		ArrayList list2 = new ArrayList();
		// 遍历list1,判断
		for (int i = 0; i < list1.size(); i++) {
			String next = (String) list1.get(i);
			if(!list2.contains(next)){
				list2.add(next);
			}
		}
		System.out.println(list2);//[hello, world, java, android]
		//遍历集合list2
		Iterator iterator = list2.iterator();
		while(iterator.hasNext()){
			String next = (String) iterator.next();
			System.out.println(next);
		}
	}

}


去除相同对象


Student类:

package com.core.collection.demo9;

/**
 * @author Administration
 * 
 */
public class Student {
	private String name;
	private int age;

	public Student() {
	}

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

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

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}


	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

}

测试类:

package com.core.collection.demo9;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;

public class Test3 {

	// ArrayList
	// 去除集合中自定义对象的重复值(对象的成员变量值都相同)

	public static void main(String[] args) {
		ArrayList list1 = new ArrayList();
		Student s1 = new Student("张三", 16);
		Student s2 = new Student("李四", 17);
		Student s3 = new Student("王五", 18);
		Student s4 = new Student("张三", 19);
		Student s5 = new Student("李四", 17);
		list1.add(s1);
		list1.add(s2);
		list1.add(s3);
		list1.add(s4);
		list1.add(s5);
		System.out.println(list1);
		
		ArrayList list2 = new ArrayList();
		for (int i = 0; i < list1.size(); i++) {
			Student s = (Student) list1.get(i);
			if(!list2.contains(s)){
				list2.add(s);
			}
		}
		
		//遍历输出list2
		
		for (Iterator iterator = list2.iterator(); iterator.hasNext(); ) {
			Student s = (Student) iterator.next();
			System.out.println(s);
		}
		// Student [name=张三, age=16]
		// Student [name=李四, age=17]
		// Student [name=王五, age=18]
		// Student [name=张三, age=19]
	}

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值