java基础之扩展相关类

1、file文件类

对应文件系统里的文件和文件夹

文件系统的每一个文件和文件夹都可以映射为一个file对象

注意:file对象对应文件系统的文件或文件夹可以不存在

2、创建file对象

   File(String pathname)        文件及文件夹路径创建

    File(String parent, String child)     文件及文件夹的父目录路径 加文件及文件夹名字创建

pathname:文件或文件夹的路径

绝对路径:直接从磁盘根目录开始写如    d:\\ dd\test.txt  c:\\a.rar

相对路径 :  相对某个位置的填写的路径    src\day15\fileTest\test1.ttt  src\day14

  直接写路径    也是  相对当前项目位置

名称分割符

    window 可以 '\\'或 '/'

    file类 separator  常量

    file类 separatorChar 常量

3、通过file对象创建文件或文件夹

      createNewFile()    文件系统中创建文件

      delete()    文件系统中删除文件或文件夹

      mkdir()     文件系统中创建文件夹

      mkdirs()    文件系统中创建文件夹及父辈目录

4、通过file对象获取对应的文件或文件夹的信息

   public boolean exists()     是否存在

    public boolean isDirectory() 是否是文件夹

    public boolean isFile()    是否是文件

    public boolean isHidden() 是否隐藏

    public String getName()     文件名字,包含后缀

    public String getPath() 文件路径(如果是相对路径构造的file返回相对路径)

    public String  getAbsolutePath   文件绝对路径 

   public String[] list()     子文件名字数组

    public File[] listFiles()    子文件file对象数组
    public boolean canRead()    是否可读 --window不能设置

    public boolean canWrite() 是否可写

    public long lastModified()  最后修改时间(毫秒)

    public long length() 文件的长度,内容长度,不是文件名的长度 单位是字节

1、包装类的作用

 1)、以面向对象操作数据

java容器类:存储的是引用类型(对象)

数组:    存储的是引用类型(对象)加基本类型

容器类不能存储基本类型,泛型参数不能用基本类型,怎么办?

通过包装类解决!

所有基本类型都对应了包装类

 2)、大量方法和属性方便操作基本类型的数据

      类型转换, 最大值,最小值等

 2、所有包装类

  byte   -->Byte

  short  -->Short

  int  -->Integer

  long   -->Long

  float  -->Float

  double -->Double

  char  -->Character

  boolean -->Boolean

 注意:除了 int 与 char 外其他的都是第一个字母大写

3、装箱和拆箱

a)装箱 基本数据类型 转为 包装类型---》例如: int -->Integer

自动装箱(编译时完成)

    编译时自动使用:Integer.valueOf() 方法

    例如:  Integer num =1;  等价于---》Integer num =Integer.valueOf(1);

      注意!!-128到127数字的自动装箱会利用缓冲池,其他范围直接创建新的对象。

b) 拆箱 包装类型 转为 基本数据类型---》 例如:Integer -->int 
自动拆箱(编译时完成)

    编译时自动使用: intValue()方法

    例如:

    Integer num =new Integer(1);

    int num2 = num; 等价于---》int num2 = num.intValue()

c)自动拆箱注意

    自动拆箱的对象不能为null,否则null调用对象方法

   产生 NullPointerException

4、常量缓冲池(注意其位置在堆中,字符串常量缓冲池在方法区)

//Integer 有缓冲池范围是-128到127

  //byte short char long 都有

  Byte b;// 缓冲池范围是-128到127

  Short s;// 缓冲池范围是-128到127

  Long l;// 缓冲池范围是-128到127

  Character c;// 缓冲池范围是0到127

创建Integer对象

a)Integer.valueOf(1);会利用缓冲池

b)new Integer(1);不会利用缓冲池

4、Integer和int区别

a)int 装的值 在栈中

b)Integer 装的值 在堆中,通过引用变量指向堆中的值

c)Integer 有个特殊值 null,此时不能转换为int,否则nullPointException

5、常用api

a)通过 基本类型包装类型   

   ValueOf(利用缓冲池) 

   new 构造器也可以(不利用缓冲池)

b)把包装类型基本类型   intValue,longValue ,byteValue....

c)字符串类型当前包装类型对应的基本类型parseInt parseLong.... new 构造器

d)可以查看基本类型的最大值 MAX_VALUE ,最小值 MIN_VALUE 等常量

6、总结

    1)通常情况下,我们可以不直接定义包装类型数据---》因为基本类型和包装类型可以自动装箱和拆箱(编程完成)。

    2)包装类型比基本类型多了null值

    3)对于局部变量:基本类型的值存储在栈中,包装类型装的值在堆中。

1、时间相关类结构

2、类介绍

a)核心重点类

1)java.util.Date 具体类,jdk1.1前老版时间类

