Day15(StringBuffer,Arrays,Date,Math,package,Random)

一、StringBuffer的特点:

         1、线程安全的

              不安全,就是存在同步操作同一数据的行为,效率高

              安全的时候,没有同步操作,效率低。

              在实际开发中,效率和安全这两个问题一直都是很难平衡的问题

          生活中的例子:

                线程安全的例子:银行的一些业务,电影院卖票,医院取号

                线程不安全的例子:视频会员,博客评论

         2、线程安全的,StringBuffer是一个可变序列

         3、StringBuffer又称之为字符串缓冲区,就是把它当作一个字符串去操作,只不过它与String相比是可以修改内容的

         4、在任何时间地点,它包含着一些特定的字符序列,但是可以通过某些方法修改这些字符序列的长度和内容

         简单记忆:StringBuffer是一个线程安全的可变序列

面试题:StringBuffer和String的区别:

        1、StringBuffer的长度和内容都是可以改变的,String却不行

        2、String每创建一个新的字符串都会开辟一个新的常量池区域

              StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新开辟空间

StringBuffer的构造方法:

        public StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符

        public StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量

        public StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区

        public class StringBufferDemo1{

        public static void main(String[] args){

          //public StringBuffer()构造一个梦没有字符的字符串缓冲区,初始容量为16个字符

          StringBuffer sb1 = new StringBuffer();

          System.out.println("sb1:" + sb1);//StringBuffer重写了toString方法

          //如何获取StringBuffer的容量

          //public int capacity()返回当前容量

          System.out.println("当前StringBuffer的容量为:"+ sb1.capacity());

          //public int length()返回长度(字符数)

          System.out.println("StringBuffer中字符串的长度为:" + sb1.length());

          Syatem.out.println("===========================================");

          //public StringBuffer(int capacity)构造一个没有字符的字符串缓冲区和指定的初始容量

           StringBuffer sb2 = new StrngBuffer(50);

           System.out.println("sb2:" + sb2);//StringBuffer重写了toString方法

          //如何获取StringBuffer的容量

          //public int capacity()返回当前容量

          System.out.println("当前StringBuffer的容量为:" + sb2.capacity());

          //public int length() 返回长度(字符数)

         System.out.println("StringBuffrer中字符串的长度为:" + sb2.length());

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

          //public StringBuffer(String str)构造一个初始化为指定字符串内容的字符缓冲区

         StringBuffer sb3 = new StringBuffer("hello");

         System.out.println("sb3:"+ sb3);//StringBuffer重写了toString方法

         //如何获取StringBuffer的容量

        //public int capacity()返回当前容量

        System.out.println("当前StringBuffer的容量为:" + sb3.capacity());//21 = 6 + 5

        //public int length()返回长度(字符数)

        System.out.println("StringBuffer中字符串的长度为:" + sb3.length());//5

    }

}

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

StringBuffer的添加功能:

     public StringBuffer append(String str)

        通过观察API发现,不光可以追加字符串,还可以是任意数据类型的追加到StringBuffer中

        返回StringBuffer是什么呢?

           public StringBuffer insert(int index,String str)

public class StringBufferDemo2{

     public static void main(String[] args){

         //创建一个StringBuffer对象

         StringBuffer sb = new StringBuffer();

          //public StringBuffer append(String str)

          StringBuffer stringBuffer = sb.append("hello");

          System.out.println(stringBuffer);

          System.out.println(sb);

          System.out.println(sb == stringBuffer);

//         sb.append(10);

//         sb.append('a');

//         sb.append(true);

//         sb.append(12.34);

//        无论追加的数据是什么类型,一旦进入到StringBuffer中就是成了字符串

//        System.out.println(sb);

//        System.out.println(stringBuffer);

//        链式编程

           sb.append(10).append('a').append(true).append(12.34);

           System.out.println(sb);

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

          //hello 10atrue12.34

         //public StringBuffer insert(int offset,String str)

         //将字符串插入到此字符序列中,返回的是字符串缓冲区本身

        //String参数的String按顺序插入到指定偏移量的该序列中,向上移动原始位于该位置上的1任何字符

         //并将该序列的长度增加到参数的长度

         sb.insert(5,"hadoop");

         System.out.println(sb);

         //如果str是null,则四个字符"null"被插入到该序列中

         // sb.insert(5,null);

         Object o = null;

         sb.insert(5,o);

         System.out.println(sb);

    }

}

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

   remove,move,delete,drop,turncate

   StringBuffer的删除功能

      public StringBuffer deleteCharAt(int index) 删除指定索引处的字符。该序列缩短了一个char

      public StringBuffer delete(innt start,int end)

public class StringBUfferDemo3{

