Java常用类学习笔记

  • 常用类
    • 1. 包装类
      • 1.1 包装类基本知识
    • 1.2 自动装箱和拆箱
      • 自动装箱:
      • 自动拆箱:
    • 1.3 String类
      • StringBuiler类
        • 常用方法:
      • 不可变和可变字符串的陷阱:
    • 1.4 时间处理相关类:
      • 常用的方法:
    • 1.5 DateFormat和SimpleDateFormat
      • DateFormat类的作用
      • 一些例子
    • 1.6 Calendar日期类
      • 菜鸟雷区
      • 一些示例
      • 简单的可视化日历
    • 1.7 File类的基本用法
      • File类-递归打印目录树结构
    • 1.8 枚举

常用类

1. 包装类

1.1 包装类基本知识

​ java是面向对象的语言,但并不是"单纯面向对象"的,因为我们经常用到的基本数据类型就不是对象。但是我们在实际应用中经常需要将基本数据类型转化成对象,以便于操作。比如:将基本数据类型存储到Object[]数据或集合中的操作等等。

​ 为了解决这个不足,Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本类型对应的类统称为包装类(Wrapper Class)。

​ 基本数据类型对应的包装类

基本数据类型 包装类
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double

​ 在这八个类名中,除了Integer和Character类意外,其他六个类的类名和基本数据类型一致,只是类名的第一个字母大写而已。

​ 在这八个类中,除类Character和Boolean以外,其他的都是"数字型","数字型"都是java.lang.Number的子类。Number类是抽象类,因此它的抽象方法,所有子类都需要提供实现、Number类提供了抽象方法:intValue()、longValue()、floatValue()、doubleValue(),意味着所有的"数字型"包装类都可以相互转型。

​ 下面是一个包装类的例子:

