Java-集合

特点

  • List 存储的值可以重复, 集合 按照对象的进入的顺序保存对象,不会做额外的排序操作,是一种有序的存储。
  • Set 存储的值不可以重复,是一种无序的存储,遍历较慢,随机插入较快。
  • Map 存储的键 不可以重复,但是值可以重复,是一种无序的存储。
  • ArrayList List接口的实现类,允许对 集合中的对象随机访问,但是随机插入较慢,推荐用来遍历。
  • LInkedList 插入和删除的开销非常少,但是随机访问较慢。
  • HashSet Set 接口的实现类 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
  • HashMap 采用散列存储 通过 【键】来获得值,【键】 不可以重复。

ArrayLIst

常用方法

  • get() 获取指定位置的对象
  • size() 获取集合的大小
  • add() 向集合最后追加元素
  • clear() 清空集合中的所有的元素

Demo

public static void dmeoOfList() {
	ArrayList<String> sList = new ArrayList<String>();
	//想集合中添加一些元素
	for (int i = 0; i < 10; i++) {
		sList.add(String.valueOf(i));
	}
	System.err.println("集合中对象当前的数量为:" + sList.size());
	// 清空所有的元素
	sList.clear();
	System.err.println("集合中对象当前的数量为:" + sList.size());

}

LinkedList

LinkedList 是一种双向的链表

常用方法

addFirst() 在链表的头部插入对象

addLast() 在链表的尾部插入对象

remote() 移除对象 , 有多个重载形式

Demo

public static void demoOfLinkedList() {
	LinkedList<String> linkedList = new LinkedList<String>();
	// 在链表的头部插入内容
	linkedList.addFirst("第一位");
	// 在指定的位置插入指定的内容
	linkedList.add(1, "中间插入的");
	// 在链表的尾部插入内容
	linkedList.addLast("最后一位");
	
	//移除指定位置的元素
	linkedList.remove(0);
	
	//遍历所有内容
	for (String item : linkedList) {
		System.out.println(item);
	}
}

HashSet

HashSet 是不允许有重复的值的,判断的依据是, 集合中是否相同的 通过 hashCode方法来检查是否有相同的 哈希值 ,如果对象的哈希值相同那么,就执行对象的 equals() 方法进行判断 如果 equals()方法返回的同样是true 那么就认为这两个对象相同。

验证

package Program;

import org.omg.CORBA.ORBPackage.InconsistentTypeCode;

public class Person {

	private String idNumber;
	private String name;
	private int age;

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

	public Person() {

	}

	public String getIdNumber() {
		return idNumber;
	}

	public void setIdNumber(String idNumber) {
		this.idNumber = idNumber;
	}

	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;
	}

	/*
	 * 因为我们每一个人的身份证号是唯一的所以,如果身份证号相同那么就认为,两个person对象是一个person对象
	 * */
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals");
		Person person = (Person) obj;
		return person.idNumber.equals(this.idNumber);
	}

	/*
	 * 为了验证方法的执行将所有的 对象的hashCode方法都返回一个相同的值
	 */
	@Override
	public int hashCode() {
		System.out.println("hashCode Method");
		return 1;

	}

}

调用

public static void demoOfHashSet() {
	Person firstPerson = new Person("123456","firstPerson",11);
	

	Person secondPerson = new Person("123456","secondPerson",11);
	
	HashSet<Person> hashSet = new HashSet<Person>();
	hashSet.add(firstPerson);
	hashSet.add(secondPerson);
	
	System.out.println("当前集合对象的数量:"+hashSet.size());
	
	for (Person person : hashSet) {
		System.out.println("IdNumber: "+person.getIdNumber()+" Name "+person.getName()+" Age "+person.getAge());
	}
}
//输出结果
hashCode Method
hashCode Method
equals
当前集合对象的数量:1
IdNumber: 123456 Name firstPerson Age 11

以为我们重写了,我们的 hashCode 和 equals 方法 ,每一次插入的时候都会 执行 hashCode 方法 ,当我们插入第二条记录的时候,我们看到,因为我们的hashCode方法都返回了相同的值,第一次插入数据的是时候是没有问题的, 但我们插入第二条记录的时候,因为 hashCode方法是相同的就会执行 equals 方法 ,我们重写了equals 方法 通过 idnumber 来判断 对象是不是 相同,随意第二条记录别没有被插入进去。

Map

public static void demoOfHashMap() {
	Map<String, String> map = new HashMap<String, String>();

	map.put("1", "1");
	map.put("2", "2");
	//这里会将原来的值覆盖掉
	map.put("1", "1.1");
	
	//通过 键-值 的set集合遍历
	for (Map.Entry<String, String> item : map.entrySet()) {
		System.out.println("Key " + item.getKey() + " value " + item.getValue());
	}
	
	//通过 key 的set集合遍历
	for (String item : map.keySet()) {
		System.out.println("Key "+item +" vluae "+map.get(item));
	}
	
	//这种方式仅仅能获取值
	for (String item : map.values()) {
		System.out.println("value "+item);
	}
}
posted @ 2017-08-02 15:04  鲁迅认识的那只猹  阅读(176)  评论(0编辑  收藏  举报