2)java.util.Calendar 抽象类,jdk1.1后新版时间类

3)java.text.DateFormat 抽象类,时间格式化类型

b)其他类

1)timezone类   :时区相关类

2)java.sql下的时间类:用于jdbc对应sql数据库里字段的类

3、java.util.Date相关Api

a)创建date对象  

当前系统时间

      Date()

     通过指定的年月日创建时间对象

     year - 减 1900 的年份。

     month - 0-11 的月份。

     date - 一月中 1-31 之间的某一天。

     Date(int year, int month, int date)

     通过制定的年月日 时分秒创建时间对象  

     Date(int year, int month, int date, int hrs, int min, int sec)

            通过1970到指定时间的毫秒数创建时间对象

     Date(long date)

            通过格式字符串创建时间对象

     Date(String s)

            把字符串转换为时间的毫秒数

     parse(String s)

b)设置或获取时间相关字段(时分秒等等)的值

1)获取

getDate() 月里的某一天

   int getDay() 周里的某一天

   int getHours() 小时

   int getMinutes() 分钟

   int getMonth() 月

   int getSeconds() 秒

   int getYear() 秒

  long getTime() 转换为1970到该时间的毫秒数 

2)设置

   void setDate(int date)

      void setHours(int hours)

   void setMinutes(int minutes)

     void setMonth(int month)

       void setSeconds(int seconds)

      void setTime(long time)

      void setYear(int year

c)时间比较

    boolean after(Date when)

           测试此日期是否在指定日期之后。

      boolean before(Date when)

           测试此日期是否在指定日期之前。

      compareTo(Date anotherDate) 比较返回正数0负数

       equals(Object obj) object中重写的

4、java.text.DateFormat相关Api

a)创建对象

通过(时间格式模式字符串)创建对象,参考SimpleDateFormat中api

DateFormat是抽象类,不能直接实例化 

1)通过DateFormat 静态方法 返回DateFormat来创建对象!这种不好定制格式

2)通过子类SimpleDateFormat(String pattern)创建

b)时间转字符串

String format(Date date)

c)字符串转时间

Date parse(String source)

5、Calendar 常用api

a)创建对象

Calendar 是抽象的,不能直接实例化

  1)通过Calendar中静态方法getInstance系列返回自己的对象

  2)通过创建子类GregorianCalendar 对象

  当前时间

  GregorianCalendar()

  指定年月日时间

  GregorianCalendar(int year, int month, int dayOfMonth)

  指定年月日,时分秒时间

  GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)

b)表示当前时间的对   

new Date()

      当前时间

     System.currentTimeMillis()

     当前时间

     Calendar.getInstance();

     当前时间

     GregorianCalendar()

c)Calendar 和date转换

    Calendar 和Date都可以表示时间精确到毫秒

    Calendar的getTime()可以转换为Date

    Calendar的setTime(Date date)可以吧Date转换为Calendar

d)设置或获取时间相关字段(时分秒等等)的值

1)获取值 

      int get(int field)

     //field代表了具体的要查询的时间字段,该值在Calendar常量中有定义

     Calendar 常量中提示有set get描述的常量,在其对象方法的int field参数都可以使用

  getMaximum 返回此 Calendar 实例给定日历字段的最大值。

例如:2月最大月天数,返回31

  getMinimum 返回此 Calendar 实例给定日历字段的最小值。

  getActualMinimum    给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值。

  getActualMaximum    给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值。

例如:2月最大月天数,返回28

    getTime 转换Date时间

   getTimeInMillis转换毫秒   

 2)设置值

    void set(int field, int value)

            将给定的日历字段设置为给定值。

   void set(int year, int month, int date)

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

   void set(int year, int month, int date, int hourOfDay, int minute)

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

   void set(int year, int month, int date, int hourOfDay, int minute, int second)

            设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。

e)时间比较的相关方法 

   after(Object when)  

   before(Object when)

   compareTo(Calendar anotherCalendar)

   equals(Object obj) 

f)时间,对自身时间进行加减的操作  

   abstract  void add(int field, int amount)

   amount-正则加,负则减,超过当前字段范围则进1

1、冒泡排序

核心逻辑: 

    1)n个数需要(n-1)趟(每一趟确定一个数准确位置)

    2)每一趟需要进行(n-i)次比较,

    3)每一次比较,确定比较的两个数的相对位置。

    4)升序和降序,从小到大(升序)就把大的放后面,反之(降序)把小的放后面。

例子:升序排列32,84,16,5,8

第一趟排序过程中各数据位置:初始:32,84,16,5,8

第一次比较后:32,84,16,5,8

第二次比较后:32,16,84,5,8

第三次比较后:32,16,5,84,8

第四次比较后:32,16,5,8,84

