day11~12

1.Arrays:

针对数组操作的工具类  (提供了一些针对数组排序和二分搜索法)

方法:

*  public static StringtoString(int[] a):可以将int类型的数组转换成字符串 ([元素1,元素2,元素3...]形式输出)

 * public static void sort(int[] a)对指定的 int 型数组按数字升序进行排序(快排法)

 *     public static int binarySearch(int[] a,intkey):二分搜索法: int类型的数组中查找key元素的索引(用此方法前先排序再查找)

直接调用如Arrays.toString(arr)

                   Arrays.sort(arr)

-------------------------------------------------------------------------------------------------------------------------------------------------------

 

toString(int[] a)的源码

扫描二维码关注公众号,回复: 930150 查看本文章

 

以后在实际开发中,只要有引用类型,在对引用类型数据进行操作的时候,对引用类型的对象进行非空判断,

防止空指针异常(NullPointerException)

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

 

public static String toString(int[] a) {

       if (a == null) //对数组进行非空判断

           return "null";

       int iMax = a.length - 1; //arr.length-1  //a--->arr

       if (iMax == -1)

           return "[]";

 

       StringBuilder b = new StringBuilder(); //创建了一个字符串缓冲区

       b.append('[');                      //先追加了左中括号:[

       for (int i = 0; ; i++) {

           b.append(a[i]);                   //给缓冲区中追加数组中的元素

           if (i == iMax)

                return b.append(']').toString();        //返回并且并追加了右中括号:]并且将数据元素转换字符串

           b.append(", ");                                                                 //如果不是最后一个索引,那么中间追加逗号

           

          

       }

}

-------------------------------------------------------------------------------------------------------------------------------------------------------

publicstatic int binarySearch(int[] a,int key)的源码:

 public static int binarySearch(int[] a, intkey) {//a--->arr       key-->577

        return binarySearch0(a, 0, a.length,key);

    }

   

    /**

             a--->arr:指定的int类型的数组

             fromIndex:指定索引开始:0

             toIndex:arr.length5

             key:577

    */

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

     private static int binarySearch0(int[] a,int fromIndex, int toIndex,

                                     int key) {

        int low = fromIndex;     //最小索引

        int high = toIndex - 1;//  最大索引  4

 

        while (low <= high) { //如果最小索引小于=最大索引 

            int mid = (low + high) >>>1;  >>> :无符号右移动(位运算符)    //中间索引:mid = 2 ,3 ,4

                                                                                       ^:位异或

                                                                                       &:位与

                                                                                       |:位或

                                                                                       <<:左移动

                                                                                       有符合的数据表示法(原码,反码,补码)

                                                                                       计算机底层运算数据的时候:通过补码进行运算的

            int midVal = a[mid];          //      查找中间索引对应的元素:arr[2]= 57   69 80

 

            if (midVal < key)                           //判断:中间索引对应的元素 <key =577

                low = mid + 1;           //low = mid + 1;   mid = (取到最大的mid的值) 4+1 = 5

            else if (midVal > key)

                high = mid - 1;

            else

                return mid; // key found

        }

        return -(low + 1);  // key not found.    //没有找到 return  -(low+1) = -6

    }

-------------------------------------------------------------------------------------------------------------------------------------------------------

2.calendar

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

Calendar 类是一个抽象类,如何实例化?

public static Calendar getInstance() :通过一个静态功能来创建日历的对象

如:CalendarrightNow = Calendar.getInstance() ;

 

通过代码体现calendar类中字段的应用:

public classCalendarDemo {

        

         public static void main(String[] args){

                  

                   //创建日历类的对象

//               CalendarrightNow = new Calendar() ; 不能实例化   (错误写法)

                   Calendar rightNow =Calendar.getInstance() ;

                  

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

                   //获取年:publicstatic final int YEAR          

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

                  

                   //获取年中的月份:public static final int MONTH

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

                  

                   //publicstatic final int DATE :获取月份的那一天

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

                  

                   //注意:month0~11,所以要写出(month+1

                   System.out.println(year+""+(month+1)+""+date+""); //通过日历类获取当前系统时间

         }

}

-------------------------------------------------------------------------------------------------------------------------------------------------------

3. System

System 类包含一些有用的类字段和方法。它不能被实例化。

 

         常用的方法:

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

                            publicstatic void exit(int status)终止当前正在运行的 Java 虚拟机。参数用作状态码;  一般情况,需要终止         Jvm,那么参数0

                            publicstatic long currentTimeMillis()返回以毫秒为单位的当前时间

单独使用,没有意义,一般情况,来测试一段代码的执行效率

