值传递
Java的值传递和所谓的引用传递
本质上Java只有值传递,所有的赋值传参都是一次值的拷贝
引用数据类型拷贝的就是引用地址;基本数据类型拷贝的是值(不会传如实例对象本身的)
public class Ch01 {
private String name;
public Ch01(String name) {
this.name=name;
}
public static Ch01 change(Ch01 ch01) {
ch01 = new Ch01("JERRY");
return ch01;
}
public static void change(int j) {
j=8;
}
public static void main(String[] args) {
Ch01 ch01 = new Ch01("TOM");
System.out.println(change(ch01));
int i=5;
change(i);
System.out.println(i);
}
@Override
public String toString() {
return "Ch01{" +
"name='" + name + '\'' +
'}';
}
}
输出结果:
name='JERRY';
i=5;
public void setName(String name) {
this.name = name;
}
public static Ch01 change(Ch01 ch01) {
ch01.setName("JERRY");
return ch01;
}
public static void main(String[] args) {
Ch01 ch01 = new Ch01("TOM");
change(ch01);
System.out.println(ch01);
}
输出结果:
name='JERRY';
常用API
API:Application Programming Interface(应用程序接口)
JDK给我们提供的一些已经写好的类,我们可以直接调用方法解决问题
我们类的方法,在宏观上都可以称为接口
API文档,介绍API
Date类
时间、时区(北京时间:东八区)
时间戳:1970.1.1 00:00:00 到今天2022.7.28 9:29:30的毫秒数
1s=1000ms、1min=60s
时间戳在全世界都是固定的(格林尼治时间)
System.currentTimeMillis()
获取时间戳
可以通过时间戳转换成我们当前所在地的具体时间和日期
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
if (i%100 ==0) {
System.out.println(i);
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
使用以上方式,在程序运行前后可以计算消耗了多少时间
将时间戳放入Date()
将指定时间戳放入new Date()
中
将会按照默认更新返回指定时间的时间格式
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
long milliseconds = System.currentTimeMillis();
System.out.println(milliseconds);
date = new Date(1658974491148L);
System.out.println(date);
}
after方法
判断date1
是否在date2
之后
如果是 返回true
反之返回false
Date date1 = new Date(1658974491148L);
Date date2 = new Date();
System.out.println(date1.after(date2));
System.out.println(date2.after(date1));
compareTo方法
当返回负数时,说明date1>date2
当返回0时,说明date1=date2
当返回正数时,说明data1<date2
System.out.println(date1.compareTo(date2));
System.out.println(date2.compareTo(date1));
System.out.println(date2.compareTo(date2));
equals方法
判断两个时间是否相等,返回true
或false
System.out.println(date1.equals(date2));
System.out.println(date2.equals(date2));
输出七天后的时间
思路:
计算好七天一共多少毫秒,定义现在的时间戳
七天后的时间戳即为bt+milliseconds
,最后放入Date()
中
public static void main(String[] args) {
long bt = 768000000L*7;
long milliseconds = System.currentTimeMillis();
Date date = new Date();
System.out.println("今天的时间是 "+date);
date = new Date(bt+milliseconds);
System.out.println("七天后的时间是 "+date);
}
Calendar类
日历类:日期时间
Calendar
是一个抽象类,不能创建对象初始化:
提供了一组对 年月日时分秒星期 将信息操作的函数 操作不同时区的信息
JDK1.1版本开始,在处理时间和日期是,系统推荐使用Calendar
类
所以Calendar
比Date
强大的多Calendar calendar = Calendar.getInstance();
获取子类对象(向上转型)
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.MINUTE));
System.out.println(calendar.get(Calendar.MILLISECOND));
System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.HOUR));
System.out.println(calendar.get(Calendar.SECOND));
输出:
2022
28
6
57
851
5
209
10
10
53
TimeZone类
public static void main(String[] args) {
System.out.println(TimeZone.getDefault());
System.out.println(new Date());
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(calendar.get(Calendar.HOUR));
}
ZoneId类
public static void main(String[] args) {
ZoneId zoneId = ZoneId.of("America/New_York");
System.out.println(TimeZone.getTimeZone(zoneId));
}
SimpleDateFormat类
SimpleDateFormat
日期格式化format
: 格式化Date
类型,把Date
类型转成String
类型parse
:把String
类型的时间,转成Date
类型
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
/*
yyyy:年
yy:年的后两位
MM:月
dd:日
HH:小时 24小时
hh:小时 12小时
mm:分
ss:秒
SSS:毫秒
*/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss.SSS");
System.out.println(sdf.format(date));
}
小题1
使用Date类:
打印输出七天以后的日期和时间
public class Demo01 {
public static void main(String[] args) {
long bt = 86400000L*7;
long milliseconds = System.currentTimeMillis();
Date date = new Date();
System.out.println("今天的时间是 "+date);
date = new Date(bt+milliseconds);
System.out.println("七天后的时间是 "+date);
}
}
小题2
设计一个工具类
可以对Date类型的日期进行格式化,转成String
可以对String类型的日期进行转换,转成Date
public class DateUtils {
public static void main(String[] args) throws ParseException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
System.out.println(simpleDateFormat.format(date));
date = simpleDateFormat.parse("2022/01/01 10:00:30");
System.out.println(date);
}
}
JDK8的日期时间类
在JDK8之前,处理日期和时间,基本上就是用上面的几个类
Date
和Calendar
获取到的月份都是0-11,而不是我们生活中的1-12阿里巴巴规约明确要求:
如果JDK8的应用,可以使用instant
来代替Date
LocalDateTime
代替Calendar
,DateTimeFormatter
代替SimpleDateFormat
新的时间类:instant、LocalDateTime、LocalDate、LocalTime
instant类
public static void main(String[] args) {
Instant instant = Instant.now();
System.out.println(instant.atZone(ZoneId.systemDefault()));
System.out.println(instant.getEpochSecond());
System.out.println(instant.toEpochMilli());
long milliSecond = System.currentTimeMillis();
System.out.println(Instant.ofEpochMilli(milliSecond));
System.out.println("----------------------");
String text = "2022-07-28T14:06:50.100Z";
Instant parse = Instant.parse(text);
System.out.println(parse);
}
持续时间Duration
public static void main(String[] args) {
Instant instant = Instant.now();
Instant plus = instant.plus(Duration.ofDays(5));
System.out.println(plus);
}
LocalDate类
public static void main(String[] args) {
System.out.println(LocalDate.now());
System.out.println(LocalDate.now().getMonth());
System.out.println(LocalDate.now().getDayOfWeek());
System.out.println(LocalDate.now().getDayOfMonth());
System.out.println(LocalDate.of(2022, 9, 10));
System.out.println(LocalDate.now().isLeapYear());
}
LocalTime类
public static void main(String[] args) {
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
System.out.println(localTime.getSecond());
}
LocalDateTime类
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
System.out.println(localDateTime.getHour());
}
DateTimeFormatter类
public static void main(String[] args) {
LocalDate now = LocalDate.now();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
System.out.println(now.format(dateTimeFormatter));
}
时间类的相互转换
public static void main(String[] args) {
Instant instant = Instant.now();
Date date = Date.from(instant);
Instant instant2 = date.toInstant();
LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
Instant instant3 = LocalDateTime.now().toInstant(ZoneOffset.UTC);
Date date1 = new Date();
Instant instant4 = date.toInstant();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,ZoneId.systemDefault());
LocalDateTime now = LocalDateTime.now();
Instant instant5 = now.atZone(ZoneId.systemDefault()).toInstant();
Date date2 = Date.from(instant5);
}
Math数学类
random() 随机数 double
ceil() 向上取整 double
floor() 向下取整 double
round() 四舍五入 long
Math.PI
Math.E
BigDecimal统计类
public static void main(String[] args) {
double d1 = 0.7;
double d2 = 0.1;
BigDecimal bigDecimal1 = new BigDecimal(d1);
BigDecimal bigDecimal2 = new BigDecimal(d2);
BigDecimal bigDecimal3 = new BigDecimal("0.7");
BigDecimal bigDecimal4 = new BigDecimal("0.1");
System.out.println(bigDecimal3.add(bigDecimal4));
}
Random随机类
public static void main(String[] args) {
Random random = new Random();
System.out.println(random.nextInt(2));
}
Arrays数组类
public static void main(String[] args) {
int [] arr = new int[]{1,2,3,4,5};
System.out.println(Arrays.toString(arr));
Arrays.sort(arr);
System.out.println(Arrays.binarySearch(arr, 2));
int[] newArr = Arrays.copyOf(arr, 2);
System.out.println(Arrays.toString(newArr));
System.out.println(Arrays.equals(arr, newArr));
}
System类
public static void main(String[] args) {
System.exit(-1);
System.out.println();
System.err.println("there has a error");
System.currentTimeMillis();
System.gc();
Properties properties = new Properties();
System.out.println(properties);
}
Objects类
public static void main(String[] args) {
System.out.println(Objects.isNull(""));
}
equals的不同点
String类中的equals方法与Object类中的equals方法的不同点
String类中的equals方法是用来判断两个对象的内容是否相同,而Object 类中的equals方法是用来判断两个对象是否是同一个对象,所谓同一个对象指的是内存中的同一块存储空间。
StringBuffer和StringBuilder类
可变的字符序列,和
String
是有本质区别的
String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中
创建一个新的对象,所以经常改变内容的字符串最好不要用String
,因为每次生成对象,都会对系统性能产生影响。 >
StringBuilder
又称为可变字符序列,是JDK5.0中新增加的一个类,它是一个类似于
String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。即它是一个 容器,容器中可以装很多字符串,并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容,StringBuilder
会自动维护数组的扩容。
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer("你好");
System.out.println(stringBuffer);
stringBuffer.append(",我好").append(",大家好");
System.out.println(stringBuffer);
stringBuffer.delete(4,7);
stringBuffer.deleteCharAt(0);
stringBuffer.insert(1,"哈哈");
stringBuffer.reverse();
System.out.println(stringBuffer);
String str = "hello";
String s = str.concat(",world!!");
System.out.println("str = " + str);
System.out.println("s = " + s);
}