Java新篇章之集合

集合

初始集合

  • 集合的优点:
    • 集合的长度可以修改
    • 可以存储不同类型的基本数值
    • 可以存储对象
  • jdk初代集合为 Vector,后因需求激增子类接口,初学掌握 Collection 接口
  • 在这里插入图片描述
  • Collection 接口的实现类暂时学习 List 类和 Set 类

    • List 类 —> [特点:有序,可以索引]

      默认根据地址判断两个对象是否重复,可以自己建立重复的依据,重写 equals 方法

      • Vection : 数组
      • ArrayList : 数组结构,查询快,增删慢
      • LinkedList : 链表结构,查询慢,增删快
    • Set 类 —> [特点:无序,不重复元素]

      • HashSet :哈希结构,查询快

        内部存储元素是辉县根据 hashCode 算出对象的哈希值,如果哈希值不同,直接存储元素;如果哈希值相同,则比较对象的内容( equals ),如果对象的内容相同,则认为是相同元素,如果内容不同,则通过拉链法存储元素

      • TreeSet :二叉树结构,自动排序

        会自动对存进去的元素做自然排序,对于自定义的对象需要实现 CompareTo 接口,重写 CompareTo 方法,建立对象的比较大小方法

        默认的排序是根据 CompareTo 方法所返回的 int 类型的值决定

        如果返回 0 ,代表元素相同;

        如果返回正数,代表当前对象比传入参数对象小;

        如果返回负数,代表当前对象比传入参数对象大;

        如果是自定义对象,最好是将对象的属性全比较一次,分清主次

  • 集合的基本函数
import java.util.ArrayList;
import java.util.Collection;

//集合
//基本方法操作
public class Demo14 {
	public static void main(String[] args) {
		//创建集合对象  用 ArrayList 创建的对象初始容量为 10 
		Collection c = new ArrayList();
		//往集合中添加元素   添加的元素都是对象
		c.add("12asdf");
		c.add("dkfjs");
		c.add(1);
		System.out.println(c);
		
//		判断元素是否存在,存在为 true ,不存在为 false 
		boolean v = c.contains("sdfsdf");
		System.out.println(v);
		
//		判断集合是否为空
		boolean t = c.isEmpty();
		System.out.println(t);
		
//		判断集合中的个数
		int i = c.size();
		System.out.println(i);
		
//		清空元素
		c.clear();
		System.out.println(c);
				
	}
}
  • 集合的增删查改
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class Demo15 {
	public static void main(String[] args) {
		Collection co = new ArrayList();
		List ct = new ArrayList();
        
		//增
		co.add("天晴了");
		co.add("洗衣服了");
		co.add("心情也变好了");
		co.add(1);
		co.add('a');
		co.add("null");
		System.out.println("co集合为" + co);
		ct.add("这是第二个容器");
		ct.add("今天是美好的一天");
		ct.addAll(co);
		System.out.println("ct集合为" + ct);
		
		
		//删
		co.remove("元气满满");		//删除不存在的元素
		System.out.println(co);
		co.remove("洗衣服了");		//删除存在的元素
		System.out.println(co);
//		co.clear();
//		System.out.println(co);
		
		//查
		
//		获取集合
//		先获取迭代器(遍历的工具)
		Iterator it = co.iterator();
		Iterator ie = ct.iterator();
//		it.hasNext	boolean 类型
//		it.next		E		返回迭代的下一个元素
		//1.迭代器查找
		System.out.println("=============\n这是 co 集合");
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		System.out.println("===========\n这是 ct 集合");
		while(ie.hasNext()) {
			System.out.println(ie.next());
		}
		//2. for 循环迭代
		System.out.println("=============\n这是 co 集合");
		for(Iterator ite = co.iterator();ite.hasNext();) {
			System.out.println(ite.next());
		}

		System.out.println("===========\n这是 ct 集合");
		for(Iterator iq = co.iterator();iq.hasNext();) {
			System.out.println(iq.next());
		}
//		改:往下看		
	}

}
  • 将对象放入集合中
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
//往集合中存储自定义对象

