Java day12-13

Day12

一、数组操作

1. 选择排序:

        数组的0索引依次和后面的索引进行比较,对应的元素小的往前方法,依次比较,就可以得到一个排好序的数组

publicclass ArrayDemo {

    public static void main(String[] args) {

        //定义一个数组,静态初始化

        int[] arr = {24,69,80,57,13};

        //排序前

        System.out.println("排序前:");

        printArray(arr);

        //调用

        selectSort(arr);

        System.out.println("排序后:");

        printArray(arr);

    }

    //将选择排序的代码封装成一个独立的功能

    public static void selectSort(int[] arr){

        for(int x = 0;x < arr.length-1;x++){

            for(int y = x +1;y<arr.length;y++){

                //判断

                if(arr[y]<arr[x]){

                    int temp = arr[x];

                    arr[x] = arr[y];

                    arr[y] = temp;

                }

            }

        }

    }

    //遍历数组的功能

    public static void printArray(int[] arr){

        System.out.print("[");

        //遍历数组

        for(int x = 0;x < arr.length;x ++){

            //判断是否最大索引

            if(x==arr.length-1){

                System.out.println(arr[x]+"]");

            }else{

                System.out.print(arr[x]+",");

            }

        }

    }

}

2. 二分查找:针对数组一定有序的!

   定义一个数组:11,22,33,44,55,66,77

   解决思路:

            1)定义最小索引和最大索引

            2)计算出中间索引

            3)拿中间索引对应的元素和要查找的元素进行比较

                如果相等:直接返回中间索引

                不相等:

                     大了,左边找

                    小了,右边找

            4)重新获取最小索引和最大索引,计算出中间索引

            5)回到3)继续查找

publicclass ArrayDemo {

    public static void main(String[] args) {

        //定义一个数组,静态初始化

        int[] arr = {11,22,33,44,55,66,77};

        //需求:查找33元素对应的索引

        int index = getIndex(arr, 33);

        System.out.println("index:"+index);

        //需求:要查找333元素对应的索引

        //如果查找的这个元素在数组中查不到呢?

        int index2 = getIndex(arr, 333);

        System.out.println("index2:"+index2);

    }

    public static int getIndex(int[] arr,intvalue){

        //定义最大索引和最小索引

        int max = arr.length -1;

        int min = 0 ;

        //计算中间索引

        int mid = (max + min)/2;

        //拿中间索引对应的元素和要查找的value元素进行比较

        while(arr[mid] !=value){

            //当前mid索引对应的元素不等于value元素,分两种情况

            if(arr[mid]>value){

                //重新获取最大索引

                 max = mid -1;

            }else if(arr[mid]<value){

                min = mid +1;

            }

            //如果找不到了应该返回-1

            //判断

            if(min>max){

                return -1;

            }

            //重新获取最大和最小索引,计算中间索引

            mid = (max+min)/2;

        }

        return mid ; //如果直接相等,直接返回

    }

}

3. 假设有一个数组:int arr [24,69,80,57,13]

   查找80这个元素在数组中的索引

        将数组进行排序

                冒泡排序

                选择排序

        注意:

        现在得到这个索引已经发生变化了,由于排序,改变了原来是数组中元素的顺序,所以遇到这种情况,就不要使用二分查找,就是用最基本的查找方法(从头查到尾)

publicclass ArrayTest {

    public static void main(String[] args) {

        //定义一个数组

        int[] arr ={24,69,80,57,13};

        //首先对数组排序

        selectSort(arr);

        //排序后在查找

        int index = getIndex(arr, 80);

        System.out.println("index:"+index);

    }

    //选择排序

    public static void selectSort(int[] arr){

        for(int x = 0 ; x < arr.length-1 ;x++){

            for(int y = x +1 ;y<arr.length ;y++){

//              判断

                if(arr[y]<arr[x]){

                    int temp = arr[x];

                    arr[x] = arr[y];

                    arr[y] = temp;

                }

            }

        }

    }

    //二分查找法

    public static int getIndex(int[] arr,intvalue){

        //定义最小索引和最大索引

        int min = 0;

        int max = arr.length -1;

        //计算中间索引

        int mid = (max+min)/2;

        while(arr[mid]!= value){

            if(arr[mid] > value){

                //重新获取索引

                //左边找

                max = mid -1;

            }else if(arr[mid]<value){

                //右边找

                min = mid +1;

            }

            //找不到返回-1

            if(min >max){

                return -1;

            }

            //重新计算中间索引

            mid = (max +min)/2;

        }

        return mid;

    }

    //遍历数组

    public static void printArray(int [] arr){

        //输出左中括号

        System.out.print("[");

        for(int x = 0 ; x < arr.length ; x++){

            if(x==arr.length -1){

                System.out.println(arr[x]+"]");

            }else{

                System.out.print(arr[x]+",");

            }

        }

    }

}

4.

Arrays:此类包含用来操作数组(比如排序和搜索)的各种方法(针对数组操作的工具类)   常用的几个方法:

        public static String toString(int[] a):将任意类型的数组以字符串形式显示出来!

        publicstatic void sort(int[] a):快速排序:(将给定数组中元素升序排序)

        publicstatic int binarySearch(int[] a, int key):当前int数组一定是有序数组

        使用二分搜索法来搜索指定的 int 型数组,以获得指定的值

publicclass ArraysDemo {

    public static void main(String[] args) {

        //定义一个数组

        int[] arr = {24,69,80,57,13};

        //讲数组转成字符串的形式

        System.out.println("toString():"+Arrays.toString(arr));

        Arrays.sort(arr);

        //在调用Arrays.toString(int[] a):将排好序的数组以String形式显示出来

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

        //[13, 24, 57, 69, 80]

        //public static int binarySearch(int[]a, int key)

        //查找57元素在数组中的索引

        int index = Arrays.binarySearch(arr, 57);

        System.out.println("index:"+index);

        //需求:查找577这个元素的索引

        int index2 = Arrays.binarySearch(arr,577);

        System.out.println("index2:"+index2);//-6

    }

}

5. 字符串中的字符进行排序。

        举例:"dacgebf"

        结果:"abcde

  改进:键盘录入一个字符串

publicclass ArrayTest {

    public static void main(String[] args) {

        //创建键录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收数据

        System.out.println("请你输入一个字符串:");

        String line = sc.nextLine();

        //将字符串转换字符数组

        char[] chs = line.toCharArray();

        //给字符数组进行冒泡排序

        bubbleSort(chs) ;

        //最终要的是字符串,还需要将字符数组转换成字符串

        String result = String.valueOf(chs);

        System.out.println("result:"+result);

    }

    public static void bubbleSort(char[] chs){

        for(int x = 0;x < chs.length-1;x ++){

            for(int y = 0;y <chs.length-1-x;y++){

                if(chs[y]>chs[y+1]){

                    //中间变量互换

                    char temp = chs[y];

                    chs[y] = chs[y+1];

                    chs[y+1] = temp;

                }

            }

        }

    }

}

二、Math类

Math类提供了一些数学运行的方法

     常用的成员方法:

         public static int abs(int a):绝对值

         public static double ceil(double a):向上取整

         public static double floor(double a):向下取整 

         public static double max(double a,double b):获取最大值

         public static double min(double a,double b):获取最小值

         public static double pow(double a,double b):a的b次幂

         public static double random():取值范围:[0.0,1.0)

         public static long round(double a):四舍五入

         public static double sqrt(double a):一个数的正平方跟