     public static void main(String[] args){

           //使用带参数的构造方法创建StringBuffer对象

           StringBuffer sb = new StringBuffer("bigdata");

           System.out.println("未做删除操作之前的StringBuffer:" + sb);

 //        StringBuffer sb2 = sb.deleteCharAt(3);//操作的是同一个StringBuffer对象

//         System.out.println(sb);

//         System.out.println(sb2);

//         System.out.println(sb == sb2);

           sb.deleteCharAt(3);

           System.out.println("做删除操作后的StringBuffer:" +sb);

           //如果index为负数或大于等于length()

          //index的值最大可以取到实际存储字符的长度-1

//         sb.deleteCharAt(30);

//         sb.deleteCharAt(6);

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

            //public StringBuffer delete(int start,int end)

            //删除此序列的子字符串中的字符

           //字串开始于指定start并延伸到字符索引end-1,或如果没有这样的字符存在的序列的结束

          //如果start <= index<end

          //bigdata

  //       sb.delete(2,5);

//         sb.delete(2,6);

//         sb.delete(2,10);

//   注意开始位置一定是已经存在的索引,否则报错

//         sb.delete(8,10);

           System.out.println(sb);

           //需求:删除StringBuffer中的所有字符

           sb.delete(0,sb.length());

           System.out.println("删除StringBuffer中的所有字符:" + sb);

    }

}

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

StringBuffer替换功能

    public StringBuffer replace(int start,int end,String str)

    用指定的String中的字符替换此序列的子字符串中的String

   子串开始于指定start并延伸到字符索引end-1,或如果没有这样的字符序列存在的序列的结束

   第一字串中的字符被去除,然后指定String被插入在start

public class StringBufferDemo4{

    public static void main(String[] args){

        //创建一个String Buffer对象

        StringBuffer sb = new StringBuffer();

        //往StringBuffer中添加内容

        sb.append("java").append("mysql").append("hadoop").append("hive").append("spark").append("flink");

        System.out.println(sb);

        //public StringBuffer repalce(int start,int end,String str)

        sb.repalce(5,10,"数加学院真好");

        System.out.println(sb);

    }

}

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

StringBUffer的反转功能:

        public StringBuffer reverse()

        导致该字符序列被序列的相反代替

        如果序列中包含任何替代对,则将他们视为单个字符进行反向操作

public class StringBufferDemo5{

      public static void main(String[] args){

          StringBuffer sb = new StringBuffer();

          sb.append("我爱你中国");

          System.out.println("反转之前:" +sb);

          System.out.println("反转之后:" );

           StringBuffer sb2 = sb.reverse();//操作的是同一个StringBuffer对象

           System.out.println(sb);

           System.out.println(sb2);

     }

}

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

StringBuffer的截取功能:

    public String substring(int start)

    返回一个新的String,其中包含此字符序列中当前包含的字符的子序列

   public String substring(int start,int end)

   返回一个新的String,其中包含此序列中当前包含的字符串的子序列。子串起始于指定的start,并扩展到索引号为end-1

public class StringBufferDemo6{

    public static void main(String[] args){

         StringBuffer sb = new StringBuffer();

         sb.append("java")

                .append("mysql")

                .append("hiva")

                .append("ETL")

                .append("spark")

           System.out.println(sb);

           //public String substring(int start)

          //不会改变原来StringBuffer中的数据

          //返回值是一个String类型的数据

          String s1 = sb.substring(4);

          System.out.println("截取的内容是:" + s1);

          System.out.println("StringBuffer的内容为:" + sb);

       // public String substring(int start,int end)含头不含尾 [start,end)

       // javamysqlhiveETLspark

        String s2 = sb.substring(9,13);

        System.out.println("截取的内容是:" + s2);

        System.out.println("StringBuffer的内容为:" + sb);

    }

}

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

为什么要进行相互转换?

   A-->B将A转换成B,是为了使用B中特有的功能

   B-->A再将B转换成A,可能是引用最终的结果需要的是A类型的数据,所以还得转换回来

   String与StringBuffer之间的转换

public class StringBufferDemo7{

     public static void main(String[] args){

          //String-->StringBuffer

           String s = "hello";

  //        StringBuffer sb = s;

 //    java:不兼容的类型:java.lang.String无法转换为java.lang.StringBuffer

//          StringBuffer sb = "hello";

    //      方式一:通过构造方法转换

            StringBuffer sb1 = new StringBuffer(s);

            System.out.println(s);

            System.out.println(sb1);

     // 方式二:通过append()

              StringBuffer sb2 = new StringBuffer();

               sb2.append(s);

                System.out.println(s);

                System.out.println(sb2);

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

          //     StringBuffer-->String

                  StringBuffer sb3 = new StringBuffer("bigdata");

            //    方法一:toString()方法

             String s1 = sn3.toString();

             System.out.println(sb3);

             System.out.println(s1);

             // 方式二:subString

             String s2 = sb3.substring(0);

             System.out.println(s2);

             System.out.println(sb3);

            //   方式三:String类的构造方法

            //String(StringBuffer buffer)

            //分配一个新的字符串,其中包含当前包含在字符缓冲区参数中的字符序列

            String s3 = new String(sb3);

            System.out.println(s3);

            System.out.println(sb3);

       }

}

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

