Java集合框架:ArrayList、LinkedList、HashSet、TreeSet、HashMap、Iterator

JDK API中专门设计了一组类,其功能是实现各种各样的数据存储,这样的一组专门用来存储其他对象的类,一般被称为对象容器类,简称为容器类,这组类和接口的设计结构也被统称为集合框架(Collection Framework)。集合框架中容器类和关系如图:


一、Collection接口

Set接口存放的是元素是无序的且不包含重复元素,而List接口存放的是元素是有序的而且允许有重复元素。

 

1.List

(1)ArrayList

下面是一个一个小例子,使用三种方法输出ArrayList中的元素

package com.MissXu.Collection;

import java.util.*;

public class ListDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("A");//add()方法添加元素
		list.add("C");
		list.add("E");
		list.add("D");
		list.add(2,"B");//add(int index, E element)方法指定插入元素的位置
		
		/*for(int i = 0; i < list.size(); i++){
			System.out.print(list.get(i) + "  ");
		}*/
		
		/*Object[] obj = list.toArray();
		for(int i = 0;i < list.size(); i++){
			System.out.print(obj[i] + "  ");
		}*/
		
		String[] s = list.toArray(new String[]{});
		for(int i = 0; i < list.size(); i++){
			System.out.print(s[i] + "  ");
		}
	}
}

下面是上述例子所用到的方法:

 

add() 方法添加元素

add(int index, E element) 方法指定插入元素的位置

clear() 从列表中移除所有元素

get(int index) 返回列表中指定位置的元素。

size() 返回列表中的元素数。

toArray() 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。

toArray(T[] a) 返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。

 

运行结果:



(2)LinkedList

下面是一个小例子,用到的方法已注明。

package com.MissXu.Collection;

import java.util.*;

public class LinkedListDemo {

	public static void main(String[] args) {
		LinkedList<String> linkedList = new LinkedList<String>();
		linkedList.add("A");
		linkedList.add("B");
		linkedList.add("C");
		linkedList.addFirst("X");//表头插入元素
		linkedList.addLast("Y");//表尾插入元素
		System.out.println("链表头:"+linkedList.getFirst());//获取表头元素
		System.out.println("链表尾:"+linkedList.getLast());//获取表尾元素
		System.out.println("元素C的索引"+linkedList.indexOf("C"));//某元素的索引位置
		
		//element()方法的使用
		for(int i = 0;i < linkedList.size(); i++){
			System.out.print(linkedList.element());//获取但不移除此列表的头(第一个元素)
		}
		System.out.println("\n使用elememt()之后的元素为: "+linkedList);
		
		//poll()方法的使用,注意这里循环的次数
		for(int i = 0; i < linkedList.size(); i++){
			System.out.print(linkedList.poll());//获取并移除此列表的头(第一个元素)
		}
		System.out.println("\n使用poll()之后的元素为: "+linkedList);

	}

}

因为poll方法使用时是取出并删除第一个元素,所以listsize在减小,这时只循环了三次。

 

运行结果:



2.HashSet

(1)HashSet不能重复

package com.MissXu.Collection;
import java.util.*;
public class SetDemo1 {
	public static void main(String[] args) {
		Set<String> set = new HashSet<String>();
		set.add("A");
		set.add("A");
		set.add("B");
		set.add("A");
		set.add("D");
		set.add("A");
		set.add("E");
		System.out.println(set);
	}
}

运行结果:



(2)HashSet不保存添加元素的顺序:

package com.MissXu.Collection;

import java.util.HashSet;

public class HashSetDemo {
	public static void main(String[] args) {
		HashSet<String> set = new HashSet<String>();
		set.add("ereree");
		set.add("asss");
		set.add("fdfs");
		set.add("dvv");
		set.add("fsd");
		set.add("ea");
		set.add("dfsfe");
		System.out.println(set);

	}
}

运行结果:



这里使用一个自定义类Person来进行一个稍微复杂一些的例子:

因为Set集合中不能添加重复的元素所以对于自定义类,需要提供判断怎么才算重复的方法,这里的hasCode()equals()方法是判断两个人类对象是否重复的标准方法。Java规范:如果用户重写了equals()方法就必须重写hashCode()方法。

 

这里是自定义的Person类:

package com.MissXu.Collection;

public class Person implements Comparable<Person>{
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		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;
	}
	//重写toString方法
	public String toString() {
		return "Person [name = " + name + ", age = " + age + "]";
	}
	//自定义比较人类的方法,用年龄比较,年龄相同则比较姓名(系统原来的字符串比较方法compareTo())
	public int compareTo(Person person) {
		if(this.age > person.age){
			return 1;
		}else if(this.age < person.age ){
			return -1;
		}else{
			return this.name.compareTo(person.name);
		}
	
	}
	
	
	//Java规范:如果用户重写了equals()方法就必须重写hashCode()方法
		public int hashCode() {
			return this.name.hashCode() * this.age;
		}
		
	//判断是否是相同的两个人
	public boolean equals(Object obj) {
		if(this == obj){
			return true;
		}
		//如果不是人类的对象,不可能是同一个人,直接return false
		if(!(obj instanceof Person)){
			return false;
		}
		//是人类对象,则继续比较姓名和年龄是否相等,这里定义name和age都相等的为同一个人
		Person person = (Person)obj;
		if(this.name.equals(person.name) && this.age == person.age){
			return true;
		}else{
			return false;
		}
	}
}

这里是稍复杂的hashSet的例子:

package com.MissXu.Collection;
import java.util.*;

public class SetDemo2 {
	public static void main(String[] args) {
		Set<Person> set=new HashSet<Person>();
		set.add(new Person("张三",30));
		set.add(new Person("李四",30));
		set.add(new Person("王五",31));
		set.add(new Person("赵六",31));
		set.add(null);//空
		set.add(new Person("孙七",32));
		set.add(new Person("钱八",32));
		set.add(new Person("张三",33));
		set.add(new Person("张三",33));//重复元素
		set.add(null);//空
		
		Iterator it = set.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}

运行结果:



(2)treeSet不重复但排序

package com.MissXu.Collection;
import java.util.*;

public class TreeSetDemo {

	public static void main(String[] args) {
		Set<String> set = new TreeSet<String>();
		set.add("C");
		set.add("D");
		set.add("A");
		set.add("B");
		set.add("E");
		set.add("C");
		set.add("A");
		set.add("E");
		System.out.println(set);
	}
}

运行结果:



二、Map接口

HashMap<K,V>

K - 此映射所维护的键的类型 

V - 所映射值的类型

package com.MissXu.Collection;
import java.util.*;

public class HashMapDemo {

	public static void main(String[] args) {
		Map<String,Integer> map = new HashMap<String,Integer>();
		map.put("A", 1);//put()方法添加元素
		map.put("B", 2);
		map.put("A", 1);//重复元素
		map.put("C", 4);
		
		Integer value=map.get("B");//获取值
		System.out.println(value);
		
		System.out.println(map);

	}
}

运行结果:



三、输出接口;Iterator接口、ListIterator接口、foreach等等。

package com.MissXu.Collection;
import java.util.*;

public class IteratorDemo {

	public static void main(String[] args) {
		List<String> list=new ArrayList<String>();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");
		list.add("E");

		//迭代
		Iterator<String> it=list.iterator();
		while(it.hasNext()){
			System.out.print(it.next()+" ");
		}
		
		System.out.println("\n---------------");

		//foreach
		for(String s:list){
			System.out.print(s+" ");
		}
	}
}

运行结果:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值