Java SE学习总结 Day (15)

Day 15开篇:
      
        "
今天java基础主要学习了StringBuffer,包装类,工具类合集,StringBuffer和String的区别,String 转 StringBuffer,StringBuffer 转 String, Random类等。 "



知识点反馈:

今天的知识点总结的思维导图


 
 

一.StringBuffer
1. 定义:
线程安全的可变字符串,一个类似于String的字符串缓冲区
2. 线程安全(多线程的会具体的描述):
(1) 线程安全:意味着是同步数据,同样也意味效率会比较的低
(2) 线程不安全: 意味着是不同步数据,同样也意味着效率会比较高
3. 注意:
在开发当中,同步或者不同步一直是困扰着我们一个问题。
你到底是安全还是效率?这两者是不可兼得的
一般来说考虑你的业务环节:
        需要同步的网站:银行网站、医院网站
        不需要同步的网站:新闻网站、LOL官网
4. StringBuffer和String的区别:
StringBuffer的一个内容可变的,而String是不了变的
5. StringBuffer构造:
(1)StringBuffer():无参构造
(2)StringBuffer(int capacity):就是构建一个指定大小缓冲区的字符串缓冲区对象
(3)StringBuffer(String str):构建一个带有字符串的字符串缓冲区对象
6.StringBuffer的常用方法:
(1)int capacity():返回当前字符串缓存区容量大小(默认容量是16)
(2)int length():返回字符串的长度
7.StringBuffer sb3 = new StringBuffer("hello");
sb3.capacity()为什么返回的是21而不是16;
字符串缓冲区的大小,固定最小是16,如果有新的数据进来,这个16大小属于保留,并不会占用。 所用新数据的进来是在原来的16的基础上+新字符串的字节大小。
8. StringBuffer其实底层维护还是一个字符数组
9. StringBuffer如何添加数据:
(1)在创建对象的时候,通过构造添加数据
(2)StringBuffer append(String str):将任意数据类型插入,全部会转换为String类型插入到StringBuffer缓冲区当中,返回的是缓冲区本身
(3)tringBuffer insert(int off,String str):在指定位置(索引)将指定的数据进行插入
10. StringBuffer的删除功能:
(1)StringBuffer deleteCharAt(int index):根据指定索引位置进行删除,返回本身
(2)StringBuffer delete(int start,int end):从指定位置开始到指定位置结束删除
11. StringBuffer的替换功能:
StringBuffer replace(int start,int end,String str):从指定位置开始,到指定位置结束,替换什么内容
12. StringBuffer的反转功能:
StringBuffer reverse();将字符串进行反转
13. 注意:这里并不会继续返回StringBuffer,返回的是String,同时也意味着截取的过程并不会改变StringBuffer的实际数据
String substring(int start);从指定位置开始,到末尾的截取
String substring(int start,int end):从指定位置开始到指定位置结束的截取
14. String 转 StringBuffer:
方式一:
        StringBuffer sb = new StringBuffer(str);
方式二:
        StringBuffer sb2 = new StringBuffer();
        sb2.append(str);
15. StringBuffer 转 String
方式一:
        StringBuffer sb2 = new StringBuffer();
        String str = new String(sb2);
方式二:
         String str1 = sb.toString();
16. 面试题:
面试的经历中,相信大家都经常被问到这三者的区别,
说到String我相信绝大多数的人都会说:"String是不可变的,final修饰的",
你会看到面试官微微猥琐一笑
接着问到:“final修饰的类就是不可变的吗,那StringBuilder和StringBuffer不是final修饰的?”
 
应该怎么解释?
String指的不变其实是内存中的问题,如果一个数据在常量不存在则创建新的空间。
这个不可变其实说的是常量池的处理机制,也不是完全不可变,只要常量池已经存在需要变化的数据
同样不会对效率有任何的影响。
StringBuffer,其实主要的的变化还是取决于缓冲区,这个缓冲区其实就是字符数组进行维护的。
而所谓的可变都是数组的特性决定的,而当数组长度不够时会自动的扩展,这个扩增其实就是数组拷贝的一个过程。
 
            
String,StringBuffer,StringBuilder的区别 ?
            
1.String的内容是不了变的,而StringBuffer和StringBuilder是内容可变的
            
2.StringBuffer是线程安全的,所以效率比较低
            
3.StringBuilder是线程不安全的,所以效率比较高
 
 
 
二.包装类
1. 定义:
其实现的结果和基本数据类型一模一样的。而且相互之间完全兼容的进行相互转换,包装类还提供了基本数据类型不具备的功能和属性。
2.基本数据类型:         包装数据类型:
    byte                                 Byte
    short                               Short
    int                                   Integer
    long                                Long
    float                               Float
    double                           Double
    char                              Character