把数组拼接成一个字符串(用String Buffer实现)

public class StringBufferTest1{

      public static void main(String[] args){

           char[] chars = {'a','b','c','d'};

           //创建一个空的StringBuffer对象

           StringBuffer sb = new StringBuffer();

           //遍历数组得到每个字符

           for(int i=0;i<char.length;i++){

               sb.append(char[i]);

           }

           //将字符缓冲区转换成一个字符串

           String s = sb.toString();

           System.out.println(s);

     }

}

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

面试题1:String,StringBuffer,StringBuilder之间的区别

              a、StringBuffer是线程同步安全的,数据安全效率低

                   StringBuilder不是线程同步安全的,数据不安全,效率高

              b、String的内容是不可改变的,String Buffer和StringBuilder是可变序列

              c、StringBuffer中方法上有synchronized关键字

面试题2:String Buffer和数组的区别?

他们都是可以被看作是一个容器,装一些数据

但是,StringBuffer里面的数据都是一个一个字符

数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据

看程序写结果:

        探究String作为参数传递与StringBuffert作为参数传递的区别

public class StringBufferDemo8{

     public static void main(String[] args){

       //创建一个StringBuffer的对象

//        StringBuffer stringBuffer = new StringBuffer();

//      创建一个StringBuilder的对象

//      StringBuilder stringBuilder = new StringBuilder();

        String s1 = "hello";

        String s2 = "world";

        System.out.println("s1:" + s1 +",s2:" + s2);

        change(s1,s2);

        System.out.println("s1:"+ s1+ ",s2:" + s2);

        Ssytem.out.println("=================================================");

         StringBuffer sb1 = new StringBuffer("hello");

         Stringbuffer sb2 = new StringBuffer("world");

         Systm.out.println("sb1:" + sb1 +",sb2" + sb2 );//hello world

         change(sb1,sb2);

         System.out.println("sb1:" + sb1 + ",sb2" + sb2);//sb1:hello,sb2:worldworld

          //当多个StringBuffer作为参数传参的时候,谁发生了操作,谁就会受到影响

}

public static void change(StringBuffer sb1 ,StringBuffer sb2){

       sb1 = sb2;

       sb2.append(sb1);

       System.out.println("sb1:" + sb1 + ",sb2:" + sb2);

        //sb1:world world sb2:worldworld

}

public static void change(String s1, String s2){

       s1 = s2;

       s2 = s1 +s2;

       System.out.println("s1:" + s1+ ",s2:" + s2 );

    }

}

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

二、Arrays针对于数组做操作的类,该类包含用于操作数组的各种方法(如排序和搜索)

        public static String toString(int[] a)

        public static void sort(int[] a)

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

import java.util.Arrays;

public class ArraysDemo{

     public static void main(String[] args){

          //定义一个数组

          int[] arr = {21,32,44,1,4,89,16};

          //public static String toString(int[] a)

          //将数组转换成一个字符串

          //System.out.println(arr);

          String s = Arrays.toString(arr);

          System.out.println(s);

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

          //public static void sort(int[] a)

          Arrays.sort(arr);

          System.out.println("排序后的数组为:" + Arrays.toString(arr));

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

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

         //[1,4,16,21,32,44,89]

         //二分查找的前提是数组本身是排过序的

         System.out.println("二分查找32:" + Arrays.binarySearch(arr,32));

         System.out.println("二分查找32:" + Arrays.binarySearch(arr,100));//-8

     }

}

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

三、Date:日期类

     构造方法:

          Date() 分配一个Date对象,并初始化它,以便它代表它被分配的时间,测量到最近的毫秒

     日期格式化:SimpleDateFormat

import java.text.SimpleDateFormat;

import java.util.Date;

public class DateDemo{

     public static void main(String[] args){

         Date date = new Date();

         System.out.println(date);//系统时间

         //由于我们经常看到的时间不是这样的,应该是年,月,日,时分秒

        //日期的格式化

        //SimpleDateFormat(String pattern)

        //使用给定模式SimpleDateFormat并使用默认的FORMAT语言环境的默认日期格式符号

        /*

             yyy:年

             MM:月

             dd:日

             HH:24小时制度

             hh:12小时制度

             mm:表示分钟

             ss:表示秒

         */

          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd EEE a hh:mm:ss");

          String s = simpleDateFormat.format(date);

          System.out.println(s);

     }

}

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

