java集合详解

今天我们主要来学习java中的容器相关的知识。按照从上往下依次学习Collection接口set接口,list接口以及map接口。Collection 接口是一组允许重复的对象。Set 接口继承 Collection,无序不允许重复,使用自己内部的一个排列机制,List 接口继承 Collection,有序允许重复,以元素安插的次序来放置元素,不会重新排列。Map 接口是一组成对的键值对象,即所持有的是 key-value pairs。Map 中不能有重复的 key。拥有自己的内部排列机制。容器中的元素类型都为引用类型, 不能放置原生数据类型(使用装箱即可),使用泛型保留类型。

一.Collection类

Collection 表示一组对象,它是集中,收集的意思,就是把一些数据收集起来,Collection接口的两个子接口:
Set 中的数据没有顺序,不可重复;
List 中的数据有顺序,可重复。

package com.se.practice;

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

/**
 * 集合:Collection
 * 	成员方法:
 * 	容器可以存储任意类型的数据
 * 	泛型中的数据类型只能为引用类型,基本数据类型会发生非自动装箱
 * 
 * 遍历:
 * 		1.增强for
 * 		2.迭代器
 * 
 *
 */
public class CollectionDemo {
	public static void main(String[] args) {
		Collection col=new ArrayList();
		Collection col2=new ArrayList();
		col.add("春天");
		col.add(1234);
		col2.addAll(col);
		System.out.println(col);
		System.out.println(col2);
		
		
		//boolean contains(Object o)如果此collection 包含的指定元素,则返回true。         
		System.out.println(col.contains("春天"));
		
		
		//equals
		System.out.println(col.equals(col2));
		
		
		//boolean isEmpty() 判断此Collection是否包含元素,如果不包含元素,返回true反之false
		
		System.out.println(col.isEmpty());
		
		//boolean remove(Object o)
		System.out.println(col.remove("春天"));
		System.out.println(col);
		
		//int size() 返回Collection中的元素数
		System.out.println(col.size());
		
		
		
		//Object[] toArray()返回包含此Collection 中所有元素的数组。
		col.toArray();
		Object[] a=col.toArray();
		System.out.println(Arrays.toString(a));
		
		
		//增强for
		for(Object o:col){
			System.out.println(o);
		}
		
		
		//迭代器
		//1.获取操作这个容器的迭代器对象
		Iterator it=col.iterator();
		//2.判断下一个是否有数据
		if(it.hasNext()){
			//3.获取写一个数据
			System.out.println(it.next());
		}
	}
}

二.Set接口

Set 接口中的元素无序不可重复:不包含重复元素,最多包含一个 null,元素没有顺序 。

package com.se.practice;

import java.util.HashSet;
import java.util.Set;
public class SetDemo {
	public static void main(String[] args) {
		Set set=new HashSet();
		set.add(false);
		set.add(true);
		set.add(false);
		set.add(null);
		set.add(null);
		System.out.println(set);
		System.out.println(set.contains(null));
		
	}
}

1.HashSet
HashSet 是 Set 接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致。 使用重写 equals 和 hashcode 来实现自定义的类型的去重。Java 中规定,两个内容相同的对象应该具有相等的 hashcode。

package com.se.practice;

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

/**
 * 
 * HashSet
 * 底层:哈希表结构(数组+链表+红黑树);
 * 优点:查询,添加,删除,修改效率高
 * 缺点:无序
 * 
 * 如果两个对象的hashcode的值不相同,两个对象肯定不相同,如果值相同,可能不是相同对象,可能是相同对象
 *
 */
public class HashSet1 {
	public static void main(String[] args) {
		Set<String>set=new HashSet();
		set.add("啤酒鸡翅");
		set.add("黄金脆皮鸡");
		set.add("糖醋排骨");
		set.add("红烧肉");
		set.add("蒜蓉小龙虾");
		System.out.println(set);
		
		Set<Person>person=new HashSet();
		person.add(new Person("001","Itachi",12));
		person.add(new Person("001","Itachi",12));
		person.add(new Person("002","kakasi",15));
		System.out.println(person);
	}
}
class Person{
	String id;
	String name;
	int age;
}

三.List接口

List接口,位置有序允许元素重复。多了一些关于 位置( 顺序)的方法。
1.ArrayList
ArrayList 是 List 的子类,它和 HashSet 想法,允许存放重复元素,因此有序。集合中元素被访问的顺序取决于集合的类型。如果对ArrayList 进行访问,迭代器将从索引 0 开始,每迭代一次,索引值加 1。然而,如果访问 HashSet 中的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。

package com.se.practice;

import java.util.ArrayList;

/**
 * ArrayList 有序的可重复的
 * 底层:数组实现,进行动态扩容,每次使用copyOf方法进行扩容,每次扩容后的容量是原来容量的1.5倍
 * 优点:随机获取或者遍历效率高
 * 缺点:增删效率低
 * 线程不安全,效率高
 * 
 * 
 * Vector 向量
 * 底层:数组实现,使用copyOf方法进行动态扩容,每次扩容后的容量是原来容量的2倍
 * 线程安全  ,效率低
 */
public class ArrayList01 {
	public static void main(String[] args) {
		ArrayList<Person> list=new ArrayList();
		list.add(new Person("001","Itachi",18));
		list.add(new Person("002","ShiShui",20));
		list.add(new Person("003","obito",23));
		
		
		System.out.println(list);
		System.out.println(list.indexOf(new Person("003","oboto",23)));
	}
}
class Person{
	private String id;
	private String name;
	private int age;
	public Person() {
		super();
	}
	public Person(String id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	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 "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}

2.LinkedList

package com.se.practice;

import java.util.LinkedList;

/**
 * LinkedList
 * 底层:双向链表实现
 * 优点:做增删效率高
 * 缺点:查询和遍历效率低
 * 
 *新增功能:新增了一些操作与头部和尾部的方法
 */
public class LinkedList01 {
	public static void main(String[] args) {
		LinkedList list=new LinkedList();
		list.add("haha");
		list.add("hehe");
		list.add("xixi");
		System.out.println(list);
		
		
		/*
		 * void addFirst(E e)
		 * 将指定元素插入此链表的开头。
		 * void addLast(E e)
		 * 将指定元素添加到链表的结尾
		 */
		
		list.addFirst("yinyin");
		list.addFirst("huohuo");
		System.out.println(list.element());
		System.out.println(list);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值