public class Demo16 {
	public static void main(String[] args) {
//		创建集合
		Collection c = new ArrayList();
//		添加学生对象
		Student s = new Student("小丽",18);
//		将引用添加到集合中
		c.add(s);
		//向上转型为 object o = new Student();
		c.add(new Student("小亮",19));
		System.out.println(c);
		
		//取出学生对象,获取学生对象的姓名
		for(Iterator i = c.iterator();i.hasNext();) {
			//接受集合对象	object 类型
			Object obj = i.next();
			//获取子类对象,向下强制转型
			Student stu = (Student)obj;
			System.out.println(stu.getName());
		}
		
//		若往集合中传入的参数出现同名同龄的情况
//		判断两个对象的地址是否相同
		Student s1 = new Student("小诺诺",18);
		Student s2 = new Student("小诺诺",18);
		System.out.println("两个对象是否相同" + s1.equals(s2));
		
		c.add(s1);c.add(s2);
		System.out.println(c);
	}

}

class Student {
	private int age;
	private String name;
	
	public Student(){}
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Stdent [age=" + age + ", name=" + name + "]";
	}
	@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;
		return this.name == other.name && this.age == other.age;
	}
}

ArrayList 集合对引用数据类型(对象)进行增删查改

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

public class Demo17 {
	public static void main(String[] args) {
//		使用 List 操作,可以通过下标进行操作
//		创建 List 集合
		List l = new ArrayList();
		//添加元素		
//		在 Collection 中所有使用的方法,这个 List 都可以直接用
		l.add(new Student("大头1",12));
		l.add(new Student("大头2",12));
		l.add(1,new Student("大头3",12));			//插入
		System.out.println(l);
		
//		删除元素
		l.remove(1);
		System.out.println(l);
			
		//查
//		遍历元素
		for(Iterator it = l.iterator();it.hasNext();) {
			System.out.println(it.next());
		}
//		获取其中一个元素
		System.out.println(l.get(1));
//		遍历输出
		for(int i = 0; i < l.size(); i++) {
			System.out.println(l.get(i));
		}
		
		//改
		l.set(1, new Student("小达" , 20));
		System.out.println(l);
	
	}

}

需求:若集合中存在某元素,则加入指定元素

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

public class Demo18{
    public static void main(String[] args){
        //创建集合 list
        List list = new ArrayList();
        //往集合中添加元素
        list.add("啵斯喵1");
        list.add("啵斯喵2");
        list.add("啵斯喵3");
        
        //按照需求的思路:遍历集合,如果含有某元素,则往其中添加元素;
        //for(Iterator it = list.iterator();it.hasNext();){
        //    Object obj = it.next();
        //    String st = (String)obj;
        //    if(st.equals("啵斯喵2")){
        //        list.add("铲屎官");
        //    }
        //}
        //System.out.println(list);
     //以上方法会抛异常,因为线程和迭代器遍历集合发生冲突   
        
        //则将代码修改为修改集合元素
        for(Iterator it = list.iterator();it.hasNext();){
            Object ob = it.next();
            String str = (String)ob;
            if(str.equals("啵斯喵2")){
                list.set(1,"铲屎官");
            }
        }
        System.out.println(list);
    }
}

LinkedList 集合的增查改删

//import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class Demo19{
    public static void main(String[] args){
        //创建集合
        LinkedList list = new LinkedList();
        
        //添加元素
        list.add("a1");
        list.add("a2");
        list.add("a3");
        System.out.println(list);
        
        //获取
        System.out.println(list.get(1));
        System.out.println(list.getLast());
        
        //删除元素
        Object obt1 = list.removeLast();
        Object obt2 = list.removeLast();
        //Object obt3 = list.removeLast();
        //发生异常		java.util.NosuchelementException
        //删除第一个元素
        Object removeFirst = list.removeFirst();
        //1.方法删除 最前|最后的元素,实现 堆栈|队列 结构
        while(!list.isEmpty())
            // isEmpty() 方法,判断集合是否为空,如果有元素,则返回false,否则返回true
        {
            list.removeLast();
            //list.removeFirst();
        }
        //2.迭代器删除下一个元素
        for(Iterator it = list.iterator();it.hasNext();){
            list.remove(it.next());
        }
        //3.常量自增删除元素
        for(int i = 0; i < list.size(); i++){
            list.remove(i);
        }
        System.out.println(list);
    }
}

