Java集合类

一.ArrayList

1. ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型的对象.

2.如果增加的元素个数超过了10个,那么ArrayList底层生成一个新的数组,长度为原长度的1.5倍加1,然后将原数组的内容拷贝到新的数组中,并且将新增加的内容存放到新的数组中.

3.对于ArrayList的删除操作,要将被删除元素的后续元素逐个向前移动,代价比较高。

4.集合中只能放置对象的引用,无法放置原生数据类型,只能将原生数据类型的包装类对象的引用放入集合中(使用add()方法时要注意)。(Java中除8中原生数据类型不是对象外,其余都是对象)

5.集合中存放的是Object类型的数据,所以取的时候也是Object类型的,需将其强制转换成真正的类型,即存放时的类型(使用get()方法时要注意)。

6.  下面代码运行时会出错,原因:toArray转换成Object[]数组,但不知道所存放对象的具体类型,若是存放的对象中有String类,则会出错。

Integer[] integer = (Integer[])arrayList.toArray();
for (int i = 0; i < integer.length; i++)
{
System.out.println(integer[i].intValue());
}

二.LinkedList

1.ArrayList与LinkedList的比较:

a.ArrayList底层采用数组实现,LinkedList底层采用双向循环链表实现。

b.当执行插入或删除操作时,采用LinkedList;当执行查找时,采用ArrayList实现。

c.当向ArrayList添加一个对象时,实际上就是将该对象的引用放到了ArrayList底层所维护的数组中;当向LinkedList中添加对象时,实际上LinkedList内部会生成一个Entry对象,该Entry对象的结构为:

Entry

{

Entry previous;

Entry next;

Object element;

}

其中Object类型的元素element就是我们向LinkedList中放入的元素,previous指向它的前驱,next指向它的后继。换句话说LinkedList中维护的是一个个Entry对象。

三.hashSet

1.当使用hashSet的add()方法时,hashCode()方法就会被调用,判断已经存放在集合中的对象的hash code值是否与增加的对象的hash code值一致,如果不一致,则直接插入进去;如果一致,则调用equals()方法比较,如果equals()方法返回true,则表示该对像的引用已存在,不能插入进去;否则可以添加进去。

2.在实际开发中,经常根据类的某一属性作为是否能插入hashSet的依据,此时要同时重写hashCode()和equals()方法。

3.利用Iterator迭代器遍历hashSet:

a.调用Iterator()获得Iterator迭代器对象;

b.Iterator迭代器对象调用hasNext()方法判断是否还有下一个元素;

c.Iterator迭代器对象调用next()方法,获得下一个元素。

4.HashSet的底层是使用HashMap实现的,当使用add()方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map的key,而value都是同一个Object对象(该对象我们并不使用)。

四.TreeSet

1.由于TreeSet实现了SortedSet接口,调用TreeSet的add()方法时,如果没有自然排序规则,那么需自定义排序规则,实现Comparator接口的compare()方法。

2.集合类都可以使用Collections的静态方法定义自己的比较器。

五.HashMap

1.HashMap的键是唯一的,值是可以重复的。

2.values()方法返回值的Collection类型的集合,而keySet()方法返回键的Set类型的集合。

3.可以使用HashMap实现统计字符串数组中相同字符串的个数,方法是将字符串作为键,出现次数作为值。

public class MapTest4
{
public static void main(String[] args)
{
HashMap hashMap = new HashMap();
for (int i = 0; i < args.length; i++)
{
if (hashMap.get(args[i]) == null)
{
hashMap.put(args[i], new Integer(1));
} else {
Integer num = (Integer)hashMap.get(args[i]);
num = new Integer(num.intValue() + 1);
hashMap.put(args[i], num);
}
}
Set set = hashMap.keySet();
for(Iterator iterator = set.iterator(); iterator.hasNext();) {
String key = (String)iterator.next();
Integer value = (Integer)hashMap.get(key);
System.out.println(key + ":" + value);
}
}
}

4.可以使用Map的Map.Entry遍历Map

Set set = hashMap.entrySet();

for (Iterator iterator = set.iterator(); iterator.hasNext();)
{
Map.Entry entry = (Map.Entry)iterator.next();
String key = (String)entry.getKey();
String value = (String)entry.getValue();
}

六.泛型

1.所谓泛型就是变量类型的参数化,类和变量类型一起作为判断是否为同一类型的依据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值