Java SE 学习笔记-Day 05

Object

Object类是所有类的父类,即使某个类在定义时,没有显示继承一个父类,它也是Object的子类

hashCode

  • hashCode的存在主要是用于散列查找
  • 每一个对象都有的一个整数,在一次运行中,是保持不变的,但多次运行,hashCode可以变化。
  • 内容相同的对象一定拥有相同的hashCode,内容相同即通过equals判断是相同的。
  • 内容不同的对象不一定拥有不同的hashCode,即相同的hashCode不能证明这两个对象相等,只能证明这两个对象在散列存储结构里应存放在一个地方

封装类

Java是以一种面向对象语言,数据与方法都封装成了类,而基本类型,也都有对应的类,这就是封装类

数字封装类有Byte、Short、Integer、Long、Float、Double类,这些类都是Number的子类

char的封装类是Character

//把一个基本类型的变量,转换为Integer对象
Integer it = new Integer(i);
//把一个Integer对象,转换为一个基本类型的int
int i2 = it.intValue();
自动装箱/拆箱
  • 自动装箱:不需要调用构造函数,直接通过=将基本类型自动转换为类类型。

    int i = 5;
    Integer it2 = i;
    
  • 自动拆箱:不需要调用封装类的xxxValue方法,就可通过=自动转换为基本类型

    Integer i1 = 4;
    int i2 = i1;
    

    注意:不同类型的不能进行自动装箱。

数字与字符串转换
  • 基本类型/封装类 -> 字符串

    // 方法一 通过String类的静态方法valueOf
    String str = String.valueOf(i)
    
    // 方法二 通过封装类的toString方法
    Float a_obj = a;
    String str2 = a_obj.toString();
    System.out.println(str2);
    
  • 字符串 -> 基本类型/封装类

    通过调用要转换的类型对应封装类里面的parseXxx静态方法

    String str3 = "555.32";
    float c = Float.parseFloat(str1);
    

Math

java.lang.Math 里面提供了很多关于数学运算的静态方法,

  • round:四舍五入
  • random:返回一个0~1的随机浮点数,可结合强制类型转换得到整数
  • sqrt : 开方
  • pow:次方
  • PI :π
  • E : 自然常数,2.718281828459045

Character

该类提供了很多静态方法,无需创建对象使用:

  • isLetter:判断是否为字母
  • isDigit:判断是否为数字
  • isWhitespace : 判断是否为空白
  • isUpperCase:是否是大写
  • isLowerCase:是否是小写
  • toUpperCase: 转换为大写
  • toLowerCase:转换为小写
  • toString:将char转换为字符串
    • 注意:不能直接将char 转换为 String

String

格式化输出

和C/C++中的一样,利用占位符和printf,当需要拼接的变量比较多的时候采用

快捷键入:souf+ 回车

System.out.printf("line %d",n);
System.out.format("line %d",n);
换行符
  • \n - newline 换行

  • \r - return 回车

    在不同的操作系统,换行符是不一样的
    (1)在DOS和Windows中,每行结尾是 “\r\n”;
    (2)Linux系统里,每行结尾只有 “\n”;
    (3)Mac系统里,每行结尾是只有 "\r"

    为了使得同一个java程序的换行符在所有的操作系统中都有一样的表现

    使用%n,就可以做到平台无关的换行

制表符

可以使用制表符\t 解决对齐

System.out.println(``"使用空格无法达到对齐的效果"``);
System.out.println(``"abc def"``);
System.out.println(``"ab def"``);
System.out.println(``"a def"``);

System.out.println(``"使用\\t制表符可以达到对齐的效果"``);
System.out.println(``"abc\tdef"``);
System.out.println(``"ab\tdef"``);
System.out.println(``"a\tdef"``);

运行结果:

创建机制

java中的String是被final修饰的,所以是不能被继承。同时采用String是immutale的,即永远不能改变,就像是一个常量。

image-20210309223219803

Java中只要有一个字面量出现,虚拟机就会创建一个字符串,通过new 和 构造方法也会新创建一个对象,通过+号进行字符串拼接,也会创建新对象。

String teemo = new String("提莫"); //创建了两个字符串对象
常用方法
  • charAt:获取某个索引的字符

  • toCharArray:返回字符串对应的字符数组

  • substring:截取字符串

    String str1 = "ABCDEFGHIJK";
    String str2 = str1.substring(0, 2); // AB  返回两个参数之间的[beginIndex,endIndex)
    String str3 = str1.substring(2); // CDEFGHIJK 返回从2开始的[2,length)
    
  • split: 按给定的正则表达式或者字符分割字符串,返回字符串数组

  • trim:去除首尾空格

  • toLowerCase:全部变成小写

  • toUpperCase:全部变成大写

  • indexOf :返回字符 或者 子字符串 第一次出现的位置

  • lastIndexOf:返回字符 或者 子字符串 第一次出现的位置

  • contains:判断是否包含子字符串

  • replaceAll:替换所有子字符串

  • replaceFirst:只替换第一个匹配的

  • equals:比较两个字符串对象存放的内容是否相同,大小写必须一致

  • equalsIgnoreCase:作用同上,但会忽略大小写

  • startsWith:判断一个字符串是否以另一个字符串打头

  • endsWith:判断一个字符串是否以另一个字符串结尾