//importjava.util.Scanner;

//JDK5.0以后的新特性;

//importstatic java.lang.Math.abs; //静态导入()import static(该方法一定是静态方法)

publicclass MathDemo {

    public static void main(String[] args) {

//System.out.println(Math.abs(-100));

        System.out.println(java.lang.Math.abs(-100));

        System.out.println(java.lang.Math.abs(-100));

        //public static double ceil(double a):向上取整

        System.out.println("ceil:"+Math.ceil(12.34));

        System.out.println("ceil:"+Math.ceil(12.54));

        //public static double floor(double a):向下取整

        System.out.println("floor:"+Math.floor(12.34));

        System.out.println("floor:"+Math.floor(12.56));

//public static double max(double a,doubleb):获取最大值

        System.out.println("max:"+Math.max(Math.max(10,20),30));

        //public static double pow(doublea,double b):a的b次幂

        System.out.println("pow:"+Math.pow(2,3));

        //public static long round(double a):四舍五入

        System.out.println("round:"+Math.round(12.56));

        //public static double sqrt(double a):一个数的正平方跟

        System.out.println("sqrt:"+Math.sqrt(4));

    }

}

三、System

1.System:该类没有构造方法,所以字段和成员方法都用静态修饰

          常用的两个字段:

              in,out都和流有关系:java.io...

              PrintStream(字节打印流) ps = System.out ;标准输出流

              PrintWriter(字符打印流)

              InputStream in =  System.in; 标准输入流      

          常用的成员方法:

              public static void gc()运行垃圾回收器。

             调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存,最终调用的就是重写之后finalize()回收不用的对象。

importjava.util.Scanner;

publicclass SystemDemo {

    public static void main(String[] args) {

//      Scanner sc = new Scanner(System.in) ;

//      System.err.println("请您输入一个数据:");

//      System.out.println("hello");

        //创建Person类对象

        Person p = new Person("高圆圆", 27);

        System.out.println(p);

        p = null ; //当前Person变成空了,没有更多的引用了

        //启动垃圾回收器

        System.gc();//当前垃圾回收器需要回收不用对象了Person [name=高圆圆, age=27]

    }

}

publicclass 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 + "]";

    }

    //重写Object中的finalize()方法

    @Override

    protected void finalize() throws Throwable {

        System.out.println("当前垃圾回收器需要回收不用对象了"+this);

        super.finalize();

    }

}

2.System:该类没有构造方法,所以字段和成员方法都用静态修饰

          常用的两个字段:

              in,out都和流有关系:java.io...

              PrintStream(字节打印流) ps = System.out ; 标准输出流

              PrintWriter(字符打印流)

              InputStream in =  System.in; 标准输入流    

          常用的成员方法:

              public static void gc()运行垃圾回收器。

             调用 gc 方法暗示着 Java 虚拟机做了一些努力来回收未用对象,以便能够快速地重用这些对象当前占用的内存,最终调用的就是重写之后finalize()回收不用的对象。

           public static void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。

            public static longcurrentTimeMillis():返回当前的时间毫秒值

publicclass SystemDemo {

    public static void main(String[] args) {

//      long time = System.currentTimeMillis() ;//获取当前系统时间毫秒值

//      System.out.println(time);

        //currentTiimeMillis():单独使用没意义

        //需求:计算某一个应用程序的耗时的毫秒数

        long start = System.currentTimeMillis();

        //for循环

        for(int x = 0 ; x <100000;x ++){

            System.out.println("hello"+x);

        }

        long end = System.currentTimeMillis();

        System.out.println("当前for循环语句共耗时:"+(end-start)+"毫秒");//前for循环语句共耗时:4628毫秒

    }

}

3.System里面的常用的成员方法:

    public static void arraycopy(Object src,intsrcPos,Object dest, int destPos,int length)

    指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束

publicclass SystemDemo2 {

    public static void main(String[] args) {

        //定义两数组,静态初始化

        int[] arr1 = {11,22,33,44,55,66};

        int[] arr2 = {3,4,5,6,7,8,9};

        //复制数组

        System.arraycopy(arr1, 2, arr2, 1, 2);

        //分别将arr1 和arr2数组以字符串形式显示出来

        System.out.println("arr1:"+Arrays.toString(arr1));

        System.out.println("arr2:"+Arrays.toString(arr2));

       

    }

}

四、BigInteger

1.BigInteger的构造方法

        publicBigInteger(String val)将字符串表示的数字封装成BigInteger类型

    成员方法:

            public BigInteger add(BigInteger val)

            public BigInteger subtract(BigIntegerval)

            public BigInteger multiply(BigIntegerval)

            public BigInteger divide(BigIntegerval)

            public BigInteger[]divideAndRemainder(BigInteger val) 

            返回一个BigInteger数组,数组中的元素:商,余数

importjava.math.BigInteger;

publicclass BigIntegerDemo2 {

    public static void main(String[] args) {

        //创建BigInteger对象

        BigInteger bg1 = newBigInteger("100");

        BigInteger bg2 = newBigInteger("50");

        //public BigInteger add(BigInteger val)

        System.out.println("add:"+bg1.add(bg2));

//public BigInteger subtract(BigIntegerval)

        System.out.println("sub:"+bg1.subtract(bg2));

        //public BigInteger multiply(BigIntegerval)

        System.out.println("mul:"+bg1.multiply(bg2));

        //public BigInteger divide(BigIntegerval)

        System.out.println("div:"+bg1.divide(bg2));

        BigInteger[] datas =bg1.divideAndRemainder(bg2);

        System.out.println("datas[0]:"+datas[0]);//2

        System.out.println("datas[1]:"+datas[1]);//0

    }

}

2.BigInteger:用来计算超出了Integer类型范围的数据

importjava.math.BigInteger;

publicclass BigIntegerDemo {

    public static void main(String[] args) {

        //查看Integer类的最大值

        System.out.println(Integer.MAX_VALUE);//2147483647

        //创建Integer对象

//Integer i= new Integer("2147483648");//java.lang.NumberFormatException: For input string: "2147483648"

        //当前该数据已经超出了Integer的取值范围

//System.out.println(i);

        BigInteger i = newBigInteger("2147483648");

        System.out.println("i:"+i);

    }

}

四、BigDecimal

1. 对于浮点类型的数据类说,他们存储和整数的存储是不一致的,是按照有效数字位来进行存储的,浮点类型的数据计算的时候

  容易损失精度,计算出来的结果不精确,Java针对这种情况:提供了这个

  BigDecimal:

            作用:来提供浮点类型数据的精确计算!可变的、任意精度的有符号十进制数

    构造方式:

            public BigDecimal(String val)

publicclass BigDecimalDemo {

    public static void main(String[] args) {

        System.out.println(1.0-0.32);

        System.out.println(0.01+0.09);

        System.out.println(1.501*100);

        System.out.println(1.031/100);

    }

}

2.public BigDecimal(String val)

        常用的成员方法;

            public BigDecimal add(BigDecimalaugend):加

            publicBigDecimal subtract(BigDecimal subtrahend):减

            public BigDecimal multiply(BigDecimalmultiplicand):乘法

            public BigDecimal divide(BigDecimaldivisor):除

            参数1:商,参数2:保留几位小数,参数3:舍入的一种模式:ROUND_HALF_UP

importjava.math.BigDecimal;

