Java小记——集合List

目录

对象数组

数组和集合的区别

集合

 Collection集合

添加功能

删除功能

判断功能

获取长度

迭代器遍历集合元素

集合转换为数组

子接口——List集合

List遍历功能

并发修改异常

第二种方式:普通for循环遍历集合

List子接口——ArrayList集合

遍历功能

 排序功能

截取功能

List子接口——Vector集合

自带的迭代器 elements

List子接口——LinkedList集合

contains注意


对象数组

即数组元素为对象

三个对象

Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);

Student s3 = new Student("王五", 25);

Student[] students = {s1, s2, s3};

 for (int i = 0; i < students.length; i++) {
            Student student = students[i];
            System.out.println(student.getName() + "====" + student.getAge());
}

数组特点: 数组一旦定义好的长度是固定。遍历数组的途中,我不能增删数组中的元素。所以数

组作为就不太方便

Java考虑到,让我们更加方便的去操作容器中的元素,给我们提供了另外一种容器,叫做集合

数组和集合的区别

1.数组的长度是固定的,集合的长度是可变的。

2.数组既可以存储基本数据类型的元素,也可以存储引用数据类型的元素。

   集合只能存储引用数据类型的元素。

3.数组中只能存储同一种数据类型的元素。

   集合可以存储任意数据类型的元素。

集合

 Collection集合

添加功能

1.boolean add(Object obj):添加一个元素

Collection collection = new ArrayList(); //多态

boolean aaa = collection.add("aaa");
collection.add("bbb");
collection.add("ccc");

System.out.println(aaa)  //true

System.out.println(collection);  //[aaa, bbb, ccc]

注意:集合只能存储引用数据类型的元素。

collection.add(num); //Integer 自动装箱
collection.add(3.25);//Double
collection.add(Boolean.valueOf(false));
collection.add(true);

2.boolean addAll(Collection c):添加一个集合的元素  (给一个集合添加进另一个集合中的所有元素)

Collection c1 = new ArrayList();

c1.add("aaa");
c1.add("bbb");
c1.add("ccc");

Collection c2 = new ArrayList();

c2.add(100);
c2.add(200);
c2.add(300);

boolean b = c1.addAll(c2);
System.out.println(b); //true
System.out.println(c1); //[aaa, bbb, ccc, 100, 200, 300]
System.out.println(c2); //[100, 200, 300]

删除功能

1.boolean remove(Object o):移除一个元素

Collection c1 = new ArrayList();

c1.add("aaa");
c1.add("bbb");
c1.add("ccc");

//删除集合中的某个元素
boolean b = c1.remove("aaa");
if (b) {
         System.out.println(c1);  //  [bbb, ccc]
}

2.void clear():移除所有元素

//清空集合
c1.clear();

System.out.println(c1); // []

3.boolean removeAll(Collection c):移除一个集合的元素(移除一个以上返回的就是true) 删除的元素是两个集合的交集元素 

        Collection c1 = new ArrayList();

        c1.add("aaa");
        c1.add("bbb1");
        c1.add("ccc1");
        c1.add("ddd1");
        c1.add("eee");
        c1.add("fff");


        Collection c2 = new ArrayList();

        c2.add("aaa");
        c2.add("bbb");
        c2.add("ccc");
        c2.add("ddd");

        //c1 会删除掉两个集合的交集元素,c2的元素不影响。
        boolean b = c1.removeAll(c2); //如果有交集元素被删除,返回true,没有交集元素被删除返回false
        System.out.println(b);  // true

        System.out.println(c1);  // [bbb1, ccc1, ddd1, eee, fff]
        System.out.println(c2);  // [aaa, bbb, ccc, ddd]

判断功能

1.boolean contains(Object o):判断集合中是否包含指定的元素

        Collection c1 = new ArrayList();

        c1.add("aaa");
        c1.add("bbb1");
        c1.add("ccc1");
        c1.add("ddd1");
        c1.add("eee");
        c1.add("fff");
        //判断集合中是否有该元素
        System.out.println(c1.contains("aaa5")); // false

        c1.clear();

        //判断结合是否为空
        System.out.println(c1.isEmpty()); // true

2.boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(这个集合 包含 另一个集合中所有的元素才算包含 才返回true)

        Collection c1 = new ArrayList();

        c1.add("aaa");
        c1.add("bbb");
        c1.add("ccc");
        c1.add("ddd");
        c1.add("eee");
        c1.add("fff");


        Collection c2 = new ArrayList();

        c2.add("aaa");
        c2.add("bbb");
        c2.add("ccc");
        c2.add("ddd");
        c2.add("555");

        //a集合.containsAll(b集合);  看a集合是否包含了所有b集合的元素,如果包含了返回true ,如果有一个没有包含就会false
        boolean b = c1.containsAll(c2); 
        System.out.println(b);   // false

