单列集合

单列集合

List集合

有序,带索引,可存储重复元素的单列集合

tips:在操作索引时,要防止索引越界异常

  • 索引特有方法:

    • public void add(int index, E element): 将指定的元素,添加到该集合中的指定位置上。
    • public E get(int index):返回集合中指定位置的元素。
    • public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
    • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回的是更新前的元素。
  • 遍历方法

    • 普通for循环

      for(int i=0;i<list.size();i++){
      String s = list.get(i);
      System.out.println(s);
      }
      
    • 迭代器遍历

      Iterator<String> it = list.iterator();
      while(it.hasNext){
      String s = it.next();
      System.out.println(s);
      }
      
    • 增强for循环

      for(String s : list){
      System.out.println(s);
      }
      

List接口的实现类

  • ArrayList集合

    List接口的大小可变数组实现(多线程),元素增删慢,查询快

  • LinkedList集合

    List接口的链表实现(多线程),元素查询慢,增删快;包含许多操作首尾元素的方法

    特有方法

    • public void addFirst(E e):将指定元素插入此列表的开头。
    • public void addLast(E e):将指定元素添加到此列表的结尾。
    • public E getFirst():返回此列表的第一个元素。
    • public E getLast():返回此列表的最后一个元素。
    • public E removeFirst():移除并返回此列表的第一个元素。
    • public E removeLast():移除并返回此列表的最后一个元素。
    • public E pop():从此列表所表示的堆栈处弹出一个元素。
    • public void push(E e):将元素推入此列表所表示的堆栈。
    • public boolean isEmpty():如果列表不包含元素,则返回true。
  • Vector集合

    Vector类实现可增长的对象数组(单线程),

Set接口的实现类

Set接口继承自Collection接口,并未对其进行功能上的扩充,而是比Collection接口更严格;与List接口不同的是,Set接口中元素无序且以某种规则保证存储的元素不重复

  • HashSet集合

    由哈希表支持实现Set接口(多线程),故查询速度极快,不允许存储重复元素,无索引即是一个无序集合,不能使用普通for循环,存取元素的顺序可能不一致

    • 哈希值

      Object类中的hashCode()方法返回对象的哈希码值,该值由操作系统给出,返回的是对象的内存地址经过处理后的结构。

      String类重写了Object类的hashCode方法,根据String类包含的字符串内容经过特殊算法计算返回哈希码,只要字符串内容相同返回的哈希码也相同

    • 哈希表

      JDK1.8前:哈希表=数组+链表

      JDK1.8后:哈希表=数组+链表;哈希表=数组+红黑树(提高查询速度)

      数据结构

      将元素进行分组,相同哈希值的元素为一组,哈希值构成链表,JDK1.8之后,若链表的长度超过8位,链表则会转换为红黑树从而提高查询的速度。

  • 无重复元素实现

         Set集合在调用add方法时,会先调用存储元素的hashCode方法,查找集合中有无该元素的哈希值,没有则存储到集合,若有(哈希  冲突)则调用元素的equals方法,判断两个元素是否相同,equals方法返回true则认为两个元素相同,不存储到集合,反之返回false则存储到集合
    
  • HashSet存储自定义类型元素

    若要实现存储自定义的相同对象元素,必须在对象类中重写hashCode与equals方法

  • LinkedHashSet集合

    继承自HashSet集合具有可预知迭代顺序的Set接口的哈希表与链表列表实现,与HashSet的不同在于LinkedHashSet维护这一个定义了所有条目迭代顺序的双重链接列表;即按照将元素插入到Set集合中的顺序进行迭代。有序但仍不能存储重复元素

    • 数据结构

      哈希表(数组+链表/红黑树)+链表(记录元素的存储顺序)

  • 可变参数

    JDK1.5之后,对于需要多个相同数据类型参数的方法定义,可将其简化使用可变参数

    修饰符 返回值类型 方法名(参数类型... 形参名){  }
    

    使用可变参数的方法在调用时可直接传递数据而非传递数组,编译时会自动封装为一个数组

    例:

    调用:
    int sun = getSum(1,2,3,4,5,6)
    定义:
    public static int getSum(int... arr){
    int sum = 0;
    for(int a : arr){
    sum +=a;
    }
    return sum;
    }
    

Collections集合工具类

  • public static <T> boolean addAll(Collection集合对象,元素列表):往集合中添加一些元素。
  • public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
  • public static <T> void sort(List<T> list):将集合中元素按照默认规则升序排序。
  • public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

例:

public class CollectionsDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        //list.add(12);
        //list.add(14);
        //list.add(15);
        //list.add(1000);
        //采用工具类 完成 往集合中添加元素  
        Collections.addAll(list, 5, 222, 12);//静态方法通过类名直接调用
        System.out.println(list);
        //排序方法 
        Collections.sort(list);
        System.out.println(list);
    }
}
结果:
[5, 222, 1, 2]
[1, 2, 5, 222]

tips:Sort默认规则排序,自定义类型元素类必须实现Comparable接口,重写compareTo方法

Sort规则排序

sort的匿名内部类实现Comparator接口

public class CollectionsDemo3 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("cba");
        list.add("aba");
        list.add("sba");
        list.add("nba");
        //排序方法  按照第一个单词的降序
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) - o1.charAt(0);
            }
        });
        System.out.println(list);
    }
}

两个对象比较的结果有三种:大于,等于,小于。

如果要按照升序排序,
则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)
如果要按照降序排序
则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值