Day12Java基础学习笔记

集合/集合框架(List)

数组和集合的区别

  • 数组长度固定的,一旦定义,就无法改变
  • 集合长度可变
  • 数组中可以粗出基本数据类型,也可以是对象(实际上是对象的引用
  • 集合只能存储对象的引用)

Java集合体系:分为Collection和Map两种体系

Collection接口

Collection有两个派生出来的接口:Set、List

  • Set:特点是:元素无序,不可重复
  • List:特点是:元素有序,可以重复

Collection接口的常用抽象方法

  • boolean add(Object o):向集合中添加一个元素,如果添加成功,则返回true,否则返回false
  • boolean addAll(Collection c):把另一个集合中的所有元素添加到当前集合中,如果添加成功,则返回true,否则返回false
  • void clear():清除集合里所有元素,将集合长度变为0
  • boolean contains(Object o):返回集合里是否包含指定元素
  • boolean containAll(Collection c):返回集合里是否包含集合c里包含的所有元素
  • boolean isEmpty():返回当前集合是否为空
  • Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素
  • boolean remove(Object o):删除集合中指定的元素c,当集合中包含一个或者多个元素c时,该方法只删除第一个符合条件的元素,陈宫删除返回true
  • boolean removeAll(Collection c):从集合中删除集合c中包含的素有元素,相当于用当前集合减去集合c,如果删除了一个或者一个以上的元素,该方法返回true
  • int size():返回集合中元素个数
  • Object[] toArray():将集合转换成一个数组,转换后的数组时Object类型

迭代器Iterator实现集合遍历

Iterator也是集合框架中的成员,但是他不能用来盛庄元素,只能用来遍历(即迭代)Collection中的元素,Iterator对象那个也被成为迭代器

如果想使用Iterator迭代器,则必须有一个集合对象,没有集合对象,迭代器也就没有意义了

常用的迭代器方法

  • boolean hasNext():查看集合是否还有元素,如果集合被遍历完了,则返回false,否则返回true
  • Object next():返回集合中的下一个元素,注意放回类型是Object
  • boolean remove():将上一次返回的元素删除,删除成功返回true,否则false
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    public class CollectionDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            //给集合中添加元素
            c.add("hello");
            c.add(123);
            c.add("asd");
            c.add("hello");
            c.add(new Student("张三",15));
            Iterator it = c.iterator(); // 获取迭代器
            while (it.hasNext()) {
                Object obj =it.next();
                System.out.println(obj);
            }
        }
    }
    

遍历集合的另一个方式:增强for循环

也叫foreach循环,每次循环都把数组/集合中的元素拿出来复制给一个变量,用来遍历集合和数组

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    public class CollectionDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("hello");
            c.add(123);
            c.add("asd");
            c.add("hello");
            c.add(new Student("张三",15));
            for (Object obj : c) {
                System.out.println(obj);
            }
        }
    }
注意! :在使用增强for遍历集合时,采用的值传递,改变循环变量的值不会影响到集合中的元素,但可以改变变量的值。
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    public class CollectionDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("java");
            c.add("javaee");
            c.add("javase");
            for (Object obj : c) {
                String name = (String)obj;//强转为String类型
                name = "String"+ name;//在字符串前面加上String字样
            }
            System.out.println(c);// 元素并不会改变
        }
    }

如何在遍历时删除集合中的元素

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    public class CollectionDemo {
        public static void main(String[] args) {
            Collection c = new ArrayList();
            c.add("hello");
            c.add(123);
            c.add("asd");
            c.add("hello");
            c.add(new Student("张三",15));
            Iterator it = c.iterator();
            while(it.hasNext()){
                Object obj = it.next();
                if(obj.equals(123)){  //调用Object类的equals()方法进行是否相等比较
                    it.remove(); //这里调用Iterator的remove()方法进行删除
                }
            }
            it = c.iterator(); //重置迭代指针,在上一轮循环中指针已指到末尾位置,重新开始遍历需要将指针重置
            while (it.hasNext()) {
                Object obj1 =it.next();
                System.out.println(obj1);
            }
        }
    }

List接口

是Collection接口的一个重要子接口,集合类中元素有序,且可重复,集合中的每个元素都有其对应的顺序索引。

List接口实现类有三种遍历方式

  • 使用Iterator迭代器遍历集合
  • 使用for循环中get(int index)通过索引来遍历
  • 增强for循环
    import java.util.List;
    import java.util.ArrayList;
    import java.util.Iterator;
    public class ListDemo {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            List al = new ArrayList();
            al.add("java");
            al.add("javaee");
            al.add("javase");
            //使用Iterator迭代器遍历集合
            Iterator it = al.iterator();
            while(it.hasNext()){
                Object obj = it.next();
                System.out.println(obj);
            }
            //增强for循环j进行遍历
            for (Object obj : al) {
                System.out.println(obj);
            }
            //使用for循环中get(int index)通过索引来遍历
            for (int i = 0; i < al.size(); i++) {
                Object obj = al.get(i);
                System.out.println(obj);
            }
        }
    }
    

