java泛型是伪泛型因为编译成功后的class文件是没有泛型的
泛型的好处:安全、将错误由编译时期提前到了运行时期
集合框架之List接口:
List接口特点:有序、索引、可以重复元素
实现类ArrayList,LinkedList
List接口特有的方法,即带有索引的功能
add():在指定的索引添加数据,注意越界异常
remove():移除指定索引上的元素,同时返回被删除前的元素
set():修改指定索引上的元素
迭代器的并发异常:
在遍历的过程中,使用了集合方法修改了集合的长度,这是不允许的,因为在List遍历的过程中,指针是一直向前移动的,遍历过程中不可能因为添加了元素而使指针回退重新遍历,这是不可能的!!!
如下案例:
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
if(s.equals("abc3")){
list.add("ABC3");
}
System.out.println(s);
}
}
注意,最后会引起Exception in thread “main” java.util.ConcurrentModificationException,并发修改异常
该程序是错误的操作
数据的存储结构:
堆栈:先进后出,如子弹压入弹夹
队列:先进先出,如安检
数组:特点查找元素快,增删元素慢(慢的原因是数组是定长的)
链表:多节点之间采用地址进行连接,查找速度慢,增删速度快
ArrayList特点:查找元素快,增删元素慢
LinkedList:增删速度快,查询慢,LinkedList集合数据存储的结构是链表结构,所以他提供了大量的首尾操作的方法
LinkedList特有的方法:
addFirst()添加到链表的开头
addLast()添加到链表的结尾
removeFirst
removeLast
Vector类已经被ArrayList取代了,已经没用了
Set接口:不允许存储重复对象,没索引
实现类:HashSet(哈希表)
特点,无序集合,没有索引
存储取出都比较快
线程不安全,运行速度比较快
数组长度达到12的时候就需要对数组扩容
String类继承Object类,重写了父类的方法hashCode
LinkedHashSet基于链表的哈希表实现
继承自HashSet
LinkedHashSet具有顺序,存储和取出顺序相同的
线程不安全的集合,运行速度比较快
问题:
1、如果两个对象的哈希值相同p1.hashCode()==p2.hashCode()
两个对象的equals一定返回true吗?p1.equals(p1)
答案是不一定
2、如果两个对象的equals方法返回true,p1.equals(p2)==true
两个对象的哈希值一定相同吗?
答案是一定的