Java学习笔记_04

list接口

List集合特点

  • 1.有序
  • 2.有索引
  • 3.可以重复元素

基本用法

package cn.itcast.demo05;

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

/*
    List集合特点
    1.有序 2.有索引 3.可以重复元素
    实现类:Arrylist,Linkedlist
 */
public class ListDemo {

    public static void main(String[] args) {
        function();
        function1();
    }

    /*
        boolean add(E e)
        向列表尾部添加
        void add(ind index,E)
        向指定索引添加
        注意越界异常
    */

    /*
        E remove(int index)
        删除指定索引的元素,返回指定索引的元素
        boolean remove(Object o)
        从列表中移除第一次出现的指定元素
    */

    /*
        E set(int index,E)
        修改指定索引的元素,返回修改之前的元素
    */

    /*
        E get(int index)
        返回列表中指定列表的元素
    */
    
    public static void function() {
        List<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);
        // 在二号索引处插入
        list.add(2, "888");
        System.out.println(list);
    }

    public static void function1() {
        List<Double> list1 = new ArrayList<Double>();
        list1.add(1.1);
        list1.add(1.2);
        list1.add(1.3);
        System.out.println(list1);
        System.out.println(list1.set(1, 666.6));
        System.out.println(list1);
    }
}
迭代器并发修改异常

遍历过程中,使用了集合方法修改了集合长度,这是不允许的(可以改内容)

package cn.itcast.demo05;

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

public class ListDemo1 {
    /*
        迭代器并发的修改异常 ConcurrentModificationException
     */
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>;
        list.add("abc1");
        list.add("abc2");
        list.add("abc3");
        list.add("abc4");

        // 对集合使用迭代器获取,获取时判断有没有"abc3"对象
        // 如果有,就加一个元素"ABC3"

        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            if(s.equals("abc3")){
                list.add("ABC3"); // 增加了一个元素,并发修改异常
            }
            System.out.println(s);
        }
    }
}
list数据存储结构
  • 栈 先进后出
  • 队列 先进先出
  • 数组 查找速度快,增删元素慢(需要创建一个新的数组) 用的频率较高
  • 链表 上一个元素记住下一个元素的内存地址,多个节点间,通过地址连接 查找速度慢,增删元素快(不需要打乱原有结构)
ArrayList特点

本质上是一个可变的数组,默认长度是10,增删快,查询慢(线程不同步,线程不安全,速度慢)

LinkedLIst特点

有大量的首尾操作,查询慢,增删快

package cn.itcast.demo05;

import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] args) {
        function();
    }
    /*
        add()
        addFirst()
        addLast()
        E getFirst()
        E getLast()
        boolian isEmpty()
        E removeFirst()
        E removeLast()
     */

    private static void function() {
    	// 子类特有功能,不能使用多态调用
        LinkedList<String> link = new LinkedList<String>();
        link.add("aaa");
        link.add("bbb");
        link.add("ccc");
        link.addFirst("first");
        link.addLast("last");
        System.out.println(link.getFirst());
    }
}

补充:Vector的方法基本上和ArrayList一样,但是是线程安全的,速度慢,已经被弃用了

Set接口的特点

通过元素的equals方法,来判断是否为重复元素,它是一个不包含重复啊元素的集合。
Set 集合取出元素的方式可以采用:迭代器,增强for

注:集合分两大派系,connection和map。Set本质上依赖于map集合

package cn.itcast.demo05;

/*
    set接口,特点是不重复元素,没索引,无序
    Set接口的实现类,HashSet(哈希表)
    特点:无序集合,存储和取出顺序不同
    代码的编写上,和ArryList完全一致
 */

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetDemo {

    public static void main(String[] args) {
        Set<String> set = new HashSet<String>();
        set.add("aaa");
        set.add("bbb");
        set.add("ccc");

        // 用迭代器遍历
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());  // 输出的没有顺序
        }

        // 用增强for遍历
        for(String s:set){
            System.out.println(s);  // 输出的没有顺序
        }

    }
}
Hashset实现类

此类实现set接口,由哈希表支持,它不保证set的迭代顺序。

哈希表

链表数组组合体
在这里插入图片描述

迭代的性能收到桶的数量的影响,如果迭代性能很重要,则不要将初始容量设置的太高(初始容量是数组长度 默认16)

package cn.itcast.demo05;

import cn.itcast.demo03.Person;

/*
    HashSet自身特点
    底层数据结构 Hash表
    存储,取出比较快
    线程不安全,运行速度快
 */
public class HashSetDemo1 {
    public static void main(String[] args) {
        Person p = new Person();
        int i = p.hashCode();  // 如果没有重写父类,hashCode的结果是不确定的
        System.out.println(i);
    }
}

注意:跳过19_13~19_15

LinkedHashSet实现类
package cn.itcast.demo05;

import java.util.LinkedHashSet;

/*
    LinkedHashSet 基于链表的hash表实现
    继承自HashSet

    具有顺序,存储和取出的顺序相同
    线程不安全的集合,运行速度快

    小结:有序的set集合
 */

public class LInkedHashSetDemo {
    public static void main(String[] args) {
        LinkedHashSet<String> link = new LinkedHashSet<String>();
        link.add("aaa");
        link.add("bbb");
        link.add("bbb");
        link.add("ccc");
        System.out.println(link);

    }
}

注:Set是接口,HashSet和LinkedHashSet是它的实现类

注意:跳过19_17~19_18,这里可以出面试题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值