Object
1、概念
所有对象的顶级父类,存在于Java.lang包中
2、常用方法
public class Demo1_Object {
public static void main(String[] args) {
//TODO 创建Object对象
Object obj=new Object();
Object obj2=new Object();
//TODO 调用方法
//1、指示其他某个对象是否与此对象“相等”,比较的是两个对象的地址值。
System.out.println(obj.equals(obj2));//false
//2、返回该对象的哈希码值。
System.out.println(obj.hashCode());//1735600054
//3、返回该对象的字符串表示。
System.out.println(obj.toString());//java.lang.Object@677327b6
}
}
String
字符串对象,可用于少数字符串的拼接功能
1、特点
底层是一个封装的char[ ]数组对象并且字符串一旦确定,是不可变的
2、创建String对象
public class Demo2_String {
public static void main(String[] args) {
//TODO 方法1 ---在堆内存中分配一个存储空间
char ch[]={'a','b','c','d','e'};
String str=new String(ch);
System.out.println(str);//abcde
//TODO 方法2
//1、 如果是第一次使用字符串,java会在字符串常量池创建一个对象。
//2、 再次使用相同的内容时,会直接访问常量池中存在的对象。
String str2="abcde";
System.out.println(str2);//abcde
String str3="abcde";
System.out.println(str3);//abcde
//String类重写了object的equals方法,比较的是属性值,而“==”比较的是地址值
System.out.println(str.equals(str2));//true
System.out.println(str==str2);//false
System.out.println(str2==str3);//false
}
}
3、常用方法
public class Test3_String {
public static void main(String[] args) {
// 1.创建String对象
// --方法1
char[] ch = { 'a', 'b', 'c', 'd', 'e' };
String str = new String(ch);// 触发String(char[] value)构造方法
System.out.println(str);
// --方法2
String str2 = "12345";// 相当于简写形式+
// 方法2比方法1 更加高效,因为方法1要在存放在堆内存中,
// 方法2存在堆内存的一个常量池中,如果这个值存在了,就不再开辟新空间,直接拿来用
// 2.调用方法
// 2.1返回指定索引的char值
System.out.println(str.charAt(3));// 'd'
// 2.2将指定字符串连接到此字符串的结尾
System.out.println(str.concat(str2));// abcde12345
// 2.3 将旧字符换成新字符
System.out.println(str.replace("abc", "xyz"));// xyzde
// 2.4将此字符与指定的对象进行比较(判断两个字符串的内容是否相等,对equals方法进行了重写)
System.out.println(str.equals(str2));// false
// 2.5 返回次字符串的哈希码值
System.out.println(str.hashCode());// 92599395
System.out.println("==========================");
// 2.6 返回指定子字符串在此字符串的索引
System.out.println(str.indexOf("b"));// 1
// 2.7 返回指定字符在此字符串中最后一次出现处的索引。
System.out.println(str.lastIndexOf("c"));// 2
// 2.8 返回指定字符串是否为空
System.out.println(str.isEmpty());// false
// 2.9 返回指定字符串的长度
System.out.println(str.length());// 5
System.out.println("==========================");
// 2.10 返回字符串是否以指定字符为前缀开头
System.out.println(str.startsWith("ab"));// true
// 2.11判断字符串是否以指定后缀结尾
System.out.println(str.endsWith("de"));// true
// 2.12 返回一个新的字符串,从指定索引位置开始截取字符串到末尾处
System.out.println(str.substring(2));// cde
// 2.13 返回一个新字符串,截取字符串,从开始位置到结束位置(不包含结束位置)
System.out.println(str.substring(1, 3));// bc
// 2.14 将指定字符串全部转成小写
System.out.println(str.toLowerCase());// abcde
// 2.15 将指定字符串全部转成大写
System.out.println(str.toUpperCase());// ABCDE
System.out.println("==========================");
// 2.16 返回字符串的副本,忽略前导空白和尾部空白
System.out.println(str.trim());// abcde
// 2.17 将指定的数字转成字符串
System.out.println(String.valueOf(98));// 98
// 2.18 将字符串的数据存入char数组中
System.out.println(str.toCharArray());// abcde
// 2.19 按照指定的字符串切割
System.out.println(Arrays.toString(str.split("c")));// [ab, de]
// 2.20 将字符串的数据,转成整型并存入byte数组中
System.out.println(Arrays.toString(str.getBytes()));// [97, 98, 99, 100, 101]
// 打印字符串里的每个字符
for (int i = 0; i < str.length(); i++) {
System.out.print(str.charAt(i));//abcde
}
}
}
5、StringBuffer与StringBuilder
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
5.1、特点
1、 封装了char[]数组
2、 是可变的字符序列
3、 提供了一组可以对字符内容修改的方法
4、 常用append()来代替字符串做字符串连接
5、 内部字符数组默认初始容量是16:initial capacity of 16 characters
6、 StringBuffer 1.0出道线程安全,StringBuilder1.5出道线程不安全
7、 如果大于16会尝试将扩容,新数组大小原来的变成2倍+2;容量如果还不够,直接扩充到需要的容量大小;
int newCapacity = value.length*2+2;
5.2、常用方法
方法 | 方法描述 |
---|---|
public StringBuffer append(String s) | 将指定的字符串追加到此字符序列。 |
public StringBuffer reverse() | 将此字符序列用其反转形式取代。 |
public delete(int start, int end) | 移除此序列的子字符串中的字符。 |
public insert(int offset, int i) | 将 int 参数的字符串表示形式插入此序列中。 |
replace(int start, int end, String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符。 |
String,StringBuffer,StringBilder的区别
1、首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
2. 再来说线程安全,在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。
3. 总结一下
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
Date
1、概述
存在于java.util.Date包。
用来封装一个毫秒值表示一个精确的时间点。
从1970-1-1 0点开始的毫秒值。
2、创建对象
序号 | 方法描述 |
---|---|
Date date=newDate(); | //封装的是系统当前时间的毫秒值 |
Date date=newDate(long time); | //封装指定的时间点 |
3、常用方法
序号 | 方法描述 |
---|---|
getYear(); | /返回距离1900年多久 |
getMonth(); | /返回月(0-11),所以比现实月份小1 |
getDate(); | /获取日 |
getHours(); | /获取时 |
getMinutes(); | 获取分 |
getSeconds(); | 获取秒 |
getDay(); | 获取星期 |
getTime(); | /返回从1970年到现在的毫秒数 |
toLocaleString(); | 返回当前的年-月-日 时:分:秒 |
4、如期工具SimpleDateFormat
4.1、概述
日期格式化工具,可以把Date对象格式化成字符串,也可以日期字符串解析成Date对象。
4.2、创建对象及常用方法
方法 | 方法描述 |
---|---|
SimpleDateFormat sdf = new SimpleDateFormat(String pattern); | 可以填"yyyy-MM-dd HH:mm:ss" |
format(Date) | 把Date格式化成字符串;举例:String str = sdf.format(new Date()) |
parse(String) | 把String解析成Date;举例:举例:Date d = sdf.parse(new String(“abc”)); |
4.3、测试
public class Test3_SimpleDateFormat {
public static void main(String[] args) throws ParseException {
// 创建对象——参数格式:yyyy-MM-dd
String s = new Scanner(System.in).nextLine();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将字符串类型的数据转成date类型
Date d = sdf.parse(s);
//创建Date对象
Date today = new Date();
long birth = d.getTime();
long todayTime = today.getTime();
System.out.println((todayTime - birth) / 1000 / 60 / 60 / 24);
}
}
Number 包装类
数字包装类的抽象父类
1、作用
1、包装类的作用,为对应的基本类型,提供丰富的方法
2、自动装箱:把基本类型 包装 成包装类型----使用方法:包装类.ValueOf(包装类对应的基本类型变量)
Integer a = 5;//a是引用类型,引用了包装对象的地址。编译器会完成对象的自动装箱:Integer a = Integer.valueOf(5);
3、自动拆箱:把包装类型 包着的是啥拆出来 变回成 基本类型----使用方法:包装类.intValue()拆成int类型,包装类.doubleValue()拆成double类型
int i = a;//a现在是包装类型,没法给变量赋值,需要把5取出来。编译器会完成自动拆箱:int i = a.intValue();
4、自动装箱有两种方式:①构造方法创建对象、②静态方法创建对象(推荐后者,在范围内高效)
后者高效的原因是:静态方法相对new,相同数据创建后不再开辟新的空间存储——范围:-128~127 超过范围后和new的效率是一样的
2、包装类与基本类型的对应关系
基本类型 | 对应的包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
3、常用方法(用Integer类型举例)
方法 | 方法描述 |
---|---|
parseInt() | 字符串转换成int |
toBinaryString() | 把整数转换成2进制数据 |
toOctalString() | 把整数转换成8进制数据 |
toHexString() | 把整数转换成16进制数据 |
3、BigDecimal与BigInteger
3.1、概述
BigDecimal:常用来解决精确的浮点数运算。
BigInteger:常用来解决超大的整数运算。
3.2、测试 BigInteger
public class Test_BigInteger {
public static void main(String[] args) {
// TODO Auto-generated method stub
//随机给a,b附上一个在100000000内的随机数
int a = new Random().nextInt(1000000000);
int b = new Random().nextInt(1000000000);
//创建BigInteger对象,参数类型为String类型
BigInteger ab = new BigInteger(String.valueOf(a));
BigInteger bb = new BigInteger(b + "");
//两个大数相加
BigInteger result = ab.add(bb);
System.out.println(result);
//两个大数相减
result = ab.subtract(bb);
System.out.println(result);
//两个大数相乘
result= ab.multiply(bb);
System.out.println(result);
//两个大数相除
result= ab.divide(bb);
System.out.println(result);
}
}
3.3、测试 BigDecimal
public class Test4_BigDecimal {
public static void main(String[] args) {
// TODO Auto-generated method stub
//输入数值
double a = new Scanner(System.in).nextDouble();
double b = new Scanner(System.in).nextDouble();
// 触发含参构造 BigDecimal(String val)——推荐
// 将a,b转成string类型的数据
BigDecimal bd1 = new BigDecimal(String.valueOf(a));
BigDecimal bd2 = new BigDecimal(b + "");
//两个大数相加
BigDecimal result = bd1.add(bd2);
System.out.println(result);
//两个大数相减
result= bd1.subtract(bd2);
System.out.println(result);
//两个大数相乘
result = bd1.multiply(bd2);
System.out.println(result);
//result = bd1.divide(bd2);//相除时,不能这么除,有坑!!! 需要使用重载的divide方法
// 重载divide(x,y,z)
// x:代表要参与运算的对象名称,
//y:代表的是保留的小数位数,
//z:代表是舍入模式(通常用四舍五入——BigDecimal.ROUND_HALF_UP)
//两个大数相除,
result = bd1.divide(bd2, 10, BigDecimal.ROUND_HALF_UP);
System.out.println(result);
}
}