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方式。