List接口:
子接口
--> Vetor集合(数组结构,单线程),ArrayList集合(数组结构:查询快,增删慢),LinkLIst集合(链表结构:查询慢,增删快)
特点:
1.有序的集合(存储和取出元素顺序相同)
2.允许存储重复的元素
3.有索引,可以使用普通的for循环遍历
特有方法:
1、add(int index, Object obj)
在指定索引上,添加元素
2、remove(int index)
删除指定索引上的元素
3、set(int index, Object obj)
将索引为index的位置,修改为obj值
4、get(int index)
获取索引为index的值
LinkLIst特有方法:
addFirst(Object obj)
addLast(Object obj)
removeFirst()
removeLast()
getFirst()
getLast()
三种遍历方式:
for (int i=0;i<list.size();i++){
String s = list.get(i);
System.out.println(s);
}
Iterator<String> it = list.iterator();
//多态 获取迭代器的实现类对象,并且把指针指向集合的-1索引
while(it.hasNext()){
String e = it.next();
System.out.println(e);
}
for(String s : list){
System.out.println(s);
}//IDEA快捷键 list.for
Set集合
Set集合:子接口: --〉TreeSet集合,HashSet集合(哈希表结构:查询快)
1.不允许有存储重复的集合
2.没有索引(不能使用普通的for循环遍历)
3.无序的集合(存储和取出元素的顺序有可能不一致)
HashSet集合
jdk1.8之前:哈希表=数组+链表(如果链表的长度超过8位,就会把链表转为红黑树,提高查询效率)
jdk1.8之后:数组+红黑树(提高查询效率)
数据结构:把元素进行分组(相同哈希值的元素一组)
链表/红黑树:把相同哈希值的元素连接到一起
set集合报错元素唯一:
存储的元素(String,Integer,Person,Student),必须重写hashCode和equals方法
LinkedHashSet //有序,不允许重复
public class LinkedHashSet<E> extends HashSet<E> implements Set<E>
特点:
底层是一个哈希表(数组+链表/红黑树);多了一条链表(记录元素的存储顺序),保证元素有序
两种遍历方式:
1.iterator迭代器,
2.增强for,
3.转成数组:toArray(),不带泛型的得转数组,得到的是Object类型的数组
4.转成数组:toArray(T[] arr),带泛型的数组,得到的是T类型的数组
数组遍历:
String[] arr = new String[set.size()];
set.toArray(arr);//返回字符串数组
System.out.println(Arrays.toString(arr));
哈希值: 是一个十进制的整数,
由系统随机给出(就是对象的地址,是一个逻辑地址,是模拟出来的地址,不是数据实际存储的物理地址)
在Object类中有一个方法,可以获取对象的哈希值
int hashCode()返回该对象的哈希值
hashCode方法源码:
public native int hashCode();
native: 代表该方法调用的是本地操作系统的方法
toString方法源码:
return getClass().getName()+"@"+Integer.toHexString(hashCode());
String哈希值
String类重写了Object类的hashCode方法
String s1 = new String("abc");//96354
String s2 = new String("abc");//96354
System.out.println("重地".hashCode());//1179395
System.out.println("通话".hashCode());//1179395
java.util.Iterator接口
java.util.Iterator接口:迭代器 有泛型 迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
两个常用方法
boolean hasNext() 如果仍有元素可以迭代,则返回true
E next()返回迭代的下一个元素,取出集合中的下一个元素,并使指针向后移动一位
remove():删除迭代器对象正在迭代的那个对象
Trerator迭代器,是一个接口,我们无法直接使用,需要使用Irerator接口的实现类对象,获取方式比较特殊
Connection接口有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
Iterator<E> iterator():返回Collection 的元素上进行迭代器
Iterator<String> it = coll.iterator();多态 获取迭代器的实现类对象,并且把指针指向集合的-1索引
while(it.hasNext()){
String e = it.next();
System.out.println(e);
}
for(Iterator<String> it = coll.iterator().it.hasNext()){
String e = it.next();
System.out.println(e);
}
并发修改异常
1、ConcurrentModificationException
并发 修改 异常
2、原因:
在使用迭代器遍历集合的同时,使用了集合对象对集合元素进行增删
3、解决方式:只能针对List解决
1、集合遍历,集合增删:只能针对List解决
集合遍历:List的特有遍历方式
集合增删:add、remove
2、迭代器遍历,迭代器增删:只能针对List解决
迭代器遍历:获取迭代器,使用迭代器的hashNext和next方法遍历即可
迭代器删除:迭代器中有一个remove,可以删除当前迭代的元素
迭代器增加:迭代器中没有增加的方法,只能获取一个特殊的迭代器
4、列表迭代器:
1、ListIterator:List接口特有的迭代器所实现的接口
2、列表迭代器的获取:
在List集合中,有一个特有方法,listIterator()
3、使用:
add(Object obj)
在当迭代的位置,添加元素
hasPrevious()
判断是否有上一个元素
previous()
获取上一个元素
set(Object obj)
将当前迭代的位置,替换为obj元素
可变参数:是JDK1.5之后出现的新特性
注意事项:
1.一个方法的参数列表,只能有一个可变列表
public static void method(int...a,String...b){}//出错
2.如果方法的参数有多个,那么可变参数必须写在参数列表末尾
public static void method(String b,double c,int...a){}
可变参数的特殊写法:
public static void methid(Object...obj){}
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数。
使用格式:定义方法时使用
修饰符 返回值类型方法名(数据类型...变量名){}
可变参数的原理
可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数传递的参数个数,可以是个0个(不传递),1,2...多个
增强for循环
增强for循环;内部原理和Iterator一致,是JDK1.5之后的特性 目标只能是Collection和数组
Collection<E> extens Iterator<E>: 所有的单列集合都可以使用增强for.
public interface Iterable<T>:实现这个楼口允许对象成为 "foreach" 语句的目标。
增强for循环:用来遍历集合数组格式:
格式:
for(集合/数组的数据类型 变量名:集含名/数姐名){
sout(变量名);
}