publicclass BigDecimalDemo2 {

    public static void main(String[] args) {

        //创建BigDecimal对象

        BigDecimal bd1 = newBigDecimal("0.01");

        BigDecimal bd2 = newBigDecimal("0.09");

        //public BigDecimal add(BigDecimalaugend):加

        System.out.println("add:"+bd1.add(bd2));

        BigDecimal bd3 = newBigDecimal("1.0");

        BigDecimal bd4 = newBigDecimal("0.32");

        //public BigDecimal subtract(BigDecimalsubtrahend):减

        System.out.println("sub:"+bd3.subtract(bd4));//0.68

        //  publicBigDecimal multiply(BigDecimal multiplicand):乘法

        BigDecimal bd5 = newBigDecimal("1.501");

        BigDecimal bd6 = newBigDecimal("100.0");

        System.out.println("mul:"+bd5.multiply(bd6));

        //public BigDecimal divide(BigDecimaldivisor):除

        BigDecimal bd7 = new BigDecimal("1.301");

        BigDecimal bd8 = newBigDecimal("100");

        System.out.println("div:"+bd7.divide(bd8));

        //public BigDecimal divide(BigDecimaldivisor,int scale,int roundingMode)

        //参数1:商, 参数2:保留几位小数,参数3:舍入的一种模式:ROUND_HALF_UP

        System.out.println("div:"+bd7.divide(bd8,3, BigDecimal.ROUND_HALF_UP));

        System.out.println("div:"+bd7.divide(bd8,8, BigDecimal.ROUND_HALF_UP));

    }

}

六、Calendar

1.Calendar:日历类:

    Calendar类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

    Calendar该类是一个抽象类:不能实例化的,所以通过一下这个方法来创建对象

        publicstatic Calendar getInstance()

        publicint get(int field)返回给定日历字段的值

        publicstatic final int YEAR:表示日历中 的年

        public static final int MONTH:月份:是0开始计算的

        public static final int DATE:和DAY_OF_MONTH是同义词,表示月份中的某天

 

importjava.util.Calendar;

publicclass CalendarDemo {

    public static void main(String[] args) {

        // 创建日历类对象

        Calendar calendar =Calendar.getInstance();

//创建日历类对象,需要通过getInstance()方法创建对象

        // 获取年

        // public static final int YEAR

        int year = calendar.get(Calendar.YEAR);

        // 获取:年中的月份

        // public static final int MONTH

        int month =calendar.get(Calendar.MONTH);

        // 获取月份中的天

        // public static final int DATE

        int date = calendar.get(Calendar.DATE);

        //输出

        System.out.println(year+"年"+(month+1)+"月"+date+"日");

    }

}

2.Calendar常用的成员方法:

     public abstract void add(int field,int amount)

        为给定的日历的字段添加或者减去时间偏移量

     public final void set(int year,int month,intdate)

        设置日历字段 YEAR、MONTH 和DAY_OF_MONTH 的值

importjava.util.Calendar;

publicclass CalendarDemo2 {

    public static void main(String[] args) {

        //创建日历类对象

        Calendar c = Calendar.getInstance();

        //获取年

        int year = c.get(Calendar.YEAR);

        //获取月

        int month = c.get(Calendar.MONTH);

        //获取月中的天

        int date = c.get(Calendar.DATE);

        System.out.println(year+"年"+(month+1)+"月"+date+"日");

        //需求:三年前的今天

//public abstract void add(int field,intamount)

//c.add(Calendar.YEAR, -3);

        //获取年

//year = c.get(Calendar.YEAR);

        //月

//month = c.get(Calendar.MONTH);

        //天

//date = c.get(Calendar.DATE);

//System.out.println(year+"年"+(month+1)+"月"+date+"日");

        //需求:5年后的十天前

        c.add(Calendar.YEAR, 5);

        c.add(Calendar.DATE, -10);

        //获取年

        year = c.get(Calendar.YEAR);

        //获取月

        month = c.get(Calendar.MONTH);

        //月汇总的天

        date = c.get(Calendar.DATE);

        System.out.println(year+"年"+(month+1)+"月"+date+"日");

        //public final void set(int year, intmonth, int date)

        c.set(2018,5,20);

        //获取年

        year = c.get(Calendar.YEAR);

        //获取月

        month = c.get(Calendar.MONTH);

        //月汇总的天

        date = c.get(Calendar.DATE);

        System.out.println(year+"年"+(month+1)+"月"+date+"日");

    }

}

3. 键盘录入一个年份,获取任意一年的二月有多少天

  分析:

        1)创建键盘录入对象,录入某一个年份

        2)获取日历类对象,getInstance()

        3)设置一个日历字段,年,月,日

            日历类对象.set(year,2,1):这里其实表示3月1

        4)将时间往前推一天

            日历类对象.add(Calendar.DATE,-1);

        5)获取DATE月份中的天,输出即可     

importjava.util.Calendar;

importjava.util.Scanner;

publicclass CalendarTest {

    public static void main(String[] args) {

        //创建键盘录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收数据

        System.out.println("请您输入一个年份:");

        int year = sc.nextInt();

        //创建日历类对象

        Calendar c = Calendar.getInstance();

        //设置日历的字段,年,月,日

        c.set(year, 2, 1) ;//其实月份:(month+1):3月1

        //将时间往前推算一天

        c.add(Calendar.DATE, -1);

        System.out.println("任意一年的二月有:"+c.get(Calendar.DATE));

    }

}

七、Date类

1.Date类:日期类:

        表示特定的瞬间,精确到毫秒。

        常用的构造方式:

            publicDate():表示分配的一个Date对象:无参: 通过无参构造获取当前系统的具体的时间

            publicDate(long date):指定一个时间毫秒值  和它1970-1-1 00:00:00有时间差

importjava.util.Date;

publicclass DateDemo {

    public static void main(String[] args){

        //创建日期对象

        Date d = new Date();

        //输出日期对象

        System.out.println("d:"+d);//SatNov 04 15:05:43 CST 2017 :获取当前系统的年月日以及时分秒星期

        //设置一个时间long

        long time = 1000/60/60;

        Date d2 = new Date(time);

        System.out.println("d2:"+d2);

    }

}

2. Date中的两个成员方法

      public long getTime():获取当前时间毫秒值

      如果知道Date对象,可以通过getTime()获取时间毫秒值

      public void setTime(long time)

importjava.util.Date;

publicclass DateDemo2

    public static void main(String[] args) {

        //创建一个日期对象

        Date d = new Date();

        System.out.println(d);

        //public long getTime():获取当前时间毫秒值

        long time = d.getTime();

//System.out.println(time);

//System.out.println(System.currentTimeMillis());

//通过System可以获取当前时间的毫秒数

        //public void setTime(long time)

        d.setTime(1000);

        System.out.println(d);

    }

}

3.将Date对象--->String类型的日期的"文本格式":格式化

        public final String format(Date date)

  String类型日期的"文本格式"---->Date日期对象:解析

        public Date parse(String source) 该方法本身会抛出一个异常:ParseException(解析异常:编译时期异常)

  要进行转换:必须使用中间桥梁:DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。

  日期/时间格式化子类(如SimpleDateFormat)允许进行格式化(也就是日期Date -> 文本String)、解析(文本String-> 日期Date)和标准化

        但是,DateFormat是抽象类,不能直接实例化,使用的是它更具体的子类进行实例化:

        SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类

        常用的构造方法:

                Date---格式化--->String文本格式            

                public SimpleDateFormat(Stringpattern)用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

        日期和时间模式

            y           年  比如:2017---->yyyy

            M           年中的月份:2------>MM