四、Math:Math类包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数

         public static int abs(int a)

         public static double ceil(double a)

         public static double floor(double a)

         public static int max(int a,int b)  //min

         public static double pow(double a,double b)

        public static double random()

        public static int round(float a)//参数为double

        public static double sqrt(double a)

public class MathDemo{

     public static void main(String[] args){

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

          int num1 = Math.abs(-10);

          System.out.println(num1);

          //public static double ceil(double a)

          double num2 = Math.ceil(12.04);

          Systenm.out.println(num2);

          //floor

          double num3 = Math.floor(12.84);

          System.out.println(num3);

          //public static double sqrt(double a)

          //public static double sqrt(double a)返回double值正确舍入的正平方根

          double num4 = Math.sqrt(3);

          System.out.println(num4);

      }

}

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

五、包装类:

    1、需求1:有100这个数据,计算出他的二进制,八进制,十六进制

          需求2:如何使用代码求出int类型数据范围

          通过观察需求后发现,我们得出原本的基本数据类型无法调用任何方法和属性,怎么办呢?

      为了对基本数据类型进行操作,更方便的操作,Java就针对每一个基本数据类型都提供了一个对应的类类型

       我们称之为包装类类型

      包装类类型:

                  byte           Byte

                  short         Short

                  int             Integer

                  long           Long

                  float          Float

                  double       Double

                  char           Character

                  boolean     Boolean

public class PackageClassDemo1{

      public static void main(String[] args){

           //Integer:Integer类包装一个对象中的原始类型interesting的值

           //public static String toBinaryString(int i)在基数2中返回整数参数的字符串表示形式为无符号整数

           //求出int数据类型的二进制

           String s = Integer.toBinaryString(100);

           System.out.println("100的二进制为:" + s);

           //static String toHexString(int i)

          // 返回整数参数的字符串表示形式,作为16位中的无符号整数

          String s1 = Integer.toHexString(100);

          System.out.println("100的十六进制为:" + s1);

          //static String toOctalString(int i)

          //在基数8中返回整数参数的字符串表示形式为无符号整数

          String s2 = Integer.toOctalString(100);

          System.out.println("100的八进制为:" + s2);

          //如何用代码求出int类型数据范围

          //ststic int MAX_VALUE

          //一个持有最大值的一个int可以有2^31-1 

          int maxValue = Integer.MAX_VALUE;

          System.out.println("int类型数据的最大值为:" + maxValue);

          System.out.println("int类型数据的最小值为:" + minValue);

     }

}

二、包装类一般是用于基本数据类型与字符串之间的转换

       int类型的数据与String类型做互相转换

       int-----String

            static String valueOf(int i)返回int参数的字符串int形式

       String----Integer----int

            public static int parseInt(String s)将字符串参数解析为带符号的十进制整数

public class PackageClassDemo2{

     public static void main(String[] args){

          //int--String

         int num == 100;

         //方式一:static String valueOf(int i)返回intt参数的字符串int形式

         String s = String.valueOf(num);//100--->"100"

         System.out.println(s);

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

         //方式二:int--Integer--String

         //   String string = new String(num);

         // Integer(int value)构造一个新分配的Integer对象,该对象表示指定的int值

         Integer integer = new Integer(num);

         System.out.println(s1);

         方式三:字符串拼接

         String s2 = " " +num;

         System.out.println(s2);

         方式四:public static String toString(int i)

         String s3 = Integer.toString(100);

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

         //String ---->int

         String s4 = "200";

        // 方式1:String -- Integer--int

        // Integer(String s)

        //构造一个新分配Integer对象,表示int由指示值String参数

         Integer integer1 = new Integer(s4);

         System.out.println(integer1);

         //public int inValue()将Integer的值作为int

         int number = integer1.inValue();

         System.out.println(number);

         int i = integer1;//在包装类中称之为自动拆箱

         integer i2 =300;//在包装类中称之为自动装箱

     }

}

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

三、Java中专门生成随机数的类:Random

           public Random()

           public Random(long seed)

import java.util.Random;

public class RandomDemo{

     public static void main(String[] args){

          //public Random();

          Random random = new Random();

      //  int i = random.nextInt();

      //  System.out.println(i);

           int i = random.nextInt(10) + 1;//0 - 9

           System.out.println(i);

           //public Random(long seed);

          // Random random1 = new Random(10000000000000L);

        }

}

    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘浩浩yyds

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

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

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

打赏作者

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

抵扣说明:

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

余额充值