第二趟排序与第一趟排序类似,只是所需排的数组是:[32,16,5,8]     因最后一个数字己经是最大,且排在最后,故不再管它。

初始:32,16,5,8

第一次:16,32,5,8

第二次:16,5,32,8

第三次:16,5,8,32

第三趟排序[16,5,8]

2、二分法查找

    核心逻辑: 

  1)先对容器的元素进行升序排列

  2)遍历容器 进行搜索元素,假设搜索的元素就在中间的位置

3)把中间位置的元素与我们要找的元素进行比较,改变我们的开始和结束的查找位置    

     注意:

        中间位置:(开始+结束)/2,这里会忽略小数

        如果,比中间大,开始设置为中间位置+1(考虑最后一个值问题)     

例子:

 333 12 45 1 5 8 9   11  13 18 22 33

在排好序的情况

 1 5 8 9   11  13 18 22 33

13的位置

第一次: 把中间(边界开始1跟边界结束13的最中间的数) 11跟 13比较

 13比11大说明13在11后面,那么把边界开始改为11

第二次: 把中间(边界开始11跟边界结束13的最中间的数) 18跟 13比较

 13比18小说明13在18前面,那么把边界结束改为18

第三次: 把中间(边界开始11跟边界结束18的最中间的数) 13跟 13比较

 找到你了,得到13的下标为当前中间位置的下标

1、字符串相关类对比

a.CharSequence接口

该接口描述了如果是该接口的实现类,那么就是一个可读的字符序列

String,StringBuilder,StringBuffer都是可读的字符序列,都实现了该接口。

b)String类
其对象表示的字符串不能改变,内部存储数据的char数组是final的!!
c)StringBuilder类

  其对象表示的字符串可以改变,内部存储数据的char数组不是final的!! 

线程不安全 效率高。

d)StringBuffer类

其对象表示的字符串可以改变,内部存储数据的char数组不是final的!! 

线程安全 效率相对StringBuilder略低。

2、自身对象操作

a)String的自身操作都会产生新对象

   1)替换   

            String replaceAll(String reg,String rep) --》替换所有匹配字符串内容为指定新字符串

   2)去除空格

            String trim()   --》去除左右空白字符

   3)转换大小写

            String toLowerCase(); --》  【转为小写】

            String toUpperCase(); --》  【转为大写】

b)StringBuffer和StringBuilder自身操作不会产生新对象

  1)append 追加

  2)delete 删除

 3)insert 插入

 4)replace 替换

 5)reverse 反转

c)String和(StringBuffer、StringBuilder)转换

    StringBuffer(String str)     字符串转StringBuffer

    StringBuilder

(String str)   

字符串转StringBuilder

    toString()     StringBuffer和StringBuilder转String

d)其他String常用api及回顾

     1)数组相关api

      String[] split(String regex)     按某个分隔符,分割字符串为多个内容,保存在数组中

      String(byte[] bytes, String charsetName)    通过字节数组,和编码创建字符串

      byte[] getBytes(String charsetName)  把字符串转换为某编码的字节数组

      String(char[] value) 通过字符数组创建字符串

      char[] toCharArray() 把字符串转换为字符数组

     2)其他常用api    

      int length 字符串长度

      public char charAt(int index) 字符串某个下标位置的字符

      boolean equals(Object);    比较内容

      boolean equalsIgnoreCase(String) 比较内容,不区分大小写

      String subString(int beginIndex) 从某个位置开始截取后面字符串直到结束

      int indexOf(String) 查找子字符串在原字符串的位置,没有就返回-1

      boolean contains(String);  查找子字符串在原字符串是否存在

      String replaceAll(String regex, String replacement)  替换所有匹配字符串

      String replaceFirst(String regex, String replacement) 替换第一个匹配字符串

      String trim()    去除左右

      String toLowerCase();   转小写

      String toUpperCase();  转大写

      boolean startsWith(String) 是否以某字符串开始

      boolean endsWith(String)  是否以某字符串结束

3、拼接字符串速度对比

一般情况下:

String +拼接StringBuffer和StringBuilder的append拼接,速度从快到慢

StringBuilder   略大于 StringBuffer 

大于

String,这种比较是相对的,不是绝对的。

原因:

1)

StringBuffer 

StringBuilder 实现类似,但StringBuffer考虑同步问题,可能阻塞,所有速度慢一点

2)String进行+拼接时底层是转换为创建

StringBuilder对象再进行append拼接,所有会产生大量的垃圾StringBuffer对象,速度慢

javap 分析编译后代码

怎么选择?

拼接字符串个数少,用string

个数多,单线程用stringbuilder

个数多,多线程用stringbuffer

 

 

 

 

 

 

 

 

 

 

 


   

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值