获取长度

int size() //元素的个数

        Collection c1 = new ArrayList();

        c1.add("aaa");
        c1.add("bbb");
        c1.add("ccc");
        c1.add("ddd");
        c1.add("eee");
        c1.add("fff");

        int size = c1.size();
        System.out.println(size);  //6

迭代器遍历集合元素

Iterator<E> iterator()

接口 Iterator<E> 对 collection 进行迭代的迭代器。

boolean hasNext()    //如果仍有元素可以迭代,则返回 true。

E next()     //返回迭代的下一个元素。

        Iterator iterator = c1.iterator();
        System.out.println(iterator); //java.util.ArrayList$Itr@1b6d3586

        while (iterator.hasNext()) {
               Object obj = iterator.next();
               System.out.println(obj);
        }

为什么这个迭代器,设计成ArrayList的内部类?

内部类可以直接访问外部类的成员,包括私有成员。

内部类也就是这个迭代器,肯定要访问集合的元素,集合的元素,在ArrayList中还是用数组存的元素 ,内部类就可以遍历外部类维护的这个数组。

若元素为对象

        Student s1 = new Student("张三", 23);
        Student s2 = new Student("李四", 24);
        Student s3 = new Student("王五", 25);

        Collection list = new ArrayList();
        list.add(s1);
        list.add(s2);
        list.add(s3);

       

        Iterator iterator = list.iterator();  //迭代器遍历
        while (iterator.hasNext()) {
            Student stu = (Student) iterator.next(); //向下转型
            System.out.println(stu.getName() + "====" + stu.getAge());
        }

集合转换为数组

常规做法

        Student s1 = new Student("张三", 23);
        Student s2 = new Student("李四", 24);
        Student s3 = new Student("王五", 25);

        Collection list = new ArrayList();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        //把集合转换成数组。
        Student[] arr = new Student[list.size()];

        Iterator iterator = list.iterator();
        int index = 0;
        while (iterator.hasNext()) {
            Student stu = (Student) iterator.next();
            arr[index++] = stu;
        }
        System.out.println(Arrays.toString(arr));

集合方法

        Student s1 = new Student("张三", 23);
        Student s2 = new Student("李四", 24);
        Student s3 = new Student("王五", 25);

        Collection list = new ArrayList();
        list.add(s1);
        list.add(s2);
        list.add(s3);

        Object[] objects = list.toArray();

        System.out.println(Arrays.toString(objects));

子接口——List集合

元素有序,并且每一个元素都存在一个索引,元素可以重复.

List特有功能

1. void add(int index,E element)   //在指定索引处添加元素

        List list = new ArrayList();

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add(0, "ddd");

        System.out.println(list);  // [ddd, aaa, bbb, ccc]

2. E remove(int index)  //移除指定索引处的元素  返回的是移除的元素

        List list = new ArrayList();

        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.remove(0);

        System.out.println(list);  //[bbb,ccc]

注意:若存的是Integer类型 

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        list2.remove(0);

        System.out.println(list2);  // [200, 300, 400, 500]

        //我想要200 表示的是元素
        list2.remove(Integer.valueOf(200)); 

        System.out.println(list2);  // [300, 400, 500]

3. E get(int index)  //获取指定索引处的元素

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);
        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        //根据索引获取元素
        Object o = list2.get(0);
        System.out.println(o);  //100

4. E set(int index,E element) //更改指定索引处的元素 返回的而是被替换的元素

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);
        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        Object oldEle = list2.set(0, 20000);
        System.out.println(list2);  // [20000, 200, 200, 300, 400, 500]
        System.out.println(oldEle); // 100

5. int indexOf(Object o)  返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);

        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        int index = list2.indexOf(200);
        System.out.println(index);  // 1

6. int lastIndexOf(Object o)  返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);

        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        int index = list2.lastIndexOf(200);
        System.out.println(index);  // 2

List遍历功能

for循环   size()    get()

//若用父接口中的迭代器

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        Iterator iterator = list2.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }

//for循环

        List list2 = new ArrayList();
        list2.add(100);
        list2.add(200);
        list2.add(300);
        list2.add(400);
        list2.add(500);

        for (int i = 0; i < list2.size(); i++) {
            Object o = list2.get(i);
            System.out.println(o);
        }

