Java集合

一、 集合的遍历方式

1. 将集合转换为数组遍历(了解)

2. 增强for遍历

3. 迭代器遍历

代码:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test01 {
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("a");
        collection.add("b");
        collection.add("c");
        collection.add("d");

        System.out.println("==========转换为数组遍历=========");
        Object[] array = collection.toArray();
        for (int i = 0; i < array.length; i++) {
            System.out.print((String)array[i]+"\t");
        }

        System.out.println();
        System.out.println("========增强for遍历===========");
        for (String s : collection) {
            System.out.print(s+"\t");
        }

        System.out.println();

        System.out.println("==========迭代器遍历===========");
        Iterator<String> it = collection.iterator();
        while (it.hasNext()){
            String next = it.next();
            System.out.print(next+"\t");
        }

        System.out.println();
        System.out.println("==========lambda表达式遍历==========");
        collection.forEach(item-> System.out.print(item+"\t"));

    }
}

二、 List

2.1 简介

1.特点:
   A.有序的 有索引 存取顺序一致   
   B.允许重复的元素  不唯一
   C.集合中可以有空的元素
2.List 集合是一个接口  实现类 ArrayList 与 LinkedList

2.2 常用的方法

方法的名称方法的描述
void add(int index, E element) 增在列表的指定位置插入指定元素
E get(int index) 查返回列表中指定位置的元素
E remove(int index)删移除列表中指定位置的元素
E set(int index, E element)改用指定元素替换列表中指定位置的元素

代码:

import java.util.ArrayList;
import java.util.List;

public class Test01 {
    public static void main(String[] args) {
        //实例化一个集合
        List  li  = new ArrayList();
        li.add("迪丽热巴");
        li.add("古力娜扎");
        li.add("杨幂");
        li.add("波多老师");
        System.out.println(li);
        li.add(0,"林志玲");
        System.out.println(li);
        li.remove(3);
        System.out.println(li);
        //修改
        li.set(0,"小野老师");
        System.out.println(li);
//        li.set(100,"哈哈哈");
        System.out.println(li.get(3));

    }
}

2.3 List集合的循环

List有索引下标,也提供了一些带索引的方法 可以使用普通的for循环

2.4 迭代器 ListIterator

方法的名称方法的描述
E previous()返回的上一个元素
boolean hasPrevious()判断是否有上一个元素
void add(E e)将指定的元素插入列表
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Test03 {
    public static void main(String[] args) {
        List  li  = new ArrayList();
        //添加元素
        li.add("周杰伦");
        li.add("薛之谦");
        li.add("许嵩");
        li.add("凤凰传奇");
        //转换我迭代器
        ListIterator iter = li.listIterator();
        //使用循环将指针移动最后一位
        while (iter.hasNext()){
               iter.next();
        }
        //使用while循环
        while (iter.hasPrevious()){
            System.out.println(iter.previous());
        }
    }
}

2.5 ConcurrentModificationException-并发修改异常

1.原因:使用迭代器遍历的集合 使用集合添加数据 集合在修改的数据之后 迭代器并不知道集合修改数据 产生并发异常
2.解决:
    A.使用迭代器遍历 迭代器添加数据
    B.使用传统的遍历方法 使用集合添加数据

问题代码:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test04 {
    public static void main(String[] args) {
        List li  = new ArrayList();
        li.add("宋小宝");
        li.add("贾玲");
        li.add("沈腾");
        li.add("张小斐");
        //使用迭代器进行遍历
        Iterator iter = li.iterator();
        while (iter.hasNext()) {
            String s = (String) iter.next();
            if (s.equals("沈腾")){
                li.add("马冬梅");
            }
        }
        System.out.println(li);

    }
}

解决代码-01:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Test05 {
    public static void main(String[] args) {
        List li  = new ArrayList();
        li.add("宋小宝");
        li.add("贾玲");
        li.add("沈腾");
        li.add("张小斐");
        //使用迭代器遍历  使用迭代器增加元素
        ListIterator iter = li.listIterator();
        //使用循环遍历
        while (iter.hasNext()) {
            String s = (String) iter.next();
            if (s.equals("沈腾")){
                iter.add("马冬梅");
            }
        }
        System.out.println(li);

    }
}

解决代码-02

import java.util.ArrayList;
import java.util.List;

public class Test06 {
    public static void main(String[] args) {
        List li  = new ArrayList();
        li.add("宋小宝");
        li.add("贾玲");
        li.add("沈腾");
        li.add("张小斐");
        //使用普通for循环

        for (int i=0;i<li.size();i++){
           String s = (String) li.get(i);
           if (s.equals("沈腾")){
               li.add("马冬梅");
           }
        }
        System.out.println(li);
    }
}

三、 ArrayList

