集合
1.1集合类的特点
提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。
1.2集合类体系结构
1.3Collection集合概述
- 是单例集合的顶层接口,它表示一组对象,这些对象也被称为Collection的元素
- JDK不提供此接口的直接实现,它提供更具体的子接口实现
- 以多态的方式创建Collection对象
1.4Collection集合常用方法
boolean add(E e); 添加元素
boolean remove(Object o); 从集合中移除指定元素
void clear();清空集合的元素
boolean contains(Object o);判读集合中是否存在指定的元素
boolean isEmpty();判断集合是否为空
int size(); 集合的长度,也就是集合中元素的个数
1.5Collection集合的遍历
Iterator<E> iterator(); 返回此集合中元素的迭代器,通过集合的iterator()方法得到
E next(); 返回迭代的下一个元素
boolean hasNext(); 如果迭代具有更多元素,则返回true
public class CollectionDemo02 {
public static void main(String[] args) {
Collection<String>collection = new ArrayList<>();
collection.add("12");
collection.add("34");
collection.add("156");
collection.add("177");
Iterator<String>iterator = collection.iterator();
while (iterator.hasNext())
{
String s = iterator.next();
System.out.println("s = " + s);
}
}
}
2.1List集合概述和特点
List集合概述
- 有序集合(也称为序列),用户可以控制每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
- 与Set集合不同,列表通常运行重复的元素
2.2List集合的方法
void add(int index,E element); 在此集合中的指定位置插入指定的元素
E element(int index); 删除指定索引处的元素,返回被删除的元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 返回指定索引处的元素
public class CollectionDemo04 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("Java");
list.add("Python");
System.out.println("list = " + list);
list.add(1,"sb")
System.out.println("list = " + list);
list.remove(1);
System.out.println("list = " + list);
System.out.println(list.set(1, "love"))
System.out.println("list = " + list);
System.out.println(list.get(3));
}
}
2.3List集合的遍历
Iterator<Student>iterator = list.iterator();
while (iterator.hasNext()){
Student s = iterator.next();
System.out.println(s.getName()+","+s.getAge());
}
for (int i = 0; i < list.size(); i++) {
Student s = list.get(i);
System.out.println(s.getName()+","+s.getAge());
}
2.4并发修改异常
ConcurrentModificationException
产生原因: 迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值与实际修改值不一致。
解决方案:用for循环遍历,然后用集合对象做对应的操作即可
//错误代码
Iterator<String>iterator = list.iterator();
while (iterator.hasNext())
{
if (iterator.next().equals("wolrd")){
list.add("23");
}
}
//修改后:
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if (s.equals("wolrd")){
list.add("23");
}
}
2.5ListIterator
ListIterator: 列表迭代器
- 通过List集合的ListIterator()方法得到,所以说它是List集合特有的迭代器
- 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
ListIterator中的常用方法
E next(); 返回迭代中的下一个元素
boolean hasNext(); 如果迭代具有更多元素,则返回true
E previous(); 返回列表中的上一个元素
boolean hasPrevious(); 如果此列表迭代器在相反遍历列表时具有更多元素,则返回true
void add(E e): 将指定的元素插入列表 -------------> 可用来解决并发修改异常
ListIterator<String>listIterator = list.listIterator();
while (listIterator.hasNext())
{
if (listIterator.next().equals("hello"))
listIterator.add("are");
}
System.out.println(list);
2.6LinkedList的特有方法
public void addFirst(E e); 在该列表开头插入指定的元素
public void addLast(E e); 将指定的元素追加到此列表的末尾
public E getFirst(); 返回此列表的第一个元素
public E getLast(); 返回此列表的最后一个元素
public E removeFirst(); 从此列表删除并返回第一个元素
public E removeLast(); 从此列表中删除并返回最后一个元素
3.1Set集合的特点
不包含重复元素的集合
没有带索引的方法,所以不能使用普通for循环遍历
HashSet: 对集合的迭代顺序不作任何保证
public class SetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("hello");
set.add("world");
set.add("javaee");
//1.增强for循环遍历
for (String s : set) {
System.out.println("s = " + s);
}
//2.迭代器遍历
Iterator<String>iterator = set.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
哈希值
哈希值: 时jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
Obejct类中有一个方法可以获取对象的哈希值
public int hashCode();
对象哈希值特点:
- 同一个对象多次调用hashCode()方法返回的哈希值相同
- 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以让不同对象的哈希值相同
3.2HashSet集合特点
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以是不包含重复元素的集合
public class HashSet01 {
public static void main(String[] args) {
HashSet<String>hashSet = new HashSet<>();
hashSet.add("hello");
hashSet.add("hello");
hashSet.add("world");
hashSet.add("javaee"