Java常用类(2)
9.Interger缓冲区
- Java预先创建了256个常用的整数包装类型对象
- 在实际应用当中对已创建的对象进行复用
public static void main(String[] args) {
//面试题
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2);//false 比较的是地址
Integer integer3 = 100;//自动装箱
Integer integer4 = Integer.valueOf(100);
// Integer integer3 = Integer.valueOf(100);并非构造方法
System.out.println(integer3==integer4);//true
Integer integer5 = 200;//自动装箱
Integer integer6 = 200;
// Integer integer5 = Integer.valueOf(100);
System.out.println(integer5==integer6);//false
/*
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
low=-128
h=127
在堆的缓冲区内,有-128~127,如果-128<i<127 则直接把地址给i,所以integer3==integer4
为什么呢? 以为平常使用多,就为我们创建了这个缓冲区
如果超出了就直接 new一个 return new Integer(i);
cache = new Integer[(high - low) + 1]; 255+1=256
*/
}
10.String概述
-
字符串是常量,创建之后不可改变(这个改变并不是值不能改变)
-
字符串字面值储存在字符串池中,可以共享(储存在字符串池的目的是共享)
public static void main(String[] args) {
String name = "hello";//“hello”常量储存在字符串池/常量池
name = "zhangsan";//"zhangsan"赋值给name name指向zhangsan
//给name赋值时,没有把hello改成zhangsan ,而是在字符池重新开辟了一块空间-->不可变性
//hello 变成了垃圾
String name2 = "zhangsan";
}
- String s = "hello";产生一个对象,字符串池中储存
- String s = new String("hello"); 产生两个对象,堆、池中个储存一个
//字符串的另一种创建方式 new String()
String str = new String("Java");//有两个对象,可能会浪费空间
String str2 = new String("Java");
System.out.println(str==str2);//false
System.out.println(str.equals(str2));//true 比的不是地址是数据
//这里一样是因为 String在运用中,擅自重写了equals用来比较指向的字符串对象所存储的字符串是否相等
详细可见这位博主:https://blog.csdn.net/wzy_2017/article/details/79994665
11.String常用方法
语法(1):
public int length(); 返回字符串的长度
public char charAt(int index); 根据下标获取字符
public boolean contains(String str); 判断当前字符串中是否包含str
使用:
//字符串方法的使用
//1.length();返回字符串的长度
//2.charAt(int index);返回某个位置的字符
//3.contains(String str);判断是否包含某个字符串
String content = "Java是世界上最好的编程语言";
System.out.println(content.length());//15,空格也算字符
System.out.println(content.charAt(0));//J
System.out.println(content.charAt(content.length() - 1));//言
System.out.println(content.contains("Java"));//true
System.out.println(content.contains("hi"));//false
语法(2):
public char[] toCharArray(); 将字符串转成数组;
public int indexOf(String str); 查找str首次出现的下标,存在,则返回该下标;不存在则返回-1;
public int lastIndexOf(String str); 查找字符串在当前字符串中最后一次出现的下标索引;
使用:
//4.toCharArray();返回字符串对应的数组
//5.indexOf();返回字符串首次出现的位置
//6. lastIndexOf();返回字符串最后一次出现的位置
System.out.println(content.toCharArray());//Java是世界上最好的编程语言,Java真香
System.out.println(Arrays.toString(content.toCharArray()));//将数组转换成String类型输出
//[J, a, v, a, 是, 世, 界, 上, 最, 好, 的, 编, 程, 语, 言, ,, J, a, v, a, 真, 香]
System.out.println(content.indexOf("Java"));//0
System.out.println(content.indexOf("Java", 4));//16 //从第四个下标开始寻找,这个Java是最后的Java
System.out.println(content.lastIndexOf("Java"));//16
语法(3):
public String trim(); 去掉字符串前后的空格,不管中间
public String toUpperCase(); 将小写转成大写
public boolean endWith(String str); 判断字符串是否以str结尾
使用:
//7.trim();去掉字符串前后的空格;
//8.toUpperCase(); 把小写转成大写 toLowerCase();把大写转成小写;
//9.endWith(str);判断是否以str结尾,startWith(str);判断是否以str开头;
String content2 = " hello world ";//可多次使用,说明了string的不可变性
System.out.println(content2.trim());//hello world
System.out.println(content2.toUpperCase());// HELLO WORLD
System.out.println(content2.toLowerCase());// hello world
String filename = "hello,Java";
System.out.println(filename.endsWith(",Java"));//true
System.out.println(filename.startsWith("hello"));//true
语法(4):
public String replace(char oldChar,char newChar); 将旧字符串替换成新字符串
public String[] split(String str); 根据str做拆分
使用:
for(String s : arr)这个格式是foreach的形式,表示取出数组arr[]中的每一个元素,就是循环一次就依次取出一个元素赋值给s,直到取完为止
12.可变字符串:StringBuffer和StringBuilder
在缓冲区内进行
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全
13.BigDecimal的使用
思考以下程序结果:
public class TestBigDecimal{
public static void main(String[] args){
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);
}
}
下面为结果
BIgDecimal:
- 位置:Java.math包中
- 作用:精确计算浮点数
- 创建方法:BigDecimal bd = new BigDecimal("1.0");
结果
0.09999999999999998
//很多实际应用中需要精确运算,而double是近似值储存,不在符合要求,需要借助BigDecimal
方法:
- BigDecimal add(BigDecimal bd) 加
- BigDecimal subtract(BigDecimal bd) 减
- BigDecimal multiply(BigDecimal bd) 乘
- BigDecimal divide(BigDecimal bd) 除
- 除法:divide(BigDecimal bd,int scal,RoundingMode,mode)
- 参数scal: 指定精确到小数点后几位
- 参数mode:
- 指定小数部分的取舍模式,通常采用四舍五入的模式
- 取值为BigDecimal.ROUND_HALF_UP
14.Date类
- Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代
- 时间单位:
- 1秒=1000毫秒
- 1毫秒=1000微秒
- 1微秒=1000纳秒
15.Calendar
- Calendar提供了获取或设置各种日历字段的方法
- 构造方法
- protected Calendar() :由于修饰符是protected,所以无法直接创建该对象
- 其他方法:
方法名 | 说明 |
---|---|
static Calendar getlnstance() | 使用默认时区和区域获取日历 |
void set(int,year,int month,int date,int houofday,int minute,int second) | 设置日历的年、月、日、时、分、秒。 |
int get(int field) | 返回给定日历字段的值。字段比如年、月、日等 |
void setTime(Date date) | 用给定的Date设置此日历的时间。Date-Calendar |
Date getTime() | 返回一个Date表示次日历的时间。Calendar-Date |
void add(int field,int amount) | 返回日历的规则,给指定字段添加或减少时间量 |
long getTimeInMillies() | 毫秒为单位返回该日历的时间值 |
没有了ヽ(✿゚▽゚)ノ ( ̄_, ̄ ) | ( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///)还有两个类 |
16.SimpleDateForma类
- SimpleDateFormat是一个以语言环境有关的方式来格式化和解析日期的具体类
- 进行格式化(日期—>文本)、解析(文本 —>日期)
- 常用的时间模式字母
字母 | 日期 | 示例 |
---|---|---|
y | 年 | 2019 |
M | 年中月份 | 08 |
d | 月中天数 | 10 |
H | 1天中的小时数(0-23) | 22 |
m | 分钟 | 16 |
s | 秒 | 59 |
S | 毫秒 | 367 |
17.System类
- System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有的
方法名 | 说明 |
---|---|
static void arraycopy(); | 复制数组 |
static long currentTimeMillis(); | 获取当前系统时间,返回的是毫秒值 |
static void gc(); | 建议JVM赶快启动垃圾回收器回收垃圾 |
static void exit(int status); | 退出JVM,如果参数是0表示正常退出JVM,非0表示异常退出JVM |
总结
- Object类
- 所有类的直接或间接的父类,可储存任何对象
- 包装类
- 基本数据类型所对应的应用数据类,可以是Object统一所有数据
- String类
- 字符串是常量,创建后不可改变,字面值保存在字符串池中,可以共享
- BigDecimal
- 可精确计算浮点数
- Date
- 特定时间
- Calendar
- 日历
- SimpleDateFormat
- 格式化时间
- System
- 系统类