判等

String引用变量存放的是String对象的地址,直接用==判等,比较的是这两个地址是否相同,如果为true,则证明,则这两个引用变量指向同一个对象,存放的字符串一定相同,但若为false,只能证明两个引用变量不是同一个对象而已,存放的值也有可能相同。比较内容是否一致,要使用equals

String str1 = "the light";
String str2 = new String(str1);
//== 用于判断是否是同一个字符串对象
System.out.println( str1  ==  str2);
// 输出 false

System.out.println(str1.equals(str2));
// 输出 true

StringBuffer

StringBuffer是可变长的字符串,也就是可修改的。

StringBuffer为什么是可变长的?

StringBuffer内部维护了一个字符数组,但这个字符数组留有多余空间,在构造时,会多分配一些长度。这样在后续增加内容时,就可使用余下的内存空间,若超过了最长的长度,则会重新用新的字符数组,分配空间。

对于需要经常删减内容的字符串,StringBuffer比String拼接效率更高。

在Java里,new来的堆内存空间,不需要手动释放,JVM将会自动回收,当指向它的引用变量生命期结束或指向了其他对象时,将 自动释放

  • append :在最后的位置追加
  • delete :删除指定区间字符串
  • insert :在指定位置插入
  • reverse :反转
  • length:返回内容长度
  • capacity:返回总空间

StringBuilder

StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。

它和 StringBuffer 之间的最大不同在于 它的方法不是线程安全的(不能同步访问)。

但是它速度更快,所以多数情况下建议使用 StringBuilder 类。

在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

String、StringBuffer、StringBuilder三者不同

String:不可变的字符序列

StringBuffer:可变的字符序列,线程安全,同步,效率低

StringBuilder:可变的字符序列,线程不安全的,不同步,效率高

三者底层都是使用char [] 存储

Date

java.util.Date Date类存放着一个时间,使用无参构造函数实例化对象时,存放的是目前的时间。

时间原点:1970年1月1日 8点0分0秒,所有的日期,都是以为这个时间为基准,每过一毫秒(1s = 1000 ms),就+1。

为什么对应1970年呢? 因为1969年发布了第一个 UNIX 版本:AT&T

为什么是8点?因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个小时。

  • getTime : 将会返回一个long型的整数来代表目前的时间
  • toString : 以默认格式 转换为字符串 ”Tue Jan 05 09:51:48 CST 2016”
System.currentTimeMillis

new Date().getTime() 和 System.currentTimeMillis() 是一样的
不过由于机器性能的原因,可能会相差几十毫秒,毕竟每执行一行代码,都是需要时间的

日期格式化

将日期转换成指定格式的字符串

  • y 代表年
  • M 代表月
  • d 代表日
  • H 代表24进制的小时
  • h 代表12进制的小时
  • m 代表分钟
  • s 代表秒
  • S 代表毫秒

首先以想要输出的格式写成字符串,再以其构造一个格式字符串类型SimpleDateFormat对象

SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS" );
// 毫秒是 0 ~ 999 ,所以最多是三位数

然后调用SimpleDateFormat对象的format方法,格式化Date对象,且该方法将返回格式化的字符串

System.out.println(sdf.format(date));
  • parse : 将解析一个时间字符串(要和SimpleDateFormat对象预设的模式相同,否则会抛出ParseException),返回一个Date对象

    String str = "2016/1/5 12:12:12";
    SimpleDateFormat sdf =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss" );
    Date d = sdf.parse(str);
    
Calendar类

日历类,常用于翻日历,而Date通常是用于表示当前时间。

采用单例模式获取日历对象Calendar.getInstance

Calendar c = Calendar.getInstance();
Date now = c.getTime(); // 返回Date类型的设置日期和时间

常用方法

  • add :在原日期上增加年/月/日,采用Calendar.MONTHCalendar.YEARCalendar.MONTH分别标识,需要设置的单位;正数表示向未来,负数表示向前。
  • set : 直接设置年/月/日
Calendar c = Calendar.getInstance();
Date d = c.getTime();
System.out.println("目前时间:"+sdf.format(d));
c.add(Calendar.MONTH,2);
System.out.println("2个月后:"+sdf.format(c.getTime()));

System

  • exit : 退出JVM,0表示非异常退出

  • currentTimeMills : 获取当前时间毫秒值

BigInteger

解决用于解决大整型运算的问题

  • 用String构造
  • add :+
  • subtract :-
  • multiply 😗
  • divide: /

BigDecimal

解决用于解决浮点型运算精度损失的问题运算精度损失的问题

  • 用String构造

  • add :+

  • subtract :-

  • multiply 😗

  • divide: /

posted @ 2021-03-11 01:32  蓬飞  阅读(46)  评论(0)    收藏  举报