d           月份中的天数 :----->dd

            H           小时                HH

            m           小时中的分钟数      mm

            s           分钟中的秒数        ss

importjava.text.ParseException;

importjava.text.SimpleDateFormat;

importjava.util.Date;

publicclass DateFormatDemo {

    public static void main(String[] args)throws ParseException {

        //Date日期对象--->格式化---->String:日期文本格式

        //创建日期对象

        Date d = new Date() ;

//System.out.println(d);

        //创建SimpleDateFormat类对象,用该对象格式化Date对象

        SimpleDateFormat sdf = newSimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;

        //格式化

        //public final String format(Date date)

        StringdateStr = sdf.format(d);

        System.out.println("dateStr:"+dateStr);

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

        //String日期"文本格式"----->解析----->Date对象

        /**

         *注意事项:

         *一定要保证SimpleDateFormat中的String Pattern这个模式和当前给的字符串的文本格式的模式必须一致

         */

        String s = "2017-12-30";

        //创建SimpleDateFormat类的对象,用该对象解析String的日期的"文本格式"

//SimpleDateFormat sdf2 = newSimpleDateFormat("yyyy年MM月dd日");

        SimpleDateFormat sdf2 = newSimpleDateFormat("yyyy-MM-dd");

        //ava.text.ParseException: Unparseabledate: "2017-12-30"

        //开始解析

        //public Date parse(String source)

        Date d2 = sdf2.parse(s);

        System.out.println("d2:"+d2);

    }

}

4.将Date和String相互转换的日期工具类

importjava.text.ParseException;

importjava.text.SimpleDateFormat;

importjava.util.Date;

publicclass DateUtil {

    //将无参构造私有化,为了不让外界创建对象

    private DateUtil(){

    }

    /**

     * 该方法是将Date日期对象格式化成一个String日期"文本格式"

     *@param d

     *      需要被转换的日期对象

     *@param format

     *      需要转换的时候提供的一种模式

     *@return

     *      最终返回的就是日期的文本格式

     */

    public static String dateToString(Dated,String format){

//创建SimpleDateFormat对象

        /*SimpleDateFormat sdf = new SimpleDateFormat(format);

        //格式化

        String str = sdf.format(d);

        return str;*/

        return new SimpleDateFormat(format).format(d);

    }

    /**

     * 该方法是将String的日期"文本格式"解析成一个Date日期对象

     *@param s

     *      表示需要被解析的日期文本格式

     *@param format

     *      表示解析日期文本格式是需要使用的一种模式

     *@return

     *      返回的就是日期Date对象

     *@throws ParseException

     *      抛出解析异常

     */

    public static Date stringToDate(Strings,String format) throws ParseException{

        //创建SimpleDateFormat对象

        /*SimpleDateFormat sdf = newSimpleDateFormat(format);

        Date date = sdf.parse(s);

        return date;*/

        return new SimpleDateFormat(format).parse(s);

    }

}

5.日期和String相互转换的一个测试类

importjava.text.ParseException;

importjava.util.Date;

publicclass DateUtilDemo {

    public static void main(String[] args)throws ParseException {

        //Date--->String

//创建一个Date对象

        Date d = new Date();

        //调用功能

        String str = DateUtil.dateToString(d,"yyyy-MM-dd HH:mm:ss");

        System.out.println("str:"+str);

        String str2 = DateUtil.dateToString(d,"yyyy-MM-dd");

        System.out.println("str2:"+str2);

        String str3 = DateUtil.dateToString(d,"HH:mm:ss");

        System.out.println("str3:"+str3);

        //String---->Date

        //模式要和字符串文本格式一致

        String s = "2018-6-2516:26:21";

        //调用功能

        Date date = DateUtil.stringToDate(s,"yyyy-MM-dd HH:mm:ss");

        System.out.println("date"+date);

    }

}

6.键盘录入你的出生年月日,计算你来到这个世界有多少天了?

   分析:

        1)键盘键盘录入出生年月日,录入这一个String类型的数据

        2)创建SimpleDateFormat对象指定一种模式

        3)将当前String日期文本格式转换成date对象

        4)通过Date对象获取getTime():获取时间毫秒值

        5)得到当前系统时间的毫秒值(System.currentTimeMillis)

        6):5)-4)=long 类型的时间

        7)换算成多少天

        8)输出

importjava.text.ParseException;

importjava.util.Date;

importjava.util.Scanner;

publicclass MyYearOldTest {

    public static void main(String[] args)throws ParseException {

        //创建键盘录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收数据

        System.out.println("请输入你的出生年月日: ");

        String line = sc.nextLine();

        //使用刚才DateUtil工具类

        Date d = DateUtil.stringToDate(line,"yyyy-MM-dd");

        //获取当前出生年日所在的时间毫秒值

        long oldTime = d.getTime();

        //获取当前系统时间的毫秒值

        long nowTime = System.currentTimeMillis();

        long time = nowTime - oldTime;

        //换算

        long day = time/1000/60/60/24;

        //输出

        System.out.println("你来到这个世界有"+day+"天了");

    }

}

Day13

一、正则表达式

1.正则表达式常用的语法:

A:字符

    x           字符 x :任意的字符

    \\          反斜线字符              在代码中书写正则表达式:\------>用两个\\代表一个反斜线

    \t          制表符 ('\u0009')

    \n          新行(换行)符 ('\u000A')           IO流中要写入换行符号:windows"\r\n"

    \r          回车符 ('\u000D')

B:字符类

    [abc]       a、b 或 c(简单类)

    [^abc]      任何字符,除了 a、b 或 c(否定)

    [a-zA-Z]    a到 z 或 A 到 Z,两头的字母包括在内(范围):当前字母大小均可

C:预定义字符类

    .           任何字符        邮箱里面:如果本身就是.,那么在写正在表达式的时候,\.将当前.转义

    \d          数字:[0-9]     \d在正则表达式应用的时候:[0-9]--->\\d

    \w          单词字符:[a-zA-Z_0-9]:简单一些字符串,单词字符(规则:数字或者字母)

                    javascript:[a-zA-Z0-9]

D:边界匹配器

    ^           行的开头

    $           行的结尾

    \b          单词边界 :

                hello;world:haha:xixi

E:Greedy数量词

    X?          X,一次或一次也没有

    X*          X,零次或多次

    X+          X,一次或多次

    X{n}        X,恰好 n 次

    X{n,}       X,至少 n 次

    X{n,m}     X,至少 n 次,但是不超过 m 次

应用:

1.String的分割功能:       

  public String[] split(String regex)根据给定正则表达式的匹配拆分此字符串

  返回值类型是一个字符串数组类型

  应用场景: QQ搜索好友  女  "18-24"     String ages = "18-24" ;

importjava.util.Scanner;

publicclass RegexDemo {

    public static void main(String[] args) {

        //定义一个字符串

        String ages = "18-24" ;

        //定义正则规则

        String regex = "-" ;

        //public String[] split(String regex)

        String[] strArray = ages.split(regex) ;

        //如何得到当前字符数组中的元素(转换int类型的数据)

        int startAge =Integer.parseInt(strArray[0]) ;

        int endAge =Integer.parseInt(strArray[1]) ;

        //键盘录入一个年龄,属于int类型的数据

        //创建键盘录入对象

        Scanner sc = new Scanner(System.in) ;

        //录入并接收数据

        System.out.println("请您输入一个年龄:");

        int age = sc.nextInt() ;

        //判断是否符我们要找的一类人

        if(age>=startAge &&age<=endAge){

            System.out.println("这就是我想要的...");

        }else{

            System.out.println("不是我们要找的...");

        }

    }

}