3.1简介

  1. ArrayList是List接口的实现类 都是使用父类的方法
  2. ArrayList 底层数组初始化的容器是10 (自动扩容1.5倍)
  3. 特点
    • 数组的方式进行存储
    • 此实现不是同步的 多线程不安全 效率高
    • 数组存储的数据结构的特点: 查询快 增删慢

3.2 主要方法

size()、isEmpty()、get()、set()、iterator() 和 listIterator()

四、 LinkedList

4.1 简介

  1. LinkedList是List接口的实现类 提供了一个对头与尾操作的方法
  2. 特点:
    • 数据结构: 以链表的方式进行存储 特点: 增加、删除快 查询慢
    • 此实现不是同步的 在多线程中是不安全的

4.2 常用的方法

方法的名称方法的描述
public void addFirst(E e)将指定元素插入此列表的开头
public void addLast(E e)指定元素添加到此列表的结尾
public E removeFirst()移除并返回此列表的第一个元素
public E removeLast()移除并返回此列表的最后一个元素
public E getFirst()返回此列表的第一个元素
public E getLast()返回此列表的最后一个元素

五、Set

5.1 简介

  1. Set集合是Collection集合的子接口
  2. 特点:
    A. 无序 存取的顺序不一致,没有索引
    B.唯一 不重复

5.2 set集合的遍历方式

  1. 使用增强for循环遍历
  2. 使用迭代器iterator遍历

六、 HashSet

6.1 简介

1.特点:
A.此类实现 Set 接口 Set接口的实现类
B.数据结构是有Hash表结构进行存储
C.此实现不是同步的 在多线程中是不安全
D.默认初始容量是16

  • HashSet 是无序不允许元素重复的集合。它是由HashMap实现的,数据结构与HashMap相同。

  • 不能是用hashcode值来判断是否是同一个对象 因为引用数据类型 一般都会重写hashcode方法

  • 如果要把一个对象存入HashSet中,要重写该对象对应类的hashCode()方法和重写其equals()方法。

  • hashCode值是根据内存地址生成的一个十进制的整数 不能根据hashcode值来表示是内存地址值

  • Object中提供了一个方法
    public int hashCode() ==>返回该对象的哈希码值

  • 注意点:字符串重存在的hash冲突: 内容不同 但是hashcode值的相同

数据结构:JDK1.7 数组+链表

​ Jdk 1.8 数组+链表+红黑树(当链表长度大于8转化为红黑树)

七、 TreeSet

7.1 简介

1.特点:
A.元素的自然顺序对元素进行排序
B.Comparable 或 Comparator 提供这个两个类来定义比较规则
C.此实现不是同步的 在多线程中是不安全
2.排序规则:
A.数值类型是按照升序(从小到大)进行排列
B.字符串类型是按照字符串首字母的ascll来进行排序
C.自定义的引用数据类型 直接添加集合中会报错 没有确定其比较的规则
3.引用数据类型的比较
A.定义类中能够实现(Comparable )这个接口
this > object 返回是整数 按照升序进行排序
this = object 返回是0 表示是相同
this < object 返回的是负数 按照降序进行排序
B.实例化集合的手传递比较的规则(Comparator)

TreeSet是一个有序集合,是基于TreeMap实现的,非线程安全

八、LinkedHashSet

1.特点:
A.具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现
B.数据结构 hash表+双链表 有序、不重复
C.此实现不是同步的 多线程中不安全的

数据结构:哈希表 + 链表

九、Map

Map是由键值对组成的集合,一个key对应一个vlaue , 不能存在相同的key值,但是可以存在相同的 value 值

9.1 map集合的遍历方式

  1. 先获取所有的键,再通过键取value值
  2. 将键值对封装成对象,再通过对象调用方法取值: entry.getKey()、entry.getValue()
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/*
map集合的两种遍历方式
 */
public class Demo02 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("a","张杰");
        map.put("b","谢娜");
        map.put("c","周星驰");
        map.put("d","刘德华");
        map.put("e","刘德华");

        //方式一
        Set set = map.keySet();
        for (Object o : set) {
            System.out.println(o+"\t"+map.get(o));
        }

        System.out.println("================");

        //方式二
        Set set1 = map.entrySet();
        for (Object o : set1) {
            Map.Entry entry = (Map.Entry) o;
            System.out.println(entry.getKey()+"\t"+entry.getValue());
        }
    }
}

9.2 HashMap

9.2.1简介

特点:
A.数据结构基于哈希表
B.并允许使用 null 值和 null 键
C.此实现不是同步的 在多线程中是不安全
D.默认初始化容量是16

9.2.2 HashMap与HashSet比较

相同点: 都是以hash表结构来进行存储
不同点:
A.HashMap 数据结构只针对与键 HashSet的数据结构针对于是元素
B.HashSet集合的底层也是使用HashMap来进行存储 只能用于HashMap键的数据结构

9.3 LinkedHashMap

9.3.1 简介