publicstatic void arraycopy(Object src,int srcPos, Object dest,int destPos, intlength)

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

         src:原数组

         dest:目标数组

         srcPos :从原数组的哪个位置开始

         destPos:到目标数组的哪个位置结束

         length:长度

 

        

 */

代码示例:

public classSystemDemo {

        

         public static void main(String[] args){

                  

                   //创建一个Person类的对象

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

                   System.out.println(p);

                  

                   //p对象不指定堆内存了

                   p = null ;

                   System.gc(); //运行垃圾回收器,实质是执行的finalize()方法

         }

}

public classPerson {

        

         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

         protected void finalize() throwsThrowable {

                   System.out.println("开始回收不用的对象了:"+this);

                   super.finalize();

         }

         -------------------------------------------------------------------------------------------------------------------------------------------------------

4.Date

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

*   构造方法:

                publicDate()表示分配它的时间(精确到毫秒)。

                publicDate(long date):创建一个日期对象,指定毫秒值      (需要将long 时间毫秒值转换成Date对象)

*   方法:

*       public long getTime()Date--->long的毫秒值

 

代码示例:

package Xk;

importjava.util.Date;

public class Datem {

              public static void main(String[] args) {

                            Date d = new Date() ;

                            System.out.println(d); //Date类型的日期格式:Wed May 0216:20:14 CST 2018

                                                                                                                //Date的文本格式: String :2018-5-2

                           

                            Date dd = new Date(3000);

                            System.out.println(dd);//Thu Jan 01 08:00:03 CST 1970

long time=d.getTime();

                            System.out.println(time);//1525249533117

              }

 

}

重点:Date的日期格式和日期的文本格式:String类型之间进行转换

 

 * Date---->String(格式化)

 

 * String-->Date(解析)

 

 * 中间的转换:使用中一个中间类:DateFormat,并且DateFormat是一个抽象类,抽象意味着不能实例化,所以应该考虑用它的子类:

 *   SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

SimpelDateFormat的构造方法:

 *   publicSimpleDateFormat(String pattern) :构造一个SimpleDateFormat对象,根据pattern(模式:规则)

  示例

 *   SimpleDateFormatsdf = new SimpleDateFormat("xxxxxxxx") ;

*  public final String format(Date date):格式化

*  public Date parse(String source):解析

 

日期和时间模式

  

 *           :                      yyyy

 *           :                      MM

 *           :                      dd

 *          

 *           :                      hh

 *           :                      mm

 *           :                      ss

代码示例:

package Xk;

 

importjava.text.ParseException;

import java.text.SimpleDateFormat;

importjava.util.Date;

 

 

public class Dateswap {

             

              public static void main(String[] args) throwsParseException {

                           

                            //Date---String:(格式化)

                            //创建一个日期对象

                            Date d = new Date() ;

                            //创建SimpleDateFormat类对象

                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd  hh:mm:ss");

                            //publicfinal String format(Date date):格式化

                            String str = sdf.format(d) ;

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

                           

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

                           

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

//           public Date parse(String source):解析

                            String strDate = "2018-6-25" ;

                            //创建SimpleDateFormat类对象

//                       SimpleDateFormatsdf2 = new SimpleDateFormat("yyyy年MM月dd日") ;(错误)

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

 

/*                       注意 :simpleDateFormat在解析文本格式的时候,里面模式(规则)一定要和文本格式的模式一直,否则就出现PareseException*/

                           

Date dd = sdf2.parse(strDate) ;

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

              }

}

5. Math

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 

 常用的方法:

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

 *              publicstatic double ceil(double a):向上取整

 *              publicstatic double floor(double a):向下取整

 *              public static int max(int a,int b):求最大值

 *              public static int min(int a,intb):求最小值

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

 *              public static double random()返回带正号的 double 值,该值大于等于 0.0 且小于 1.0

 *              publicstatic int round(float a):四射五入

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

      直接调用即可,如:

                            inta=Math.abs(-10);//a=10

 

         面试题:有两个变量,让他们的值进行互换 (考官想问的是:你能否指定位^的特点)

                   int a = 10 ;

                   int b = 20 ;

                  

                   实际开发中:中间变量的方式进行互换

                  

                   ^的特点:一个数据被另一个数据位^两次,其值是它本身

                   /*System.out.println(a^b^b);

                   System.out.println(a^b^a);*/

                  

                   System.out.println("a:"+a+",b:"+b);

                  

                   //=号左边: a ,b,a

                   //=右边: a^b

                   a = a ^ b ;

                   b = a ^ b ;//b = a^b ^ b        a=20,b=10

                   a = a ^ b ;

代码示例

package Xk;

 

public class yihuo {

 

              public static void main(String[] args) {

                            inta = 10 ;

                            intb = 20 ;

                            System.out.println("a:"+a+",b:"+b);// a:10,b:20

                           

                            //=号左边:a ,b,a

                            //=右边: a^b

                            a = a ^ b ;

                            b = a ^ b ;//b = a^b ^ b

                            a = a ^ b;

                           

                            System.out.println("a:"+a+",b:"+b); a:20,b:10

 

              }

 

}

 

         -------------------------------------------------------------------------------------------------------------------------------------------------------

6. Random

*Random:是一个可以获取随机数的类

        

 *public Random():无参构造方法

 *public Random(long seed) :指定long类型的数据进行构造随机数类对象

 

 *public int nextInt():获取随机数,它的范围是在int类型范围之内

 

 *public int nextInt(int n):获取随机数,它的范围是在[0,n)之间

例:

//创建Random类对象

                   Random r = new Random() ;

int n = r.nextInt(5) ;// 获取随机数,它的范围是在[0,5)之间

 

7.正则表达

方法:

*public static boolean matches(String regex) :

* public String replaceAll(String regex,String replacement)使用给定的replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

* public String[] split(String regex) :字符串的分割功能。按照指定的格式进行分割,分割后返回的是一个字符串数组

代码示例:

//需求:以180开头的手机号码

public class RegexDemo3 {

 

         public static voidmain(String[] args) {

                  

                   //创建键盘录入对象

        

                   Scanner sc =new Scanner(System.in) ;

                  

                   //接收数据

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

                   String phone= sc.nextLine() ;

                  

                  

                   //定义正则规则

                   String regex= "1[8][0]\\d{8}" ;

                  

                   boolean flag = phone.matches(regex) ;

                   System.out.println(flag);

         }

}

代码示例://需求:要将数字字符被替换成*

public class RegexDemo4 {

        

         public static voidmain(String[] args) {

                  

                   //定义一个字符串

                   String s ="hello12345World781323244454JavaEE" ;

                  

                  

                   String regex= "\\d+" ;

                  

                   //定义替换的字符串

                   String ss ="*" ;

                  

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

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

         }

}

代码示例

public class RegexTest2 {

        

         public static voidmain(String[] args) {

                  

                   //给定义一个字符串

                   String str ="18-24" ;

                  

                   //利用分割功能

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

                  

                   //要将String[]数组的字符串数据转换成int类型的数据:

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

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

                  

                   //键盘录入一个年龄

                   Scanner sc =new Scanner(System.in) ;

                  

                   //接收

                   System.out.println("请输入搜索的年龄:");

                   int age=sc.nextInt() ;

                   if(age>=start && age<=end) {

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

                   }else {

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

                   }

                  

         }

正则表达式的语法

字符

 

         x                          x字符

         \\                         反斜线字符

         \t                       制表符

         \n                        换行符

         \r                         回车符

        

        

字符类:

         [abc]                   ab c(简单类)

         [^abc]               任何字符,除了 ab c(否定)

         [a-zA-Z]   a z A Z,两头的字母包括在内(范围)

        

预定义字符类:

         . 任何字符              如果本身就是.                 \.                qq.com     写正则表达式(\\.)

         \d                                数字:[0-9]                                                   写正则表达式 :\\d

         \w                               单词字符:[a-zA-Z_0-9]:字母大小写,数字字符           写正则表达式         \\w

 

边界匹配器:

         ^                                   行的开头

         $                                   行的结尾

         \b                                单词边界尾(helloword?haha:world)

 

Greedy 数量词(重点)

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

         X*                               X,零次或多次

         X+                               X,一次或多次

         X{n}                     X字符恰好出现n

         X{n,}                   X字符至少出现n

         X{n,m}                         X字符至少出现n,但不超过m

         8.集合

*集合的由来?

*       学生的面向对象语言,面向对象语言对事物的描述是通过对象体现的,那么需求需要来存储多个对象.

*要存储多个对象,不能使用基本类型的变量,需要使用容器类型的变量? 学习过哪些容器变量? 数组 ,字符串缓冲区(StringBuffer)

*对于字符串缓冲区来说,在内存中始终存储的是字符串,不能满足要求;数组呢,数组的长度是固定的,不符合长度编号的要求,所有Java提供了一个Collection 集合

面试题:

            数组和集合的区别?

                 1)长度区别:

                           数组长度固定

                           集合长度可变

                 2)内容的区别

                           数组可以存储同一种类型的元素

                           集合可以存储多种类型的元素

                 3)存储类型的区别

                           数组:可以存储基本类型,也可以存储引用类型           String[]str={"hello","world","java",100}; 错误的

                           集合:只能存储引用类型

 