2. 分割功能的应用

publicclass RegexDemo2 {

    public static void main(String[] args) {

        //定义个字符串

        String str1 = "aa,bb,cc";

        //使用分割功能

        String[] strArray1 =str1.split(",");

        //遍历字符串数组

        for(int x = 0 ; x < strArray1.length;x ++){

            System.out.println(strArray1[x]);

        }

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

        //字符串:

        String str2 = "aa bb cc";

        //使用切割功能:

        String[] strArray2 = str2.split("+");

        for(int x = 0 ; x <strArray2.length ;x++){

            System.out.println(strArray2[x]);

        }

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

        String str3 = "aa.bb.cc" ;

        //分割功能

        String[] strArray3 =str3.split("\\.");

        for(int x =0 ; x<strArray3.length ; x++){

            System.out.println(strArray3[x]);

        }

        //使用分割功能

        String[] strArray4 =str4.split("\\\\");

        for(int x = 0 ; x <strArray4.length ;x ++){

            System.out.println(strArray4[x]);

        }

    }

}

3.String类中的替换功能:和正则表达式有关系

  public StringreplaceAll(String regex,String replacement)

  使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

publicclass RegexDemo3 {

    public static void main(String[] args) {

        //定义一个字符串:

        String str = "helloword123JavaSE45678Javaweb";

        //需求:让当前这个字符串中的数字不显示出来

        //定义当前大串中数字定义正则规则

//String regex = "[0-9]+";

        String regex = "\\d+";

        String s = "*";

        //public String replaceAll(Stringregex,String replacement)

        String result = str.replaceAll(regex, s);

        System.out.println("result:"+result);

    }

}

4. 校验邮箱

QQ邮箱: 919081924@qq.com

        fengqingyang@163.com

        xxxxx@126.com

        zhangsan@westos.com

        lisi@sina.com

        wangwu@istone.com.cn.

分析: 1)键盘录入邮箱

2)定义正则规则

    3)使用String中的特有功能校验

    4)输出即可

import java.util.Scanner;

 public class RegexTest {

    public static void main(String[] args) {

        //创建键盘录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收

        System.out.println("请您输入一个邮箱:");

        String email = sc.nextLine();

        //定义正则规则:本身就是.-->\.--->\\.

//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z]{2,3})+";

        String regex ="\\w+@\\w{2,6}(\\.[a-zA-Z]{2,3})+";

        //校验

        boolean flag = email.matches(regex);

        System.out.println("flag:"+flag);

    }

}

5. 使用正则表达式校验手机号码:

规则:

      手机号码:

                13689257284

                13688886666

                13892866555

                18992844422

                13257222222

                ...

 1)创建键盘录入对象,录入手机号码

 2)定义正则规则:

 3)String类的特有功能

   public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。

 4)输出

importjava.util.Scanner;

publicclass RegexDemo {

    public static void main(String[] args) {

        //创建键盘录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收

        System.out.println("请您输入一个手机号码:");

        String phone = sc.nextLine();

        //定义正则规则

        String regex = "1[38][0-9]{9}";

        //匹配当前正则表达式是否和录入的手机号符合

        boolean flag = phone.matches(regex);

        System.out.println("flag:"+flag);

    }

}

6. 如下一个字符串:"91 27 46 38 50"

    请写代码实现最终输出结果是:"27 38 46 50 91"

    分析:

        1)定义这个字符串

        2)使用分割功能分割成一个字符串数组

        3)如何得到一个int类型数组:动态初始化定义int数组 int[] arr = new int[字符串数数组.length] ;

        4)遍历int数组,获取每一个元素:arr[x] = Integer.parseInt(字符串数组对象[x])

        5)排序:Arrays数组工具类型快速排序:sort(arr)

        6)再去遍历int类型数组获取每一个元素,用字符串缓冲区来进行拼接

        7)输出字符串

importjava.util.Arrays;

publicclass RegexTest {

    public static void main(String[] args) {

        //定义一个字符串

        String str = "91 27 46 38 50";

        //使用分割功能

        String[] strArray = str.split("") ;

        //定义一个int类型的数组,动态初始化

        int[] arr = new int[strArray.length] ;

        //遍历int类型的数组

        for(int x = 0 ; x < arr.length ; x++){

            arr[x] =Integer.parseInt(strArray[x]) ;

        }

        //使用Arrays数组工具类型进行操作

        Arrays.sort(arr);

        //创建StringBuilder缓冲区对象

        StringBuilder sb = new StringBuilder();

        //再去遍历int类型的数组,目的使用为了拼接

        for(int x = 0 ; x < arr.length ; x++){

            //使用追加功能

            sb.append(arr[x]).append("");

        }

        //要将字符串缓冲转换成String类型,并且去除两端空格

        String result = sb.toString().trim();

        System.out.println("result:"+result);

    }

}

7. 关于模式和匹配器的使用:获取功能

  模式和匹配器基本使用顺序

importjava.util.regex.Matcher;

importjava.util.regex.Pattern;

publicclass RegexDemo4 {

    public static void main(String[] args) {

        //public static Pattern compile(Stringregex)将给定的正则表达式编译成一个模式对象

        //1)获取模式对象(通过正则规则)

        Pattern p =Pattern.compile("a*b");

        //2)通过模式获取匹配器对象,(将一个字符串类型的数据)

        Matcher m =p.matcher("aaaaaab");

        //3)调用Match(匹配器类)中的:publicboolean matches():判断当前用户录入的字符串是否和当前的正则规则匹配

        boolean flag = m.matches();

        System.out.println("flag:"+flag);

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

        //上述写法非常麻烦,要获取模式对象Pattern还要获取匹配器对象:Matcher,然后通过matches()方法返回一个结果

        //以后可以使用下面这种格式

        //定义一个正则规则

        String regex = "a*b";

        //指定某一个字符串

        String str = "aaaaaaab";

        //使用String类的功能

        //使用当前给定的字符串调用public boolean matchers(String regex)

        boolean flag2 = str.matches(regex);

        System.out.println("flag2:"+flag2);

    }

}

7.需求:校验一个QQ号码

 定义一个规则: 1)由5到10为组成的数字

2)不能以0开头   

 分析:

    1)键盘录入一个QQ号码,使用字符串接收

    2)定义一个校验QQ的功能

    3)在main()中调用返回boolean类型

方法一:

importjava.util.Scanner;

publicclass RegexDemo {

    public static void main(String[] args) {

        //创建键盘录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收数据

        System.out.println("请您输入一个QQ号码:");

        String QQ = sc.nextLine();

        //写一个校验QQ的功能

        boolean flag = checkQQ(QQ);

        System.out.println("flag:"+flag);

    }

    /**

     * 两个明确:

     * 明确返回值类型:boolean类型

     * 参数类型:String 输入的qq号码

     */

    public static boolean checkQQ(String qq){

        //假设定义个标记

        boolean flag = true;

        //需要判断:qq:长度5-10

        if(qq.length()>=5 &&qq.length()<=10){

            //符合这个规则

            //符合第一个规则还要符合不能以0开头

            if(!qq.startsWith("0")){

                //符合这个规则

                //这些QQ号码必须还数字的

                //可以先将qq,转换成字符数字

                char[] chs = qq.toCharArray();

                //遍历字符数组,获取每一个字符

                for(int x = 0 ; x < chs.length; x ++){

                    char ch = chs[x];

                    //获取到每一个字符,判断该字符是否是数字

                    if(!Character.isDigit(ch)){

                        flag = false;

                        break;

                    }

                }

            }else{

                flag = false;

            }

        }else{

            flag = false;

        }

        return flag;

    }

}