List中遍历集合时对元素进行删除:

逆序遍历删除元素

    import java.util.ArrayList;
    import java.util.List;
    public class RemoveDemo {
        public static void main(String[] args) {
            List al = new ArrayList();
            al.add("java");
            al.add("java");
            al.add("java");
            al.add("java");
            //逆序遍历删除
            for (int i = al.size()-1; i >=0; i--) {
                String str =(String)al.get(i);
                if(str.equals("java")){
                al.remove(i);
                }
            }
            System.out.println(al);
        }
    }

案例练习,验证使用contains方法时是否调用equals方法

    public class Person {
        private String name;
        private int age;

        public Person() {
            super();
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            Person other = (Person) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    }

    import java.util.ArrayList;

    public class ArrayListDem {
        public static void main(String[] args) {
            ArrayList al = new ArrayList();
            Person p1 = new Person("p1",11);
            Person p2 = new Person("p2",12);
            Person p3 = new Person("p3",13);
            Person p4 = new Person("p4",14);
            al.add(p1);
            al.add(p2);
            al.add(p3);
            al.add(p4);
            for (Object object : al) {
                System.out.println(object);
            }
            System.out.println("----------");
            System.out.println(al.contains(p3));
        }
    }

面试题:简述List的子类特点

    ArrayList:
        底层数据结构是数组,查询快,增删慢。
        线程不安全,效率高。
    Vector:
        底层数据结构是数组,查询快,增删慢。
        线程安全,效率低。
    Vector相对ArrayList查询慢(线程安全的)
    Vector相对LinkedList增删慢(数组结构)
    LinkedList:
        底层数据结构是链表,查询慢,增删快。
        线程不安全,效率高。

    Vector和ArrayList的区别
        Vector是线程安全的,效率低
        ArrayList是线程不安全的,效率高
    共同点:都是数组实现的
    ArrayList和LinkedList的区别
        ArrayList底层是数组结果,查询和修改快
        LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
    共同点:都是线程不安全的

List有三个儿子,我们到底使用谁呢?

    查询多用ArrayList
    增删多用LinkedList
    如果都多ArrayList
时间: 2024-10-14 11:55:11

Day12Java基础学习笔记的相关文章

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

JAVA基础学习笔记(2)

看了几天的视频了,都没时间来写下学习笔记,今天来写下第二次的学习笔记,前几天看的给忘记了,就写最新看到的吧 主要内容:1.类的变量与函数(方法) 2.对象的存储方式 3.新建一个对象及对象的赋值与调用 4.空对象 5.匿名对象 1.类的变量与函数(方法) class Dog      //类名 { String name;  //变量的声明 int age; String color; void bark()   //方法的定义(返回值为空,不带参数) { System.out.println(

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

JAVA基础学习笔记(1)

今天第一天开始学JAVA,时间:2014年6月17日 学习内容:1.java环境的架设 2.JAVA基本数据类型 1.JAVA环境的架设       1.要先去下载JDK,下载地址 2.安装完成后,设置环境变量 1.1环境变量的设置        1.右键-我的电脑-属性-高级-环境变量-系统变量,找到PATH,在里面加入jdk里bin目录的地址 如:c:\java\bin; 2.新建-名为classpath,值为. 1.2测试JAVA是否配置正确        1.在cmd里面输入javac.

java基础学习笔记day01

java基础学习笔记day01 1.软件开发: 软件:按照特定顺序组织的计算机数据和指令的集合 开发:软件的制作过程 软件开发:借助开发工具和计算机语言制作软件 2.java概述: java之父:詹姆斯·高斯林 JDK:java开发环境 jre:java运行环境 JVM:java虚拟机 java跨平台是因为,JVM能在不同的平台运行,JVM是跨平台的 JavaSE:标准版 JavaME:手机端,物联网 JavaEE:企业版,互联网项目 3.java语言特点: 简单性 解释性 面向对象 高性能 分

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可

HTML&CSS基础学习笔记15-合并单元格

合并单元格 之前的文章中,我们已经能够创建一个简单地表格了,如果我们需要把横向的某两个相邻单元格<td>或者纵向的某两个相邻单元格<td>合并,我们该怎么做呢?我们要知道的知识点如下: 1.标签<td>的[colspan]属性规定单元格可横跨的列数,即横向合并的单元格数: 2.标签<td>的[rowspan] 属性规定单元格可横跨的行数,即纵向合并的单元格数: 3.这2个标签也可以同时使用. 样式示例: 现在就来试试合并单元格吧: <!DOCTYPE