A.Map 接口的哈希表和链接列表实现 数据结构 hash表结构 与链表进行存储
B.具有可预知的迭代顺序
C.此实现不是同步的 多线程中是不安全的

9.4 TreeMap

TreeMap 是一个有序的集合,非同步,基于红黑树实现,每一个key-value节点作为红黑树的一个节点。TreeMap存储时会根据key进行排序,其中排序方式分为两种,一种是自然排序,一种是定制排序。
自然排序:TreeMap中所有的key必须实现Comparable接口,并且所有的key都应该是同一个类的对象,否则会报ClassCastException异常。
定制排序:定义TreeMap时,创建一个comparator对象,该对象对所有的treeMap中所有的key值进行排序,采用定制排序的时候不需要TreeMap中所有的key必须实现Comparable接口。如果使用自定义的类来作为TreeMap中的key值,且想让TreeMap能够良好的工作,则必须重写自定义类中的equals()方法,TreeMap中判断相等的标准是:两个key通过equals()方法返回为true,并且通过compareTo()方法比较应该返回为0。


十、 泛型

10.1概念

1.使用的场景:定义的集合的时候 不确定其数据数据类型 就可以使用泛型
泛型可以理解为是一个变量 变量用于接收数据类型
2.泛型的使用
在实例化对象的时候可以确定其数据类型
例子:List<数据类型> li = new ArrayList<数据类型>();
注意点:
A.前后的泛型必须是一致
B.在jdk1.7之后出现了菱形的泛型 后面的泛型数据类型可以不写
C.泛型只能使用引用数据类型 不能使用基本数据类型
3.好处:
A.避免进行强制类型转换
B.将运行时的错误提前编译期间
4.泛型使用的符号
一般泛型使用的符号都是大写的符号…任意的大写字母都是可以的
E V K W T Z …

10.2 定义泛型类
1.语法:
   访问修饰符 class  类名<泛型> {
       类中的所有的成员都可以使用其泛型
   }
2.例子:public class ArrayList<E>{}
10.3 定义泛型方法
1.语法:
  访问修饰符 <泛型> 返回值类型  方法的名称(参数列表) {
        方法体
        return 返回值
  }
2.说明:可以给普通方法加泛型 也可以给静态的方法加泛型
3.注意点:
    A.普通的成员方法是可以使用类定义的泛型
    B.静态方法不能使用类的泛型  因为静态资源优先进行加载
10.4 定义泛型接口
1.体现:A.实现类确定其泛型 B.实现类不确定其泛型
2.例子:实现类确定其泛型
    public interface Iterator<E>{
        E next()
    }
    public final class Scanner implements Iterator<String>{
        public String next()
    }
3.例子:实现类也不确定其泛型
   public interface List<E>{
       boolean add(E e)
   }
  public class ArrayList<E> implements List<E>{
    public boolean add(E e)
  
  }
10.5 泛型通配符
1.概念:泛型通配符可以表示任意的数据类型 泛型的统配符号使用 ?来表示  
      泛型通配符一般作为方法的参数使用 实例化集合对象的时候不能使用通配符表示  泛型是没有继承的概念
2.解释特殊的通配符
    <? extends E>  E本身或者是其子类
    <? super T>    T本身或者是其父类

十一、Collections

方法名称方法的描述
public static int binarySearch(List<? extends Comparable<? super T>> list, T key)查找指定元素在集合中的索引值(集合需要按照升序进行排列)
public static void copy(List<? super T> dest, List<? extends T> src)将所有元素从一个列表复制到另一个列表
public static int frequency(Collection<?> c, Object o)返回指定 collection 中等于指定对象的元素数
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)集合中的最大值
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)获取集合中最小值
public static void reverse(List<?> list)反转指定列表中元素的顺序
public static void shuffle(List<?> list)使用默认随机源对指定列表进行置换
public static <T extends Comparable<? super T>> void sort(List list)按照升序进行排列
public static void swap(List<?> list, int i, int j)交换集合中指定索引的元素

案例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test01 {
    public static void main(String[] args) {
        List<Integer> list  = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
        System.out.println(Collections.binarySearch(list,7));
        List<Integer> list01 = new ArrayList<>();
        list01.add(8);
        list01.add(8);
        list01.add(8);
        list01.add(8);
        list01.add(8);
        list01.add(8);
        Collections.copy(list01,list);
        System.out.println(list);
        System.out.println(list01);
        Collections.fill(list01,10);
        System.out.println(list01);
        int count = Collections.frequency(list01, 10);
        System.out.println(count);
        System.out.println(Collections.max(list));
        System.out.println(Collections.min(list));
        Collections.reverse(list);
        System.out.println(list);
        Collections.shuffle(list);
        System.out.println(list);
        Collections.sort(list);
        System.out.println(list);
        Collections.swap(list,0,1);
        System.out.println(list);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值