方法二:

importjava.util.Scanner;

publicclass RegexDemo2 {

    public static void main(String[] args) {

        //创建键盘了录入对象

        Scanner sc = new Scanner(System.in);

        //录入并接收数据

        System.out.println("请您输入QQ号码: ");

        String QQ = sc.nextLine();

        boolean flag = checkQQ(QQ);

        System.out.println("flag:"+flag);

    }

    public static boolean checkQQ(String qq){

        /*//定义正则规则

        String regex ="[1-9][0-9]{4,9}";

        //public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式。

        boolean flag = qq.matches(regex);

        return flag;*/

        //直接返回

        return qq.matches("[1-9]\\d{4,9}");

    }

}

二、集合

1. 集合的由来:

我们学习java的语言,是一种面向对象语言,面向对象语言对事物的描述是通过对象体现出来的,那么存储很多个学生,就需要使用容器变量进行存储

目前:学习过哪些容器变量呢?

      数组,StringBuffer/StringBuilder,对于数组来说,数组的长度是固定的,不符合实际需求(长度不可变);对于StringBuffer来说始终在内存中返回的是字符串类型,也不满足元素类型变化的要求;所以,Java就提供了一个技术:集合.

面试题:

集合和数组的区别?

    1)长度的区别:

            数组:长度是固定的;

            集合:长度是可变的

        2)存储数据类型的区别:

            数组:可以存储引用类型,可以存储基本数据类型

            集合:只能存储引用类型

        3)存储元素的区别

            数组:在同一个数组中,只能存储同一种数据类型的元素;举例 数组:杯子:只能装水

            集合:可以 存储多种数据类型的元素;          举例:集合:杯子:装水,其他饮料...

  集合是可以存储多种类型的元素,但是,需求如果变化,针对集合来说,Java提供了很多集合类,每一种集合类的数据结构不一样,所以,将他们之间的共性内容抽取出来就行了

例:

数组:

对象数组:可以存储对象的数组

需求:有5个学生,每一个学生有自己的信息(姓名,年龄等等),将5个学生的信息遍历出来!     分析:A:定义一个学生类:            

提供两个成员 变量

String name,int age

          提供无参/有参的构造方法

          提供set/get()方法

        B:定义一个学生数组(对象数组)

        C:创建5个学生对象

        D:赋值,将5个学生对象放到学生数组中

        E:遍历数组

        F:输出

publicclass ObjectArrayDemo {

    public static void main(String[] args) {

        //学生类创建完毕

        //定义一个学生数组:定义数组的格式:数据类型[] 数组名称 = new 数据类型[数组长度] ;

        //定义一个学生数组

        Student[] students = new Student[5] ;

        //创建5个学生对象

        Student s1 = new Student("高圆圆", 27) ;

        Student s2 = new Student("黄晓明", 28) ;

        Student s3 = new Student("邓超",30) ;

        Student s4 = new Student("孙俪",28) ;

        Student s5 = new Student("王昭君",25) ;

        //赋值

        students[0] = s1 ;

        students[1] = s2 ;

        students[2] = s3 ;

        students[3] = s4 ;

        students[4] = s5 ;

        //遍历学生数组

        for(int x = 0 ; x <students.length ;x ++){

//System.out.println(students[x]);

            //通过底层原码重写toString()得到的每个对象的成员变量的信息

            Student s = students[x] ;

            System.out.println(s.getName()+"----"+s.getAge());

        }

    }

}

publicclass Student {

    //两个成员变量

    private String name ;

    private int age ;

    public Student() {

        super();

    }

    public Student(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 "Student [name=" + name+ ", age=" + age + "]";

    }

}

集合:

需求:有5个学生,每一个学生有自己的信息(姓名,年龄等等),将5个学生的信息遍历出来!

使用集合的转换功能去遍历学生信息

    1)创建集合对象

    2)创建5个学生对象

    3)使用集合添加5个学生对象

    4)将集合转换成数组:Object[] toArray() ;

5)遍历数组

public class CollectionTest {

    public static voidmain(String[] args) {

        //创建集合对象

        Collection c = newArrayList() ;

        //创建5个学生对象

        Student s1 = newStudent("貂蝉",25) ;

        Student s2 = newStudent("王昭君",22) ;

        Student s3 = newStudent("西施",28) ;

        Student s4 = newStudent("杨贵妃",29) ;

        Student s5 = newStudent("高圆圆",38) ;

        //给集合中添加元素

        c.add(s1) ;//Objectobj = new Student("..") ;

        c.add(s2) ;

        c.add(s3) ;

        c.add(s4) ;

        c.add(s5) ;

        //将集合转换成数组

        Object[] objs =c.toArray() ;

        for(int x = 0 ; x< objs.length ; x ++){

//System.out.println(objs[x]);

            //使用get()获取学生姓名和年龄

            //Student类型接收

            Student s =(Student) objs[x] ;

            System.out.println(s.getName()+"---"+s.getAge());

        }

    }

}

public class Student {

    private String name ;

    private int age ;

   

    public Student() {

        super();

    }

    public Student(Stringname, int age) {

        super();

        this.name = name;

        this.age = age;

    }

    public String getName(){

        return name;

    }

    public voidsetName(String name) {

        this.name = name;

    }

    public int getAge() {

        return age;

    }

    public void setAge(intage) {

        this.age = age;

    }

    @Override

    public StringtoString() {

        return"Student [name=" + name + ", age=" + age + "]";

    }

}

 数据结构:存储数据的方式

 Collection: 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。

 一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现

Collection的一些功能

添加功能:

        booleanadd(Object e):给集合中添加指定的元素

        booleanaddAll(Collection c):添加一个集合中的所有元素

删除功能:

        voidclear():删除一个集合中的所有元素,暴力删除,(不建议使用)

        booleanremove(Object o):删除一个集合中的指定元素

        booleanremoveAll(Collection c):删除一个集合中的所有元素?思考:删除所有算是删除还是删除一个算是删除?

判断功能:

        booleancontains(Object o):判断一个集合中是否包含指定的单个元素

        booleancontainsAll(Collection c):判断一个集合中是否另一个集合;思考:是包含一个元素算是包含还是包含所有.

        booleanisEmpty():判断集合是否为空,如果为空,则返回true     

交集功能:

        booleanretainAll(Collection c):思考:A集合给B集合做交集,交集的元素去哪里?返回值boolean表达什么意思?

获取功能;

        int size():获取集合中的元素数

        Iterator<E>iterator():迭代器

转换功能:

        Object[]toArray():将集合转换成数组

面试题:

        数组中有没有length(),String类中有没有length(),集合中有没有length()?

        数组:length属性

        String:length()

        集合中:size()  

importjava.util.ArrayList;

importjava.util.Collection;

