欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

容器

程序员文章站 2022-06-17 07:54:00
...

Collection 容器的父接口

一些 collection 允许有重复的元素,而另一些则不允许。
Set子接口:无序的不可重复
   Lis子接口:有序的可重复
   容器可以存储任意类型的数据
   只能存储引用数据类型的数据,自动装箱

代码实例:

	方法
public class CollectionTest {//多态测试collection接口方法
	public static void main(String[] args) {
		Collection coll=new ArrayList();//list有序
		Collection coll2=new ArrayList();
		Collection coll3=new ArrayList();
		//add() 添加指定元素
		coll.add("张三");
		coll.add(123);
		coll.add("张三");
		coll.add("halo");
		coll.add(true);
	
	System.out.println(coll);//重写了string方法
	//addAll(Collection)添加
	coll2.add("xumin");
	coll2.add("halo");
	coll2.add(123);
	System.out.println(coll.addAll(coll2));
	System.out.println(coll);
	//clear.(),isEmpty(),contanis()是否包含元素
	//coll2.clear();
	System.out.println(coll2);
	System.out.println(coll2.isEmpty());
	System.out.println(coll.contains("xumin"));
	//remove 移除,remove移除所有,retainAll求交集
	coll.remove("张三");//移除索引在前对应的object
	System.out.println(coll);
	/*coll.removeAll(coll2);
	System.out.println(coll);*/
	coll.retainAll(coll2);
	System.out.println(coll);
	//size()返回元素数
	System.out.println(coll.size());
	//toArray()
	System.out.println(Arrays.toString(coll.toArray()));
	
	
}
}

遍历
public class CollectionerGodicTest {
	public static void main(String[] args) {
		//1.增强for遍历
		Collection<String> coll=new<String> ArrayList();
		coll.add("halo");
		coll.add("米老鼠");
		coll.add("唐老鸭");
		coll.add("白雪公主");
		coll.add("维尼熊");
		System.out.println(coll);
		//如果没有写泛型,想要输出String时使用String类型的方法,需要强转
		/*for(Object o:coll){
			if(o instanceof String){
				 o=(String)o;
				System.out.println(o+"的长度是"+((String) o).length());
			}else {
				System.out.println(o);
			}
		}
	
	for(String c:coll){
		System.out.println(c+"的长度是"+c.length());
	}*/
	
	//2.迭代器遍历
	Iterator<String> it=coll.iterator();
	while(it.hasNext()){
		System.out.println(it.hasNext());
		System.out.println(it.next());
	}
}
}

List :

接口的特点:有序可重复,有索引
新增了一些根据索引操作的方法 	

代码演示:

方法
public class ListFunctionTest {
	public static void main(String[] args) {
		List<Integer> list=new ArrayList<Integer>();
		list.add(12);
		list.add(3);
		list.add(8);
		list.add(4);
		list.add(21);
		List<Integer> list1=new ArrayList<Integer>();
		list1.add(3);
		list1.add(12);
		list1.add(4);
		list1.add(5);
		list1.add(7);
		System.out.println(list);
		System.out.println(list1);
		/*
		1.void add(int index, E element)指定位置插入内容  
		 void addAll(int index, E element)在此容器指定位置插入指定容器所有内容
		list.add(2, 7);
		System.out.println(list);
		list.addAll(list1);
		System.out.println(list);
		list.addAll(2, list1);
		System.out.println(list);*/
	
	/*2.equals(Object o)比较指定的对象与此列表为平等。 
	System.out.println(list.equals(list1));里面的顺序也完全一致才true*/
	
	/*3.get(int index)返回此列表的元素在指定的位置
	indexOf(Object o)返回第一次出现的指定元素的索引列表,或1如果该列表不包含的元素。
	lastindexof 返回最后一次
	System.out.println(list.get(2));
	System.out.println(list.indexOf(8));
	System.out.println(list.lastIndexOf(4));*/
	
	/*4.set(int index, E element)取代在指定位置上的元素在这个列表指定的元素,即修改元素。
	list.set(2, 6);
	System.out.println(list);*/
}
}

遍历:
public class ListGodicTest {
public static void main(String[] args) {
	List<Double> list=new ArrayList<Double>();
	list.add(2.13);
	list.add(3.14);
	list.add(3.33);
	list.add(4.12);
	
	//1.普通for循环  遍历的时候出现list方法操作时,不会出现并发修改异常,默认顺序操作
	for(int i=0;i<list.size();i++){
		if(list.get(i)==3.14){
			list.add(Math.PI);
			System.out.println("you get Π");
		}
	}
	System.out.println(list);
	
	//2.增强for循环 会出现并发修改异常,出现方法操作时不推荐使用
	/*for(Double d:list){
		if(d==3.14){
			list.add(Math.PI);
			System.out.println("you get Π");
		}
	}
	System.out.println(list);*/
	
	/*3.iterator 调用iterator方法返回iterator容器的迭代器 同时有两个引用操作容器,出现并发异常
	Iterator<Double> it=list.iterator();
	while(it.hasNext()){
		if(it.next()==3.14){
			list.add(Math.PI);
			System.out.println("you get Π");
		}
		System.out.println(list);
	}*/
	
	//4.Listiterator 调用List新增方法Listiterator返回的迭代器使用方法
	ListIterator<Double> it=list.listIterator();
	while(it.hasNext()){
		if(it.next()==3.14){
			it.add(Math.PI);
		}
		System.out.println(list);
	}
}
}