package com.helloworld;public class TestWrapperClass {public static void main(String[] args) {// 基本数据类型转成包装类对象Integer a = new Integer(3);Integer b = Integer.valueOf(30);// 一般建议采用这种方式// 把包装类转成基本数据类型int c = b.intValue();double d = b.doubleValue();// 将字符串转化成包装类对象Integer e = new Integer("9999");Integer f = Integer.parseInt("10101001", 2);System.out.println(f + " ");// 把包装类转化成字符串String str = f.toString();// 常见的常量System.out.println("int类型最大的整数: " + Integer.MAX_VALUE);}}

1.2 自动装箱和拆箱

​ 自动拆箱和拆箱就是把基本数据类型和包装类之间进行自动的相互转化。JDK1.5后,Java引入了自动装箱(autoboxing)和拆箱(unboxing)

自动装箱:

​ 基本数据类型的数据处于需要对象的环境中时,会自动转化为"对象"。

自动拆箱:

​ 每当需要一个值时,对象会自动转成基本数据类型,没必要在去显示调用intValue()、doubleValue()等转型方法。

​ 自动装过程是通过调用包装类的valueOf()方法实现的,而自动拆箱过程是通过调用包装类的xxxValueOf()方法实现的(xxx代表对应的基本数据类型,如intValue()、doubleValue()等)。

1.3 String类

​ String类对象代表不可变类的Unicode字符序列,因此String对象成为不可变对象。

​ 在String类中:

public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {private final char value[];}

核心就是 private final char value[]。由于存在final修饰,所以String对象只能在初始化时赋值一次,这也是String对象不可变的原因。

​ 在遇到字符串常量之间的拼接时,编译器会做出优化,即在编译期间就会完成字符串的拼接。因此,在使用 == 进行String对象之间的比较时,我们需要特别注意:

package CommonClass;public class StringTest {public static void main(String[] args) {// 编译器做了优化,直接在编译的时候将字符串进行拼接String str1 = "hello" + "java";//相当于hellojavaString str2 = "hellojava";System.out.println(str1 == str2);String str3 = "hello";String str4 = "java";String str5 = str3 + str4;// 编译时不知道变量中存储的是什么,所以没有办法在编译时进行优化。System.out.println(str2 == str5);}
}/**
*true
*false
*/

StringBuiler类

​ StringBuilder源码中:

abstract class AbstractStringBuilder implements Appendable, CharSequence {char[] value;int count;AbstractStringBuilder(){}
}

char[] value 并没有使用final进行修饰,这意味着,StringBuilder类创建的对象,可以进行修改

package CommonClass;public class StringBuilderClass {public static void main(String[] args) {String str;//StringBuilder线程不安全,效率高;StringBuffer线程安全,但是效率低,一般使用StringBuilder类StringBuilder sb = new StringBuilder("absgcesf");System.out.println(Integer.toHexString(sb.hashCode()));System.out.println(sb);sb.setCharAt(2, 'M');sb.setCharAt(5, 'C');System.out.println(Integer.toHexString(sb.hashCode()));System.out.println(sb);}}

常用方法:

StringBuilder.reverse();// 倒序
StringBuilder.setCharAt(int index, char str);// 将指定位置修改字符
StringBuilder.insert(int offset, char c);// 在指定位置插入, 由于返回的是自身,所以可以链式调用
StringBuilder.delete(int start, int end);// 删除指定区间。同时返回自身,可以进行链式调用

不可变和可变字符串的陷阱:

​ 使用StringBuilder进行字符串的拼接,如果使用for循环进行拼接,就会产生大量的内存和时间的浪费。

​ 所以使用SringBuilder.append()方法来循环累加字符串,又节省空间,又节省时间。

1.4 时间处理相关类:

​ 在计算机的世界里面,我们把1970年1月1日 00:00:00 定位基准时间,每个度量单位是毫秒

​ 我们用long类型的变量来表示时间,从基准时间往前几亿年,往后几亿年都能表示。如果想获得现在时刻的"时刻数值",可以使用:

long now = System.currentTimeMillis();

​ 这个"时刻数组"是所有时间类的核心值,年月日都是根据这个"数值"计算出来的。我们工作学习涉及的时间相关类有如下类:

[外链图片转存失败(img-2EshJUqi-1565414323541)(E:\Document\java\JAVE EE\尚学堂笔记\深度截图_选择区域_20190707164931.png)]

常用的方法:

​ 核心-Date.getTime()获得毫秒数

​ 由于Date中的很多方法已经被废弃了(已经被Calendar所取代),所以掌握核心即可。而其中很多和字符串相关的方法,也已经被DateFormat所取代。

1.5 DateFormat和SimpleDateFormat

​ 其中,SimpleDateFormat是DateFormat的实现类,我们在实际运用中一般使用SimpleDateFormat。

  • DateFormat类的作用

    把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成事件对象。

    DateFormat是一个抽象类,一般使用它的子类SimpleDateFormat类来实现。

    代码中的格式转化字符的具体含义:

    字母 日期或时间元素 表示 实例
    G Era 标志符 Text AD
    y Year 1996; 96
    M 年中的月份 Month July; jul; 07
    w 年中的周数 Number 27
    W 月份中的周数 Number 2
    D 年中的天数 Number 189
    d 月份中的天数 Number 10
    F 月份中的星期 Number 2
    E 星期中的天数 Text Tuesday; Tue
    a Am/pm 标记lizi Text Pm
    H 一天中的小时数(0-23) Number 0
    k 一天中的小时数(1-24) Number 24
    K am/pm中的小时数(0-11) Number 0
    h am/pm中的小时数(1-12) Number 12
    m 小时中的分钟数 Number 30
    s 分钟中的秒数 Number 55
    S 毫秒数 Number 978
    z 时区 General time zone Pacific Standard Time; PST; GMT-08:00
    Z 时区 RFC 822 time zone 0800
  • 一些例子

package CommonClass;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 测试时间对象和字符串之间的相互转化*/
public class TestDateFormat {public static void main(String[] args) throws ParseException {// 把时间按照指定格式,转化成字符串DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String str = df.format(new Date());System.out.println(str);// 把字符串按照响应的格式转化成时间对象DateFormat df2 = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");Date date = df2.parse("1983年5月10日 12:55:30");System.out.println(date);//测试其他的格式字符。比如,利用D,获取现在是当前年的第几天。DateFormat df3 = new SimpleDateFormat("D");String str3 = df3.format(new Date());System.out.println(str3);}}
/**
* 2019-07-07 08:46:12
* Tue May 10 00:55:30 CST 1983
* 188
*//*
* 如果抛出了java.text.ParseException: Unparseable date: "****"
* 说明你输入的日期格式错误
*/

1.6 Calendar日期类

​ Calendar类是一个抽象类,为我们提供了关于日期计算的相关功能。比如,年、月、日、时、分、秒的展示和计算。

​ GregorianCalendar是Calendar的一个具体的一个子类,提供了世界上大多数国家/地区使用的标准日历系统。

  • 菜鸟雷区

​ 注意月份的表示,一月是 0 ,二月是1,以此类推,12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类Calendar使用常量来表示月份:JANUARY、FEBRUARY等等。

  • 一些示例

package CommonClass;import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;/*** 测试日期类的使用*/public class TestCalendar {public static void main(String[] args) {Calendar calendar = new GregorianCalendar(2999,10,9,22,10,50);int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH);int whichDay = calendar.get(Calendar.DAY_OF_WEEK);int day = calendar.get(Calendar.DATE); // 也可以使用DATE_OF_MONTHSystem.out.println(year);System.out.println(whichDay);// 星期几 1-7 1-星期日 2-星期一 7-星期日System.out.println(month);//0-11表示对应的月份 0-一月份 11-十二月System.out.println(day);//设置日期的相关元素Calendar c = new GregorianCalendar();c.set(Calendar.YEAR, 9102);System.out.println(c);//日期的计算Calendar c1 = new GregorianCalendar();c1.add(Calendar.DATE, 100);System.out.println(c1);//日期对象和时间对象的转化Date d4 = c1.getTime();Calendar c2 = new GregorianCalendar();System.out.println(c2);c2.setTime(d4);System.out.println(d4);System.out.println(C2);}}
// 结果
/*
2999
7
10
9
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=9102,MONTH=6,WEEK_OF_YEAR=28,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=188,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=27,SECOND=23,MILLISECOND=419,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1571146043419,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=15,DAY_OF_YEAR=288,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=27,SECOND=23,MILLISECOND=419,ZONE_OFFSET=28800000,DST_OFFSET=0]
java.util.GregorianCalendar[time=1562506043420,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=6,WEEK_OF_YEAR=28,WEEK_OF_MONTH=2,DAY_OF_MONTH=7,DAY_OF_YEAR=188,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=27,SECOND=23,MILLISECOND=420,ZONE_OFFSET=28800000,DST_OFFSET=0]
Tue Oct 15 21:27:23 CST 2019
java.util.GregorianCalendar[time=1571146043419,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=9,WEEK_OF_YEAR=42,WEEK_OF_MONTH=3,DAY_OF_MONTH=15,DAY_OF_YEAR=288,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=27,SECOND=23,MILLISECOND=419,ZONE_OFFSET=28800000,DST_OFFSET=0]
*/
  • 简单的可视化日历

package CommonClass;import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
import java.util.concurrent.CancellationException;/*** 可视化日历程序*/
public class TestCalendarHomeWork {public static void main(String[] args) throws ParseException {System.out.println("请输入日期:2020-9-10");Scanner sc = new Scanner(System.in);String str = sc.nextLine();DateFormat df = new SimpleDateFormat("yyyy-MM-dd");Date date =  df.parse(str);Calendar c = new GregorianCalendar();c.setTime(date);System.out.println("日\t一\t二\t三\t四\t五\t六");int today = c.get(Calendar.DAY_OF_MONTH);c.set(Calendar.DAY_OF_MONTH, 1);for (int i = 0; i < c.get(Calendar.DAY_OF_WEEK) -1; i++) {System.out.print("\t");}int maxDay = c.getActualMaximum(Calendar.DATE);for (int i = 0; i < maxDay; i++) {if(today == c.get(Calendar.DAY_OF_MONTH)){System.out.print(c.get(Calendar.DAY_OF_MONTH) + "*\t");}else {System.out.print(c.get(Calendar.DAY_OF_MONTH) + "\t");}if(c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY){System.out.println("\t"); //换行操作}c.add(Calendar.DAY_OF_MONTH, 1);}}}//结果
/*
请输入日期:2020-9-10
2020-9-10
日   一   二   三   四   五   六1  2   3   4   5
6   7   8   9   10* 11  12
13  14  15  16  17  18  19
20  21  22  23  24  25  26
27  28  29  30
*/

1.7 File类的基本用法

​ java.io.File类:代表文件和目录。在开发中,读取文件、生成文件、删除文件、修改文件的属性时,经常会用到本类。

File类的常见的构造方法:public File(String pathname)

​ 以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。

package CommonClass;import java.io.File;
import java.io.IOException;
import java.util.Date;/*** 测试File类的基本用法*/
public class TestFile {public static void main(String[] args) throws IOException {File f = new File("/home/qianqian/txt.txt");System.out.println(f);f.renameTo(new File("/home/qianqian/aa.txt"));System.out.println(System.getProperty("user.dir"));File f2 = new File("gg.txt");f2.createNewFile();System.out.println("File是否存在: " + f2.exists());System.out.println("File是否是目录:" + f2.isDirectory());System.out.println("File是否是文件:" + f2.isFile());System.out.println("File的大小:" + f2.length());System.out.println("File最后的修改时间:" + new Date(f2.lastModified()));System.out.println("File的文件名:" + f2.getName());System.out.println("File的目录根路径:" + f2.getAbsolutePath());//        f2.delete();File f3 = new File("01/02/03");if(f3.exists()) {}f3.delete();File f4 = new File("01/02");f4.delete();File f5 = new File("01");f5.delete();}}

File类-递归打印目录树结构

package CommonClass;import java.io.File;/*** 使用递归算法打印目录树*/
public class TestPrintFileTrees {public static void main(String[] args) {File f = new File("/media/qianqian/新加卷/Document/self-learning");printFile(f,0);}static void printFile(File file, int level) {for (int i = 0; i < level; i++) {System.out.print("\t");}System.out.println(file.getName());if(file.isDirectory()) {File[] files = file.listFiles();for(File temp : files) {printFile(temp, level + 1);}}}}

1.8 枚举

​ JDK1.5引入枚举类型。枚举类型的定义包括枚举声明和枚举体。格式如下

enum 枚举名 {枚举体 (常量列表)
}

​ 枚举体就是放置一些常量。我们可以写出我们第一个枚举类型。

enum Season {SPRING, SUMMER, AUTUMN, WINDER
}

​ 所有的枚举类型隐性地继承自java.lang.Enum。枚举实质上还是类!而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是 public static final 修饰的。可以直接通过枚举类型名来使用它们。

建议

  1. 当你需要定义一组常量时,可以使用枚举类型。
  2. 尽量不要使用枚举类型的高级特性,事实上高级特性都可以使用普通类来实现,没有必要引入枚举来增加程序的复杂性。
package CommonClass;/*** 测试枚举*/
public class TestEnum {public static void main(String[] args) {System.out.println(Season.SPRING);Season a = Season.AUTUMN;switch (a) {case SPRING:System.out.println("Now, it's Spring.");break;case SUMMER:System.out.println("Now, it's Summer");break;case AUTUMN:System.out.println("Now, it's Autumn");break;case WINTER:System.out.println("Now, it's Winter");break;}}}enum Season {SPRING, SUMMER, AUTUMN, WINTER
}enum Week {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FIRDAY, SATUDAY, SUNDAY
}s

尚学堂视频笔记四:常用类相关推荐

  1. 正则表达式基础知识---文本操作(尚学堂视频笔记)

    正则表达式(Regular Expression)基础知识 一.开发中使用流程: -分析要匹配的数据 写出测试用的典型数据 -在工具软件中进行匹配测试 -在程序中调用通过测试的正则表达式 (有些高级语 ...

  2. 尚学堂Java第四章作业编码题+个人想法

    尚学堂Java第四章作业编码题+个人想法 编码题一: 编码题二: 编码题三: 终于到我想说的地方了 刚开始学习Java,刚开始学会做笔记,觉悟的可能比较晚,但没关系,我会努力的! 由于每次做作业都难理 ...

  3. 第八章笔记 Java常用类

    第八章笔记 Java常用类 文章目录 第八章笔记 Java常用类 第一节 Java类库概述 Java类库文档 Java类库列表 第二节 数字相关类 Java数字类 大数字类 随机数类 数字工具类 第三 ...

  4. 尚学堂学习笔记。。。

    1.02_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi 指定Tomcat的目录,指定JDK搭建开发环境(拷贝jar包,复制struts.xml文件 此文件不要放在WE ...

  5. java笔记:常用类-反射

    目录 1 常用类 1.1 内部类 1.1.1 概念 1.1.2 成员内部类 1.1.3 静态内部类 1.1.4 局部内部类 1.1.4 匿名内部类 1.2 Object类 1.2.1 getClass ...

  6. Java笔记09——常用类

    常用类 单例模式:是java中的一种设计模式,是优秀的程序员总结的一套比较成熟的健壮的一套规范.有23种,到架构师的时候才可以用到. 特点: 1.私有的构造器 2.静态的成员对象 3.公有的静态方法 ...

  7. 21天学通Java学习笔记-Day11(常用类)

    java 常用类(重点): String 类: String 类代表字符串.创建以后不能更变. public class tests { public static void main(String[ ...

  8. java笔记——Java常用类

    目录 目录 Java常用类目标 1.1内部类 1.2成员内部类 1.3静态内部类 1.4匿名内部类 2.Object类 2.1getClass()方法 2.2hasCode() 2.3toString ...

  9. 看尚学堂视频Java学习笔记

    //这是我刚接触java时做的笔记, 后面也没去整理, 可能其中有些理解有误, 仅供参考!!! 1.java中一个英文字母或一个中文汉字都是2个字节来存储.如:(char是16bit) 2." ...

  10. 尚学堂oracle笔记2

    第一课:客户端           1. Sql Plus(客户端),命令行直接输入:sqlplus,然后按提示输入用户名,密码.           2. 从开始程序运行:sqlplus,是图形版的 ...

最新文章

  1. Windows 7时代即将终结!
  2. getopt()和getopt_long()用法
  3. processing动态代码大全_做一张动态海报需要多少步?
  4. 泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?
  5. Linux下Oracle数据库的搭建(新手)
  6. linux下各目录的作用
  7. 周志华《机器学习》习题3.4——用UCI数据集比较10折交叉验证法和留一法
  8. 国产开源数据库建模工具
  9. 高等数学:第一章 函数与极限(6)极限存在准则、两个重要极限
  10. OO ALV 设置搜索帮助的三种方式 ONF4 EVENT
  11. Android初级教程调用手机拍照与摄像功能
  12. 林轩田《机器学习基石》(九)—— Linear regression
  13. VS2005的R6034错误 (转载)
  14. Android几种数据存储的对比(MMKV、DataStore、SharedPreference)
  15. JS对DOM节点的操作--增加节点,删除节点
  16. git 优雅的撤销中间某次提交
  17. 去掉em默认样式 html,HTML的各个标签的默认样式
  18. RTP打包发送H264(下)
  19. 三角形已知三个点坐标,求外心坐标的公式
  20. 计算机科学与技术专业描述是什么,计算机科学与技术专业属于什么门类 计算机科学与技术专业介绍...

热门文章

  1. 【数理逻辑】命题逻辑 ( 命题与联结词回顾 | 命题公式 | 联结词优先级 | 真值表 可满足式 矛盾式 重言式 )
  2. driver: linux下如何模拟按键输入和模拟鼠标
  3. 【C++】简易小六壬起卦器
  4. 《一万小时理论》读书笔记
  5. 400GE燎原前夜,智能IP网络的核心路由器巅峰际会
  6. 「游戏」c++贪吃蛇1.1
  7. python热力图_一、python可视化——热力图
  8. Parallels Desktop 安装 Win7注意事项
  9. 手机无线如何共享给台式计算机,怎么把电脑网络共享给手机上网
  10. 微信小程序之获取用户位置权限