publicclass CollectionDemo {

    public static void main(String[] args) {

        //创建一个Collection集合对象

//Collection c = new Collection() ;//JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现

        Collection c = new ArrayList() ;

//System.out.println(c);//[]   底层重写了toString()

        //添加功能:

        //boolean add(Object e):给集合中添加指定的元素

//boolean flag = c.add("hello") ;

        /**

         *通过查看集合的add()方法,只要给集合中添加元素,永远返回true

         * public boolean add(E e) {

         *  //省略代码

            returntrue;

            }

         */

        c.add("hello") ;

        c.add("world") ;

        c.add("Java") ;

        //void clear():删除一个集合中的所有元素,暴力删除,(不建议使用)

//c.clear() ;

        //boolean remove(Object o):删除一个集合中的指定元素

//System.out.println("remove:"+c.remove("hello"));

//System.out.println("remove:"+c.remove("javaweb"));

        //boolean contains(Object o):判断一个集合中是否包含指定的单个元素

        System.out.println("contains:"+c.contains("world"));

//System.out.println("contains:"+c.contains("android"));

//boolean isEmpty():判断集合是否为空,如果为空,则返回true

//System.out.println("isEmpty:"+c.isEmpty());

        //int size():获取集合中的元素数

        System.out.println("size:"+c.size());

        System.out.println("c:"+c);

    }

}

2. 集合的高级功能:

    booleanaddAll(Collection c):添加一个集合中的所有元素

    booleanremoveAll(Collection c):删除一个集合中的所有元素?思考:删除所有算是删除还是删除一个算是删除?

    booleancontainsAll(Collection c):判断一个集合中是否另一个集合;思考:是包含一个元素算是包含还是包含所有

boolean retainAll(Collection c):思考:A集合给B集合做交集,交集的元素去哪里?返回值boolean表达什么意思?

importjava.util.ArrayList;

importjava.util.Collection;

publicclass CollectionDemo2 {

    public static void main(String[] args) {

        //创建两个Collection集合对象

        Collection c1 = new ArrayList() ;

        Collection c2 = new ArrayList() ;

        //分别给c1,c2集合添加元素

        c1.add("abc1") ;

        c1.add("abc2") ;

        c1.add("abc3") ;

        c1.add("abc4") ;

        /*c2.add("abc1") ;

        c2.add("abc2") ;

        c2.add("abc3") ;*/

        c2.add("abc4") ;

      //c2.add("abc5") ;

      //c2.add("abc6") ;

      //c2.add("abc7") ;

        //boolean addAll(Collection c):添加一个集合中的所有元素

        //System.out.println("addAll:"+c1.addAll(c2));

        //boolean removeAll(Collection c):删除一个集合中的所有元素?思考:删除所有算是删除还是删除一个算是删除?

        //删除一个算是删除

        //System.out.println("removeAll:"+c1.removeAll(c2));

        //boolean containsAll(Collection c):判断一个集合中是否另一个集合;思考:是包含一个元素算是包含还是包含所有

        //System.out.println("containsAll:"+c1.containsAll(c2));//包含所有算是包含

        //boolean retainAll(Collection c):思考:A集合给B集合做交集,交集的元素去哪里?返回值boolean表达什么意思?

        /**

         *面试题:

         *A集合对B集合取交集,那么交集的元素去A集合里面了,并且返回值boolean表达的意识是A集合中的元素是否发生变化,如果发生变化,就返回true;否则,false

         */

        System.out.println("retianAll:"+c1.retainAll(c2));

        //输出每个集合中的元素

        System.out.println("c1:"+c1);

        System.out.println("c2:"+c2);

    }

}

3. Object[]toArray():将集合转换成数组

 需求:给集合中添加String类型的元素,遍历集合

importjava.util.ArrayList;

importjava.util.Collection;

publicclass CollectionDemo3 {

    public static void main(String[] args) {

        //创建Collection集合对象

        Collection c = new ArrayList() ;

        //给集合中添加元素

        c.add("高圆圆") ;//c.add(Object obj)=====>Objectobj = new String("高圆圆") ;//向上转型了

        c.add("邓超") ;

        c.add("WE") ;

        c.add("RNG") ;

        //集合中有元素了,将集合转换数组

        Object[] objs = c.toArray() ;

        //遍历对象数组

        for(int x = 0 ; x < objs.length ; x++){

//System.out.println(objs[x]);

            //需求:获取集合中元素的同时,获取集合中每一个元素的字符串长度

//System.out.println(objs[x]+"---"+objs[x].length());

            //要获取字符串长度:需要使用length(),该方法属于String类的特有功能

            String s = (String) objs[x] ;//向下转型

            System.out.println(s+"----"+s.length());

        }

    }

}

4. 集合的专有遍历方式:使用集合自己本身迭代功能遍历集合中的元素

Iteratoriterator():迭代器

Iterator:迭代器:接口

成员方法:Objectnext()返回迭代的下一个元素:获取功能

booleanhasNext():判断一个集合中是否有下一个可以迭代的元素:判断功能

需求:使用集合存储字符串类型的元素并遍历

publicclass CollectionDemo {

    public static void main(String[] args) {

        //创建集合对象

        Collection c = new ArrayList();//ArrayList是List集合的子实现类(存储和取出一致的)

        //给集合中添加元素

        c.add("hello") ;

        c.add("world") ;

        c.add("java") ;

        c.add("java") ;

        c.add("java") ;

        c.add("java") ;

        //获取迭代器对象

        //Iterator iterator():迭代器

        Iterator it = c.iterator() ;//底层使用ArrayList中的匿名内部类的形式:接口多态的形式

        //获取元素:Object next() ;

        /*Object obj = it.next() ;

        System.out.println(obj);*/

//System.out.println(it.next());

//System.out.println(it.next());

//System.out.println(it.next());

//java.util.NoSuchElementException:没有这样的元素异常!

//System.out.println(it.next());

        //由于当前集合中的元素获取完了,没有元素,而还要去调用next()方法,那么就出现问题,

        //假设,给当前加上一个判断就可以防止出现异常!

        //判断

    /*  if(it.hasNext()){

            //有,就获取需要被遍历的元素

            System.out.println(it.next());

        }

        if(it.hasNext()){

            //有,获取

            System.out.println(it.next());

        }

        if(it.hasNext()){

            System.out.println(it.next());

        }

        if(it.hasNext()){

            System.out.println(it.next());

        }*/

        //上述代码重复度高,由于集合中的元素不固定的,所有使用while循环去改进

        while(it.hasNext()){

//System.out.println(it.next());//获取字符串的内容

            //获取字符串的同时,还要获取字符串长度

            //Object obj = it.next() ;

            //向下转型

            String s = (String)it.next() ;

            System.out.println(s+"----"+s.length());

        }

    }

}

5. 使用存储自定义对象并遍历

1)toArray():将集合转换成数组

2)集合专有遍历方式:迭代器遍历

注意:存储自定义对象使用迭代器遍历,it.next()不要使用多次,否则会出现异常!

使用迭代器遍历,使用的是while循环,可以是for循环吗?可以,但是还是while循环

importjava.util.ArrayList;

importjava.util.Collection;

importjava.util.Iterator;

publicclass CollectionTest {

    public static void main(String[] args) {

        //创建一个学生类

        //创建集合对象

        Collection c = new ArrayList() ;

        //创建3个学生对象

        Student s1 = new Student("张三", 26) ;

        Student s2 = new Student("李四", 22) ;

        Student s3 = new Student("往往与", 28) ;

        //给集合中添加元素

        c.add(s1) ;

        c.add(s2) ;

        c.add(s3) ;

        //获取迭代器对象

        Iterator it = c.iterator() ;

        //遍历

        while(it.hasNext()){

            Student s = (Student)it.next() ;

            System.out.println(s.getName()+"---"+s.getAge());

            //java.util.NoSuchElementException

        System.out.println(((Student)it.next()).getName()+"----"+((Student)it.next()).getAge());

        }

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

        for(Iterator it2 =c.iterator();it2.hasNext();){

            Student s = (Student) it2.next() ;

            System.out.println(s.getName()+"---"+s.getAge());

        }

    }

}

