JAVA_Lesson17(传智播客笔记之常用对象哈希表、HashSet、TreeSet、集合框架)

Vector集合的方法暂时略过吧,因为已经淘汰了,暂时不管他了。

常用对象API(集合框架-LinkedList集合)

package cn.itcast.p2.linkedlist.demo;
import java.util.Iterator;
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
		LinkedList link=new LinkedList();
		link.addFirst("abc1");
		link.addFirst("abc2");
		link.addFirst("abc3");
		link.addFirst("abc4");
//	System.out.println(link.getFirst());//获取第一个但不删除
	//	System.out.println(link.getFirst());
//		打印结果abc4
//		abc4
			
		System.out.println(link.removeFirst());//获取元素但是会删除。
		System.out.println(link.removeFirst());
//		abc4
//		abc3
		while(!link.isEmpty()) {
			System.out.println(link.removeFirst());
			/*abc4
			abc3
			abc2
			abc1*/
		}
		
//		Iterator it=link.iterator();
//			while(it.hasNext()) {
//				System.out.println(it.next());
//				/*打印结果为abc4(ctrl+shift+/是注释多行当快捷键)
//				abc3
//				abc2
//				abc1*/
//			}
	}

}

练习题略过

常用对象API(集合框架-ArrayList集合存储自定对象)

集合里面装的全部都是引用,不可能装数组的。迭代器用的也是引用。

package cn.itcast.p3.arraylist.test;

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

import cn.itcast.p.bean.Person;

public class ArrayListTest {

	public static void main(String[] args) {
		
		ArrayList al =new ArrayList();
		al.add(new Person("lisi1",21));
		al.add(new Person("lisi2",21));
		al.add(new Person("lisi3",21));
		al.add(new Person("lisi4",21));
		
		Iterator it=al.iterator();
		while(it.hasNext()) {
			//System.out.println(it.next().getName());//person 提升为Object类型,所以没有了该方法
		//	System.out.println(((Person)it.next()).getName());//需要把它强制转回去才可以。
			/*lisi1
			lisi2
			lisi3
			lisi4*/
			Person p=(Person)it.next();//多年多态学习的时候讲过(小心要强转动作)
			System.out.println(p.getName()+"--"+p.getAge());
			/*lisi1--21
			lisi2--21
			lisi3--21
			lisi4--21*/
			
		}
		
		al.add(5);//al.add(new Integer(5)); jdk1.5以后现在可以简写了。
		//基本数据类型赋予了引用数据类型的时候才装箱。当引用数据类型和基本数据类型做运算的时候就拆箱。
		
	}

}

常用对象API(集合框架-HashSet集合)

 Set:元素不可以重复,是无序。

Set接口中的方法和Collection一致。子类中HashSetTreeSet比较常用。

HashSet:内部数据结构是哈希表,是不同步到。

package cn.itcast.p4hashset.demo;
import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo {

	public static void main(String[] args) {
		HashSet hs=new HashSet();
		hs.add("hahah");
		hs.add("xixi");
		hs.add("hehe");
		hs.add("heihei");
		hs.add("hahah");//重复也没用,进不去
		Iterator it=hs.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}

}
/*hahah
heihei
xixi
hehe
不保证迭代顺序,所以输出就随机了。
*/

常用对象API(集合框架-哈希表)

根据元素自身的特点来算出它应该存放的位置(由算法来决定)。

经典算法:取模得角标。

哈希表是如何避免角标重复的呢?

若重复(哈希值一致,也就是hashCode一致),则再判断其内容(equals方法)。若哈希值不同的话,不需判断equals方法。提高了查询效率,但是不能重复。

常用对象API(集合框架-HashSet存储自定义对象)

package cn.itcast.p4hashset.demo;

import java.util.HashSet;
import java.util.Iterator;
import cn.itcast.p.bean.Person;
public class HashSetTest {

	public static void main(String[] args) {
		HashSet hs=new HashSet();//存元素的时候依赖于
		
		/*
		 * 往hashSet集合中存储Person对象。如果姓名和年纪相同,视为同一个人。视为相同元素。
		 * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。
		 */
		
		hs.add(new Person("lisi4",24));
		hs.add(new Person("lisi7",27));
		hs.add(new Person("lisi1",21));
		hs.add(new Person("lisi9",29));
		hs.add(new Person("lisi7",27));//增加一条,怎么也会打印出来呢???如果想不用window的哈希算法,自己写一个覆盖它的。  经过自己复写之后,现在保证了唯一性,就没有输出5个了,输出4个了。
		Iterator it=hs.iterator();
		while(it.hasNext())
		{
			Person p=(Person)it.next();
			System.out.println(p.getName()+"..."+p.getAge());
			/*输出无序lisi1...21
			lisi4...24
			lisi7...27
			lisi9...29
*/
		}
		

	}

}

常用对象API(集合框架-哈希表)

根据元素自身的特点来算出它应该存放的位置(由算法来决定)。

经典算法:取模得角标。

哈希表是如何避免角标重复的呢?

若重复(哈希值一致,也就是hashCode一致),则再判断其内容(equals方法)。若哈希值不同的话,不需判断equals方法。提高了查询效率,但是不能重复。

常用对象API(集合框架-HashSet存储自定义对象)

package cn.itcast.p4hashset.demo;

import java.util.HashSet;
import java.util.Iterator;
import cn.itcast.p.bean.Person;
public class HashSetTest {

	public static void main(String[] args) {
		HashSet hs=new HashSet();//存元素的时候依赖于
		
		/*
		 * 往hashSet集合中存储Person对象。如果姓名和年纪相同,视为同一个人。视为相同元素。
		 * 使用的元素的hashCode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。
		 */
		
		hs.add(new Person("lisi4",24));
		hs.add(new Person("lisi7",27));
		hs.add(new Person("lisi1",21));
		hs.add(new Person("lisi9",29));
		hs.add(new Person("lisi7",27));//增加一条,怎么也会打印出来呢???如果想不用window的哈希算法,自己写一个覆盖它的。  经过自己复写之后,现在保证了唯一性,就没有输出5个了,输出4个了。
		Iterator it=hs.iterator();
		while(it.hasNext())
		{
			Person p=(Person)it.next();
			System.out.println(p.getName()+"..."+p.getAge());
			/*输出无序lisi1...21
			lisi4...24
			lisi7...27
			lisi9...29
*/
		}
		

	}

}

常用对象API(集合框架-LinkedHashSet集合)

 HashSet hs=new HashSet();

无序可以变为有序

HashSet hs=new LinkedHashSet();//现在就变为有序了。保证唯一和有序。

TreeSet集合

常用对象API(集合框架-TreeSet集合)

可以对指定集合进行自然排序。是不同步的。

判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0就是相同元素,不存。

TreeSet对元素进行排序的方式之一:

让元素自身具备比较功能,就需要实现Comparable接口,覆盖compareTo方法。

(代码就略过了。)

 

二叉树的基础上(可以在有序的数字进行有序的折半可以提高二叉树的查找效率)

如何实现怎么存进去怎么取出来?

人工去修改下比较的返回值即可,因为我们是根据返回值来对其进行判断。返回值无非1-1,和0.我们只需要把他改成1即可,让二叉树存进去的数都依次向右下角排列,然后自然就会按原来的顺序输出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值