黑马程序员---java学习笔记之集合

1、集合和数组同时容器,有什么不同呢?

        a):数组是固定长度的,也就是只能开辟几个数据空间,就只能存几个数据,而集合是可变长度的;

        b)数组可以存储基本数据类型的数据,也可以存储对象,但集合只能存储对象。

        c):数组只能存储同一类型的数据,而集合可以存储不同类型的数据(对象).

2、下面是两种迭代器形式的输出

ArrayList al = new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		
		//迭代器的while形式
		Iterator it = al.iterator();
		while( it.hasNext() )
		{
			System.out.println(it.next());
		}
		
		//迭代器的for形式
		for( Iterator it1 = al.iterator(); it1.hasNext(); )
			System.out.println(it1.next());
第二种迭代器形式有一种好处就是,当for语句执行结束后迭代器对象引用和实体就会被回收,内存上就会占用的少一些。

3、List:元素是有序的,可以重复;Set:元素时无序的,不可以重复。

4、看一段代码:

ArrayList al = new ArrayList();
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		
		System.out.println(al);
运行结果为:

[java01, java02, java03, java04]

我很奇怪,结果为什么会是这样的。分析一下,输出语句调用的肯定是PrintStream类中的println(Object obj)方法,一般情况下,该方法会调用Object类中的toString方法,但是如果真的是调用这个方法的话,输出的结果应该是这种形式:getClass().getName()+"@"+Integer.tHexString(hashCode())。但是结果却是ArrayList中的元素内容,所以该toString方法一定被重写了,经查证该toString方法,被ArrayList的父类的父类AbstractCollection的toString方法所重写。

5、操作集合中的元素,你可以使用集合的方式,也可以使用迭代器的方式。两种方式不能同时对集合元素进行操作,因为会发生并发访问异常。

6、List的三个实现类

        a):ArrayList底层的数据结构是数组结构,查询速度快,但是插入删除比较慢。线程不同步。

        b):LinkList底层数据结构是链表结构,查询速度慢,但插入删除效率较高。线程不同步。

        c):Vector底层也是数组结构,线程同步。ArrayList较Vector的优点是,Vector无论是查询还是插入删除都较慢,并且当数组结构不够用时,ArrayList每次开辟现有数组长度50%的空间,而Vector要开辟100%的空间,比较地浪费。

7、下面给出Vector的枚举操作元素的方式

Vector v = new Vector();
		v.add("abc");
		v.add("123");
		v.add("efg");
		v.add("456");
		
		Enumeration en = v.elements();
		
		while( en.hasMoreElements() )
		{
			System.out.println(en.nextElement());
		}

8、LinkedList类中的getFirst(),getLast(),removeFirst(),removeLast()在没有找到相关元素时,会抛出NosuchElementException的异常;

jdk1.6之后,该类中出现了offerFirst(),offerLast(),pollFirst(),pollLast()方法,在没有找到相关元素时,只会返回null而不会抛出异常。

9、基于链表制作的队列容器

import java.util.LinkedList;

class Queue
{
	//制作一个基于链表的队列容器
	private LinkedList link;
	public Queue()
	{
		link = new LinkedList();
	}
	public void queueIn(Object obj)
	{
		link.addLast(obj);
	}
	public Object queueOut()
	{
		return link.removeFirst();
	}
	public boolean isEmpty()
	{
		return link.isEmpty();
	}
}

public class QueueDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Queue q = new Queue();
		q.queueIn("abc");
		q.queueIn("123");
		q.queueIn("def");
		q.queueIn("456");
		
		System.out.println(q.queueOut());
	}

}
9、ArrayList中取出重复元素的代码

		ArrayList a1= new ArrayList();
		a1.add("abc");
		a1.add("cde");
		a1.add("abc");
		a1.add("123");
		a1.add("123");
		
		ArrayList a2 = new ArrayList();
		for( int i = 0; i < a1.size(); i++ )
		{
			Object obj = a1.get(i);
			if( !a2.contains(obj) )
				a2.add(obj);
		}
		System.out.println(a2);
				
10、使用迭代器Iterator时注意,每进行了一次hasNext()方法判定,就只能调用一次next()的值。

11、List中比较两个元素是否相同,底层调用的是equals方法。

12、集合中所谓的元素有序还是无序是这样的,元素怎么存进去的你还能怎么取出来,这样的集合结构是有序的,而元素怎么存进去却不一定还能按那样的顺序取出来,这样的集合结构是无序的。

13、set集合只有一种遍历方法,就是迭代器的方式

14、最近才发现,java中的链表集合也是有角标的,原来以为只有ArrayList才有角标。

15、set集合中的自定义类元素,需要比较两元素是否相等,底层会调用hashCode()和equals方法,可能需要你在该定义类中重写hashCode和equals方法。

16、集合中判断两个元素是否相同的总结:

        ArrayList依靠的是equals方法,HashSet依靠的是hashCode方法和equals方法。

17、TreeSet集合中存入的元素对象需要具备可比性,如果该元素是自定义的,那么我们需要使该对象实现接口Comparable,重写该接口的CompareTo()方法。

18、几种集合的元素比较:

        a):ArrayList以及LinkedList集合中元素比较,底层调用的是equals方法。集合元素为自定义类对象时,如果不重写equals方法,调用的就是Object类的equals方法。

        b):HashSet集合中元素的比较,底层调用的先是hashCode方法,如果hashCode值相同,之后再调用equals方法。集合元素为自定义类对象时,如果不重写equals方法和hashCode方法,调用的就是Object类的hashCode方法和equals方法。

        c):TreeSet集合中的元素比较时,一种方式是,元素的类需要继承接口Comparable,重写该接口的CompareTo方法。另一种方式是,利用比较器comparator,使集合本身具备比较性。创建一个类实现Comparator接口,重写它的compare方法。第二种方式应用于元素的类本身不具备比较性,或者具备比较性但是比较的原理不是我们所需要的情况下。当Comparable的方式和Comparator方式都存在时,程序使用的是comparator方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值