// listIterator 正向 反向遍历

        //正向

        ListIterator listIterator = list2.listIterator();
        System.out.println(listIterator);

        while (listIterator.hasNext()) {
            Object next = listIterator.next();
            System.out.println(next);
        }

        //反向

        ListIterator listIterator = list2.listIterator();
        while (listIterator.hasNext()) {
            Object next = listIterator.next();
            System.out.println(next);
        }
        //反向迭代,注意:反向迭代之前,先正向迭代
        while (listIterator.hasPrevious()) {
            Object previous = listIterator.previous();
            System.out.println(previous);
        }

并发修改异常

需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。

我们用Iterator这个迭代器遍历采用hasNext方法和next方法,集合修改集合,会出现并发修改异常。

原因是我们的迭代依赖与集合 当我们往集合中添加好了元素之后 获取迭代器  那么迭代器已经知道了集合的元素个数

这个时候你在遍历的时候又突然想给 集合里面加一个元素(用的是集合的add方法) 那迭代器不同意 就报错了

        ArrayList list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("world");
        list.add("ccc");

        ListIterator listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            String ele = (String) listIterator.next();
            if (ele.equals("world")) {
                //list.add("javaee");  //集合的添加方法,会产生集合的并发修改异常
                listIterator.add("javaee"); //迭代器自己的添加方法
            }

