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的,即永远不能改变,就像是一个常量。
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.MONTH、Calendar.YEAR、Calendar.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: /

浙公网安备 33010602011771号