Set 集合:

​ HashSet 集合存储元素,保证元素的一致性

​ HashSet 集合采用 hash 算法,计算出元素的 hash 值之后再进行存储;如果 hash 值不同,则直接存储,如果 hash 值相同,则通过比较元素的 equals 方法,如果 equals 方法返回 ture ,则表示添加的元素已经存在,不进行存储,如果 equals 方法返回 false ,则通过拉链法进行存储;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo20{
    public static void main(String[] args){
        //创建 hashset 集合
        HashSet hset = new HashSet();
        //往集合中添加元素
        hset.add("lili");
        hset.add("xiaoxiao");
        hset.add("haha");
        hset.add("lili");
        
        //往集合中添加对象
        set.add(new student("li",18));
        set.add(new Student("zhao",19));
        set.add(new Student("qian",20));
        set.add(new Student("sun",21));
        
        //获取元素
        for(Iterator it = set.iterator();it.hasNext();){
            System.out.println(it.next());
        }
    }
}


class Student{
    private int age;
	private String name;
	
	public Student(){}
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}
//	public int hashCode() {
//		return 0;
//	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Stdent [age=" + age + ", name=" + name + "]";
	}
	@Override
	public boolean equals(Object obj) {
		System.out.println("============");
//		比较对象地址
		if (this == obj)
			return true;
//		如果传入的对象为空
		if (obj == null)
			return false;
//		传入类类型不合法
		if (getClass() != obj.getClass())
			return false;
//		传入合法参数,则比较参数是否相同
		Student other = (Student) obj;
		return this.name == other.name && this.age == other.age;
	}
}

TreeSet 集合:

​ 不重复,自动排序的集合,二叉树结构

​ 使用元素的自然顺序对元素进行排序,或者根据创建 Set 是提供的 Comparator 接口进行排序,具体取决于使用的构造方法

​ 默认排序是: TreeSet 集合使用 add 方法时,实现类中调用 put 方法,TreeMap 中的 put 方法实现 Comparable 方法,调用 Comparable 方法排序

​ 如果往集合中添加自定义类对象时,在添加元素排序时会出现强转异常,解决方法是:在自定义类中实现 Comparable 接口,重写 Compareto 方法,(public int compareto())

public class Demo21 {
	public static void main(String[] args) {
		Set set = new TreeSet();
		set.add(new Student("zhao",21));
		set.add(new Student("qian",10));
		set.add(new Student("sun",23));
		set.add(new Student("li",19));
		set.add(new Student("zhou",18));
		
		System.out.println(set);
		
		//遍历输出
		System.out.println("集合 set 的元素是:");
		for (Iterator it = set.iterator(); it.hasNext();) {
//			Object object = (Object) xt();
			System.out.println(it.next());
		}
		
	}

}
class Student implements Comparable{
    private int age;
	private String name;
	
	public Student(){}
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Stdent [age=" + age + ", name=" + name + "]";
	}
	@Override
	public boolean equals(Object obj) {
		System.out.println("============");
//		比较对象地址
		if (this == obj)
			return true;
//		如果传入的对象为空
		if (obj == null)
			return false;
//		传入类类型不合法
		if (getClass() != obj.getClass())
			return false;
//		传入合法参数,则比较参数是否相同
		Student other = (Student) obj;
		return this.name == other.name && this.age == other.age;
	}
	@Override
	public int compareTo(Object o) {
		// TODO Auto-generated method stub\
		if(!(o instanceof Student)) {
			throw new ClassCastException();
		}
		Student t = (Student)o;
		int temp = this.age - t.age;
		return temp==0?this.name.compareTo(t.name):temp;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值