ArrayList:

最重要之一:
 List接口的实现类:有序可重复
 ArrayList:
 	底层: 数组(可变数组),数组再内存中是连续的内存空间
 	优点: 查询,随机访问效率高
 	缺点: 增删效率低(改变容量涉及到数组的拷贝)
 	动态扩容:通过调用Arrays.copyOf()方法进行动态扩容,扩容后新容器的大小是原容量的1.5倍
 		第一次添加数据初始容量为10,加载因子(0~1):1 
  新增方法:使用List定义的方法
  线程不安全的容器类
 
 Vector 向量
 	底层实现和特点与ArrayList类似
 	1)Vector线层安全的容器类|同步的,效率较低
 	2)扩容原容量的2倍

代码实例:

ArraysList没有新增方法,和List一样,测试u写入其它类类型,写入自定义类型需要重写equals
 
public class ArraylistTest {
	public static void main(String[] args) {
		ArrayList<Person> per=new ArrayList<Person>();
		per.add(new Person("halo","女",18));
		per.add(new Person("xumis","男",19));
		per.add(new Person("qiqi","女",20));
		Person pe=new Person("xiqia","男",18);
		System.out.println(per);
		//System.out.println(per.indexOf(new Person("xumis","男",19))); 返回-1 比较的是地址,如果需要判断内容需要重写equals内容
		//System.out.println(per.indexOf(new Person("xumis","男",19))); 重写之后返回下标1
		
	}
}

class Person{

private String name;
private String sex;
private int age;

public Person() {
	// TODO Auto-generated constructor stub
}

public Person(String name, String sex, int age) {
	super();
	this.name = name;
	this.sex = sex;
	this.age = age;
}

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

public String getSex() {
	return sex;
}
public void setSex(String sex) {
	this.sex = sex;
}

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

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

@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 (name == null) {
		if (other.name != null)
			return false;
	} else if (!name.equals(other.name))
		return false;
	if (sex == null) {
		if (other.sex != null)
			return false;
	} else if (!sex.equals(other.sex))
		return false;
	return true;
}
}

LinkedList:

底层:双向链表实现
优点:增删效率高
缺点:查询或随机获取效率低
新增方法:新增了一些操作与链表头和链表尾的功能(见名知意的方法使用)

代码实例:

  新增了一些操作于表头和表尾的方法
 
public class LinkedListTest {
	public static void main(String[] args) {
		LinkedList<Integer> link=new LinkedList<Integer>();
		link.add(3);
		link.add(12);
		link.add(14);
		System.out.println(link);
		
		//1.addFirst(E e)offer 插入指定元素在这个列表的开始。
		link.addFirst(19);
		System.out.println(link);
		
	/*2.getFirst() 返回此列表的第一个元素。  
	  E getLast()返回此列表中最后一个元素 */
	System.out.print(link.getFirst());
	System.out.println(link.getLast());
	
	//3.poll()|remove 获取和删除这个列表的头(第一个元素)。
	System.out.println(link.poll());
	System.out.println(link);
	System.out.println(link.removeLast());
	System.out.println(link);
	
	//4.peek()检索,但不删除这个列表的头(第一个元素)。 
	System.out.println(link.peek());
}
}

Set:

无序的不可重复的,null值只能存在一个
  没有新增方法,与Collection中功能相同
  
 遍历: 1.增强for
 	   2.迭代器

代码实例:

public class Settest {
	public static void main(String[] args) {
		Set<Integer> set=new HashSet<Integer>();
		set.add(3);
		set.add(7);
		set.add(14);
		System.out.println(set);
		System.out.println(set);
		
	//if..each遍历
	for(Integer i:set){
		System.out.println(i);
	}
	
	//iterator遍历
	Iterator<Integer> it=set.iterator();
	while(it.hasNext()){
		System.out.println(it.next());
	}
}
}

HashSet:

 底层是由HashMap维护的
 	底层:由哈希表结构存储(数组+链表+红黑树)
 	优点:查询,增加,删除效率较高
 	缺点:无序
  扩容:默认初始容量16,加载因子0.75 ,扩容是原容量的2倍
  
  HashSet存储引用数据类型去重:需要重写hashCode()方法和equals()方法进行自定义类型去重
  	如果不重写hashCode(),可以遇到没有equals方法这一步就医过滤掉不是相同的对象了,直接存储,不会equals方法比较
  	hashCode()相同的对象有可能相同可以不相同,进一步比较equals()
  	hashCode()不相同的对象肯定不相同,过滤掉一写不相同的对象,不需要进一步比较equals方法效率较高

代码实例:

public class HashSetTest {
	public static void main(String[] args) {
		HashSet<Person> hash=new HashSet<Person>();
		hash.add(new Person("halo", "男", 12));
		hash.add(new Person("xumins", "男", 18));
		hash.add(new Person("qiqi", "女", 15));
		hash.add(new Person("qiqi", "女", 15));
		System.out.println(hash);//因为先计算hashcode放入位置,所以如果不通过重写hashcode方法排除内容相同的
		//对象,就会按系统hashcode计算方法因为地址不同而放在不同的位置跳过equals,所以自定义需要重写hashcode方法和equals方法
	}
}
相关标签: javase