基本功能:

 *添加功能:

                 boolean add(Object e)

 *删除功能:

                 void clear() :删除集合中所有元素(暴力删除)

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

 *判断功能:

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

 *获取功能:

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

 

 *     boolean retainAll(Collection c) :交集功能:   A集合对B集合取交集元素  :思考

    boolean 表达的是什么意思,交集的元素是去A集合还是去B集合中?a元素

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

 删除一个算删除

 *转换功能:

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

代码示例

public class CollectionDemo {

        

         public static voidmain(String[] args) {

                  

                   //创建集合对象

//               Collection c = new Collecton() ;//不能实例化

                   Collection c = newArrayList() ;

                   System.out.println(c);

                  

                   //booleanadd(Object e) :添加元素

                   /*booleanflag = c.add("hello") ;

                   System.out.println(flag);*/

                   /**

                    * add()方法的源码

                    * public boolean add(E e) {

                 ensureCapacityInternal(size + 1);  // Increments modCount!!

                 elementData[size++] = e;

                 return true;   //只要添加就返回true

    }

                    */

                   c.add("hello");

                   c.add("world");

                   c.add("java");

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

                  

                   //删除功能:

//               c.clear();

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

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

                  

                   //booleancontains(Object o):集合中是否包含指定的元素

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

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

                  

                   System.out.println(c.size());

                   //booleanisEmpty() :判断集合是否为空

                   System.out.println(c.isEmpty());

         }

}

