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 System.out.println(date1.compareTo(date2)); System.out.println(date2.compareTo(date1)); System.out.println(date2.compareTo(date2));
equals方法判断两个时间是否相等,返回 true或 falseSystem.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); 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类型的日期进行转换,转成Datepublic 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); }持续时间Durationpublic 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("")); }
StringBuffer和StringBuilder类可变的字符序列,和String是有本质区别的
String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中
创建一个新的对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象,都会对系统性能产生影响。 >StringBuilder又称为可变字符序列,是JDK5.0中新增加的一个类,它是一个类似于
String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。即它是一个 容器,容器中可以装很多字符串,并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容,StringBuilder会自动维护数组的扩容。