第二种方式:普通for循环遍历集合

            for (int i = 0; i < list.size(); i++) {
            String ele = (String) list.get(i);
            if (ele.equals("world")) {
                list.add("hello");

            }

List子接口——ArrayList集合

特点:底层数据结构是数组,查询快,增删慢。
           线程不安全,效率高。

1.ArrayList初始化为一个 空数组
2.ArrayList的Add操作不是线程安全的
3.ArrayList添加第一个元素时,数组的容量设置为 10
4.当ArrayList数组超过当前容量时,扩容至 1.5倍 (遇到计算结果为小数的,向下取
整),第一次扩容后,容量为15,第二次扩容至22
5.ArrayList在第一次和扩容后都会对数组进行拷贝,调用 Arrays.copyOf 方法。

遍历功能

普通for循环

        ArrayList list = new ArrayList();
        list.add(10);
        list.add(50);
        list.add(60);
        list.add(20);
        list.add(30);
        list.add(50);

        for (int i = 0; i < list.size(); i++) {
            Object o = list.get(i);
            System.out.println(o);
        }

forEach循环

       list.forEach(new Consumer() {
            @Override
            public void accept(Object ele) {
                System.out.println(ele);
            }
        });

 排序功能

sort()

list.sort(new Comparator() {
            @Override
            public int compare(Object a, Object b) {
                //System.out.println(a + "===" + b);
                Integer x = (Integer) a;
                Integer y = (Integer) b;
                return x - y; //根据返回值的 正 负 0 进行了一个排序
            }
        });
        System.out.println(list);

截取功能

subList()  //截取一部分元素到新集合中,为SubList

        ArrayList list = new ArrayList();
        list.add(10);
        list.add(50);
        list.add(60);
        list.add(20);
        list.add(30);

        List list1 = list.subList(0, 2); 

        System.out.println(list1);  // [10,50]

        list1.add(600);

        System.out.println(list1);  // [10,50,600]

  

List子接口——Vector集合

特点:底层数据结构是数组,查询快,增删慢。
           线程安全,效率低。

特有功能

1. 添加  void addElement(E obj)

        Vector vector = new Vector();
        vector.add(100);
        vector.addElement(600);
        vector.addElement(200);

        System.out.println(vector); // [100,600,200]

2. 返回索引处元素  E elementAt(int index)

        Vector vector = new Vector();
        vector.add(100);
        vector.addElement(600);
        vector.addElement(200);

        Object o = vector.elementAt(1);

        System.out.println(o); // 600

3. 返回第一个元素  E firstElement ()

        Vector vector = new Vector();
        vector.add(100);
        vector.addElement(600);
        vector.addElement(200);

        Object o1 = vector.firstElement();

        System.out.println(o1); //100

4. 返回最后一个元素  E lastElement ()

        Vector vector = new Vector();
        vector.add(100);
        vector.addElement(600);
        vector.addElement(200);

        Object o2 = vector.lastElement();

        System.out.println(o2); //200

5. 插入指定元素到指定位置  void insertElementAt(E obj, int index) 

        Vector vector = new Vector();
        vector.add(100);
        vector.addElement(600);
        vector.addElement(200);

        vector.insertElementAt(300,1);

        System.out.println(vector);  // [100,300,600,200]

自带的迭代器 elements

        Enumeration elements = vector.elements();
        while (elements.hasMoreElements()) {
            Object o3 = elements.nextElement();
            System.out.println(o3);
        }

List子接口——LinkedList集合

特点:底层数据结构是链表,查询慢,增删快。
           线程不安全,效率高。

特有功能

1. void addFirst(E e)    添加元素到头位置

LinkedList linkedList = new LinkedList();

linkedList.add("aaa");

linkedList.add("bbb");

linkedList.addFirst("ccc");

System.out.println(linkedList); // [ccc,aaa,bbb]

2. void addLast(E e)    添加元素到末位置

LinkedList linkedList = new LinkedList();

linkedList.add("aaa");

linkedList.add("bbb");

linkedList.addFirst("ccc");

linkedList.addLast("ddd");

System.out.println(linkedList); // [ccc,aaa,bbb,ddd]

3. E getFirst()   获取头元素

LinkedList linkedList = new LinkedList();

linkedList.add("aaa");

linkedList.add("bbb");

linkedList.addFirst("ccc");

linkedList.addLast("ddd");

Object first = linkedList.getFirst();

System.out.println(first);  // ccc

4. E getLast()  获取尾元素

LinkedList linkedList = new LinkedList();

linkedList.add("aaa");

linkedList.add("bbb");

linkedList.addFirst("ccc");

linkedList.addLast("ddd");

Object last = linkedList.getLast();

System.out.println(last);  // ddd

5. E removeFirst()  删除头元素

LinkedList linkedList = new LinkedList();

linkedList.add("aaa");

linkedList.add("bbb");

linkedList.addFirst("ccc");

linkedList.addLast("ddd");

linkedList.removeFirst();

System.out.println(linkedList); // [aaa,bbb,ddd]

6. E removeLast()  删除尾元素

LinkedList linkedList = new LinkedList();

linkedList.add("aaa");

linkedList.add("bbb");

linkedList.addFirst("ccc");

linkedList.addLast("ddd");

linkedList.removeLast();

System.out.println(linkedList); // [ccc,aaa,bbb]

7. E poll () 和  E pop ()

调用poll() 和pop() 都可以返回队首元素并将其从原队列删除。

poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除

pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常

contains注意

比的是地址值

接入第三方登录是让用户方便快捷地使用已有账号登录你的网站或应用程序,提高用户体验的一种方式。本文将介绍如何使用 PHP 实现微信公众号第三方登录。 1. 获取微信授权 首先,需要获取微信用户的授权。具体步骤如下: 1)引导用户打开微信授权页面: ```php $appid = 'your_appid'; $redirect_uri = urlencode('http://yourdomain.com/callback.php'); $scope = 'snsapi_userinfo'; $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=$scope&state=STATE#wechat_redirect"; header("Location: $url"); ``` 其中,`$appid` 是你的微信公众号的 AppID,`$redirect_uri` 是授权后回调的 URL,`$scope` 是授权作用域,可以是 `snsapi_base` 或 `snsapi_userinfo`,`$state` 是自定义参数,用于防止 CSRF 攻击。 2)获取授权码: 用户同意授权后,会重定向到 `$redirect_uri` 指定的 URL,带上授权码 `code` 和 `state` 参数。 ```php $code = $_GET['code']; $state = $_GET['state']; ``` 3)获取 access_token 和 openid: 使用授权码 `code` 获取 `access_token` 和 `openid`。 ```php $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $response = file_get_contents($access_token_url); $result = json_decode($response, true); $access_token = $result['access_token']; $openid = $result['openid']; ``` 其中,`$secret` 是你的微信公众号的 AppSecret。 2. 获取用户信息 获取到 `access_token` 和 `openid` 后,可以使用以下代码获取用户信息: ```php $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN"; $response = file_get_contents($userinfo_url); $userinfo = json_decode($response, true); ``` 其中,`$userinfo` 包含用户的昵称、头像等信息。 3. 将用户信息保存到数据库 最后,将获取到的用户信息保存到数据库中,以便下次使用时快速登录。 ```php // 连接数据库 $con = mysqli_connect('localhost', 'username', 'password', 'database'); mysqli_set_charset($con, "utf8"); // 查询用户是否已存在 $sql = "SELECT * FROM users WHERE openid='$openid'"; $result = mysqli_query($con, $sql); if (mysqli_num_rows($result) == 0) { // 用户不存在,插入新用户信息 $nickname = mysqli_real_escape_string($con, $userinfo['nickname']); $headimgurl = mysqli_real_escape_string($con, $userinfo['headimgurl']); $sql = "INSERT INTO users (openid, nickname, headimgurl) VALUES ('$openid', '$nickname', '$headimgurl')"; mysqli_query($con, $sql); } // 保存用户登录状态 $_SESSION['openid'] = $openid; ``` 以上就是使用 PHP 实现微信公众号第三方登录的步骤。需要注意的是,为了确保安全性,应该对用户输入的数据进行过滤和验证,防止 SQL 注入和 XSS 攻击等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jmh-Ethereal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值