Iteratoriterator() :集合的迭代器方法(获取集合的迭代器)

 

 *集合的专有遍历方式:迭代器遍历

 

                 Iterator :接口中有以下的方法:

 *                       boolean hasNext() :如果有元素可以迭代,那么返回true,否则返回false

 *                       Object next()返回迭代的下一个元素。

 

 

 */存储自定义对象并遍历(使用专有遍历方式)

public class IteratorDemo2 {

        

         public static voidmain(String[] args) {

                  

                   //创建集合对象:

                   Collectionc = new ArrayList() ;

                  

                   //创建学生对象

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

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

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

                  

                   //添加集合中

                   c.add(s1) ;

                   c.add(s2) ;

                   c.add(s3) ;

                  

                   //获取迭代器

                  Iterator it = c.iterator() ;

                   while(it.hasNext()){          // 如果有元素可以迭代,那么返回true,否则返回false

                            Students = (Student)it.next() ;

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

                   }

         }

 

 interface extends Collection

 *             就可以使用Collection集合的功能

 

 

 * Collection有两个子接口:List           Set

  *List集合的特点:

        有序的 (存储和取出一致),可以允许重复元素

  *Set集合的特点:

        无序性(不能保证迭代的顺序,基于hashMap),并且元素不能重复

*/

List集合

public class ListDemo2 {

        

         public static voidmain(String[] args) {

                  

                   //创建集合对象

                  List list = new ArrayList() ;

                  

                   //存储重复元素

                   list.add("hello");

                   list.add("world");

                   list.add("hello");

                   list.add("java");

                   list.add("javaee");

                   list.add("javaee");

                   list.add("android");

                   list.add("android");

                  

                   //遍历

                  Iterator it = list.iterator();

                  while(it.hasNext()) {

                            Strings = (String)it.next() ;

                            System.out.println(s);

                   }

         }

List集合的特有功能:

 *     添加功能

                 void add(int index,Object element):在指定位置处添加指定元素

 *     获取功能

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

                 ListIterator listIterator():列表迭代器

 *     删除功能:

                 Object remove(int index):删除指定位置处的元素

 * 修改功能

                 Object set(int index, Object element):用指定element元素替换掉指定位置处的元素

 

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

 *ListIterator接口中:

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

                            Object next():获取下一个元素

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

                            Objectprevious():返回上一个元素

 *

 *逆向迭代(遍历),单独使用没意义,前提,要先正向遍历

List集合有三个子实现类:

                  

                            ArrayList

                                               底层数据结构式数组结构,查询块,增删慢

                                               从内存角度考虑:线程不安全的,不同步的,执行效率高

                                              

                                               多线程:synchronized:同步的意思                  解决线程安全问题

                                                                 sychronized(锁对象){      同步代码

                                                                                    共享数据;       

                                                                 }

                                                                

                                               解决线程安全问题,通过同步可以解决,但是效率低了...

                           

                            LinkedList

                                               :底层数据结构式链表结构,查询慢,增删块

                                               从内存角度考虑:线程不安全,不同步,执行效率高

                           

                            Vector:

                                               这是一个线程安全的类,

                                               底层数据结构是数组:查询快,增删慢

                                               线程安全的,同步,执行效率低!

 

猜你喜欢

转载自blog.csdn.net/mr_l_h/article/details/80169568