boolean                        Boolean
3.Integer的构造:
Integer(int value):构造一个新分配的 Integer 对象,它表示指定的 int 值。
Integer(String s):构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值
注意:必须保证String是一个整数
4. int和String相互转换的问题:
例子:
public class IntegerDemo02 {
    public static void main(String[] args) {
        int a = 100;
        //转换为String
 
        //方式一
        String s = ""+a;
        System.out.println(s);
 
        //方式二
        String s1 = String.valueOf(a);
        System.out.println(s1);
 
        //方式三
        //int -> Integer -> String
        Integer i = new Integer(a);
        String s3 = i.toString();
 
        //方式四
        String s4 = Integer.toString(a);
        System.out.println("----------------");
        //String转int
        String str = "100";
        //方式一
        Integer i5 = new Integer(str);
 
        //方式二
        int i6 = i5.intValue();
 
        //方式三
        int i7 = Integer.parseInt(str);
 
    }
}
5. JDK5的自动拆装箱机制:
(1)装箱:基本数据类型转换成包装数据类型
(2)拆箱:包装数据类型转换成基本数据类型
(3)例子:
public class IntegerDemo03 {
public static void main(String[] args) {
        Integer i = new Integer(19);//没必要
 
 
        Integer i1 = 10;//可以像int一样进行赋值(自动转箱)
        //其实通过底层源码得到
        //Integer i1 = Integer.valueOf(10);
        i += 200;
        // i = Integer.valueOf(i.intValue() + 200);
 
        System.out.println(i1);
 
        Integer i2 = null;//NullPointerException
        //在给Integer赋值的情况,一般先判空
        if (i2 != null) {
            i2 += 100;
            System.out.println(i2);
        }
 
        int i3 = i1;
        //int i3 = i1.intValue();
        System.out.println(i3);
}
}
 
6. 注意事项:
(1)通过jdk5的新特性,自动拆装箱进行赋值(Integer i = 120),这种方式并不会创建出来。 (2)Integer在赋值期间有一个默认缓冲区大(-128~127),如果我们赋值的数据在缓冲区范围内,则不会创建新的空间,直接使用缓冲区的数据,如果你赋值的数据,超出缓冲区的范围,则会新开辟一款新的堆空间用于存储,所有会产生不同的地址值。
 
三.工具类合集
1. BigDecimal:
(1)定义:
因为运算的时候,float和double类型非常容易丢失精度,为了更加精确的计算、表示浮点数数据,Java提供了一个高精度运算类:BigDecimal。
(2)构造方法:
BigDecimal(String val):将一个字符串的浮点数或者整数类型转换为BigDecima
(3)成员方法:
对应的加减乘除请自行参考BigInteger(命名和参数全部一致)
2. BigInteger:
(1)作用:可以使超出int访问的数据进行继续运算
(2)构造方法:
BigInteger(String val):将一个整数类型的字符串转换为BigInteger
(3)成员方法:
<1>BigInteger        multiply(BigInteger val):两个big进行相乘
<2>BigInteger        subtract(BigInteger val):两个数进行相减
<3>BigInteger        divide(BigInteger val):两个数进行相除
<4>BigInteger        add(BigInteger val):两个数进行相加
3. Calendar:
(1) 概念:
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法, 并为操作日历字段(例如获得下星期的日期)提供了一些方法
(2)成员方法:
<1>int        get(int field):(具体参考常量字段)
返回给定日历字段的值, 1 = 年,2 = 月,3 = 日,.....
<2>abstract void        add(int field, int amount) :返回给定日历字段的值
4. Date类:
(1) 概念:
类Date表示特定的瞬间,精确到毫秒。(这个类是是在util下面,不是sql下面)
(2) 构造方法:
<1>Date():根据当前时间的毫秒值来创建Date对象
<2>Date(long date):根据指定的毫秒值来创建日期对象(鸡肋)
(3) 成员方法:
<1>long getTime():获取当前时间以毫秒值为单位
<2>void setTime(long time):设置时间
(4) Date的默认时间是:1970-01-01 00:00:00
5. DateFormat:
(1) 概念:
这是一个抽象类,本身不具备实例化是特性,但是是他是对时间进行格式化的一些操作
(2) DateFormat的直接子类:
SimpleDateFormat:他其实就是对一个Date的时间类格式进行格式化的解析
(3) 格式化:
Date(时间格式我们不喜欢)  转换为想要的格式(格式化)
String        format(Date date)
(4) 解析:
一个标准时间的字符串,转换成时间类(解析)
String date = "2019年08月05日16:42:57"
Date parse(String source)
6. Math类:
(1) 作用:
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数
(2) 成员方法:
<1>static double abs(double a)
<2>static double ceil(double a)
<3>static float max(float a, float b)
<4>static double pow(double a, double b)
<5>static double        random()
7. Random类:
(1)构造方法:
<1>Random()创建一个新的随机数生成器
<2>Random(long seed) 使用单个 long 种子创建一个新的随机数生成器
(2)成员方法:
<1>public int nextInt()
<2>public int nextInt(int n)(真正需要用到的)
(3)作用:
此类的实例用于生成伪随机数流
8. System系统类:
(1)概念:
System 类包含一些有用的类字段和方法。它不能被实例化
(2)常用方法:
<1>static void        gc():运行垃圾回收(只是通知作用,gc并不受他控制)
<2>static void        exit(int status):终止当前正在运行的 Java 虚拟机。0表示主动退出,非0表示意外退出(可以自己写,系统也能给您补充)
<3>static long        currentTimeMillis():获取当前时间的毫秒数
<4>static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):
                             Object src:源数组
                             int srcPos:从什么位置开始拷贝
                             Object dest:目标数组
                             int destPos:从什么位置开始赋值
                             int length:一次拷贝多少个


 

发布了29 篇原创文章 · 获赞 7 · 访问量 3167

猜你喜欢

转载自blog.csdn.net/weixin_45406656/article/details/104241507