publicclass Student {

    private String name ;

    private int age ;

    public Student() {

        super();

    }

    public Student(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 "Student [name=" + name+ ", age=" + age + "]";

    }

}

6. 用List集合存储字符串类型的元素,并遍历:迭代器遍历

importjava.util.ArrayList;

importjava.util.Iterator;

importjava.util.List;

publicclass ListDemo {

    public static void main(String[] args) {

        //创建集合对象

        List list = new ArrayList() ;

        //添加元素

        list.add("hello") ;

        list.add("world") ;

        list.add("java") ;

        //获取迭代器

        Iterator it = list.iterator() ;

        while(it.hasNext()){

            String s = (String)it.next() ;

            System.out.println(s);

        }

    }

}

7.List集合是一个有序的集合(存储元素和取出元素是一致的!)

该集合中的元素是可以重复的

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class ListDemo2 {

  publicstatic void main(String[] args) {

      //创建List集合对象

      Listlist = new ArrayList() ;

      //给集合中添加元素

      list.add("hello");

      list.add("world");

      list.add("java");

      list.add("java");

      list.add("javaweb");

      list.add("world");

      //获取迭代器

      Iteratorit = list.iterator() ;

      while(it.hasNext()){

          Strings = (String)it.next() ;

          System.out.println(s);

      }

  }

}

8. List集合的特有功能:

          添加功能:

              void add(int index, Object element)在列表的指定位置插入指定元素

          删除功能:

              Object remove(int index)移除列表中指定位置的元素,返回被删除的元素

          获取功能:

             ListIterator listIterator():列表迭代器:List集合的专有遍历方式

              Object get(int index)返回列表中指定位置的元素。

          替换

               set(int index,Object element)用指定元素替换列表中指定位置的元素

import java.util.ArrayList;

import java.util.List;

public class ListDemo {

  publicstatic void main(String[] args) {

      //创建List集合对象

      Listlist = new ArrayList() ;

      //添加一些元素

      list.add("hello");

      list.add("world");

      list.add("java");

      //voidadd(int index, Object element)在列表的指定位置插入指定元素,在指定位置前面插入一个新的元素

//list.add(1, "javaweb") ;

      //Objectremove(int index)移除列表中指定位置的元素,返回被删除的元素

      //IndexOutOfBoundsException:角标越界了

//System.out.println("remove:"+list.remove(3));

//System.out.println("remove:"+list.remove(2));

      //set(int index,Object element)用指定元素替换列表中指定位置的元素

//System.out.println("set:"+list.set(1,"JavaEE")) ;

      System.out.println("get:"+list.get(1));

//System.out.println("get:"+list.get(11));

      System.out.println("list"+list);

  }

}

9.List集合的遍历方式

   1)toArray()

     2)Collection集合中的Iterator iterator();

importjava.util.ArrayList;

importjava.util.Iterator;

importjava.util.List;

publicclass ListDemo2 {

    public static void main(String[] args) {

        //创建集合对象

        List list = new ArrayList() ;

        //添加元素

        list.add("hello") ;

        list.add("java") ;

        list.add("hello") ;

        list.add("javaweb") ;

        list.add("hello") ;

        list.add("python") ;

        //获取集合中的元素

      /*System.out.println(list.get(0));

        System.out.println(list.get(1));

        System.out.println(list.get(2));

        System.out.println(list.get(3));

        System.out.println(list.get(4));

        System.out.println(list.get(5));*/

        //使用普通for的方法去遍历list集合,使用size()和get()相结合

        for(int x = 0 ; x < list.size(); x ++){

//Object object = list.get(x) ;

            //需求:获取字符串内容同时,获取字符串长度

            String s = (String)list.get(x) ;

            System.out.println(s+"----"+s.length());

        }

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

        //获取迭代器对象

        Iterator it = list.iterator() ;

        while(it.hasNext()){

            String s = (String) it.next() ;

            System.out.println(s+"----"+s.length());

        }

    }

}

10.List集合的列表迭代器

        ListIteratorlistIterator()

        列表迭代器接口中有以下几个方法:

            booleanhasNext():判断是否有下一个可以迭代的元素(正向遍历)

            Objectnext():如果有可以遍历的元素,就获取这个元素

            booleanhasPrevious():判断是否有上一个可以迭代的元素(逆向遍历)

            Object  previous():如果有上一个可以迭代的元素,就获取上一个元素

        注意:

            要使用逆向遍历,前提必须有正向遍历存在,直接使用逆向遍历,没有意义!

importjava.util.ArrayList;

importjava.util.List;

importjava.util.ListIterator;

publicclass ListDemo3 {

    public static void main(String[] args) {

        //创建集合对象

        List list = new ArrayList() ;

        //给集合中添加元素

        list.add("hello") ;

        list.add("world") ;

        list.add("java") ;

        //获取列表迭代器

        ListIterator it = list.listIterator() ;

        while(it.hasNext()){

            String s = (String)it.next();

            System.out.println(s);

        }

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

        //boolean hasPrevious():判断是否有上一个可以迭代的元素(逆向遍历)

         //Object previous():如果有上一个可以迭代的元素,就获取上一个元素

        while(it.hasPrevious()){

            String s = (String)it.previous() ;

            System.out.println(s);

        }

    }

}

11.问题?

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

    并发(同一个时间点),并行(同一个时间段)

 java.util.ConcurrentModificationException:并发修改异常:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

    原因:当前我们用迭代器去遍历元素,使用集合添加的元素,对于迭代器不知道集合添加了这个元素,所以会发生这个异常

    描述:使用迭代器去遍历集合,是不能直接集合添加元素!

    解决方案:

            1)使用迭代器遍历集合,使用迭代器添加元素

            2)使用集合遍历,使用集合添加元素

importjava.util.ArrayList;

importjava.util.Iterator;

importjava.util.List;

importjava.util.ListIterator;

publicclass ListTest {

    public static void main(String[] args) {

        //创建List集合对象

        List list = new ArrayList() ;

        //给集合中添加元素

        list.add("hello") ;

        list.add("world") ;

        list.add("java") ;

        //获取迭代器

//Iterator it = list.iterator() ;

        //遍历

//while(it.hasNext()){

//String s = (String)it.next() ;

//判断

//if("world".equals(s)){

        //添加一个元素

//list.add("javaee") ;

//}

//}

        //方案1:1)使用迭代器遍历集合,使用迭代器添加元素

//Iterator it = list.iterator() ; 该迭代器中没有添加功能,List集合中的专有遍历方式:列表迭代器有添加功能:add(Object obj)

        //将指定的元素插入到列表中(指定元素后面插入)

        //ListIterator it = list.listIterator();

//while(it.hasNext()){

//String s = (String) it.next() ;

//判断

//if("world".equals(s)){

//使用迭代器添加

//it.add("javaee") ;

//}

//}

        //方案2:使用集合遍历(普通for循环size()和get()相结合),使用集合添加元素

        for(int x = 0 ; x <list.size() ; x++){

            String s = (String) list.get(x) ;

            //判断

            if("world".equals(s)){

                //集合添加

                list.add("javaee") ;//在末尾添加元素

            }

        }

        //输出集合

        System.out.println("list:"+list);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值