目录
一、值传递
是指在调用函数时将参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数
private String name;
public ch01(String name){
this.name=name;
}
public static void change(ch01 c){
c=new ch01("hh");
//没有返回值
}
public static void main(String[] args) {
ch01 c=new ch01("hhh");
change(c);//混淆,有无都可
System.out.println(c);
}
结果:hhh
基本类型作为参数传递时, 是传递值的拷贝, 无论你怎么改变这个拷贝,原值是不会改变的 。
引用传递
是指在调用函数时将参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数
private String name;
public ch01(String name){
this.name=name;
}
public static void change(ch01 c){
c=new ch01("hh");
//没有返回值
}
public static void main(String[] args) {
ch01 c=new ch01("hhh");
change(c);//混淆,有无都可
System.out.println(c);
}
结果:hh
引用类型作为参数, 传递的是对象的引用, 改变会影响原值。
总结:Java参数传递不管基本类型还是引用类型, 都是值传递。
二、API
1. 概念
API (Application Programming Interface) :应用程序编程接口。
2.时间相关api
注册时间 最后一次修改的时间 必须有
时区:东八区(格林尼治天文台,伦敦)
时间戳:
public static void main(String[] args) {
//获取时间戳
//可以通过时间戳转换成我们当地所在地的具体时间和日期
System.out.println(System.currentTimeMillis());
long start=System.currentTimeMillis();
for (int i = 0; i <100000 ; i++) {
if (i%100==0){
System.out.println(i);
}
}
long end=System.currentTimeMillis();
}
3.Date类
表示特定的时刻,精度为毫秒
-
构造方法
Date():分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒;
Date(long date):分配 Date对象并初始化它以表示自标准基准时间以来的指定毫秒数,即1970年1月1日00:00:00;
public static void main(String[] args) {
Date data=new Date() ;
System.out.println(data);
}
4. 日期类 Data
public static void main(String[] args) {
Date data=new Date() ;
System.out.println(data);
}
结果:Thu Jul 28 11:39:27 CST 2022
实例:
/*
使用Date类
打印输出7天以后的日期和时间
*/
public class test1 {
public static void main(String[] args) {
Date data = new Date();
long mills=data.getTime()+1000*60*60*24*7;
System.out.println(mills);
}
}
结果:1659584412380
5.日历类:日期时间
- calendar是一个抽象类
- 初始化: 提供一组对“年月日分秒星期”等信息的操作函数。操作不同时区的信息。
- 1.1版本开始 系统推荐Calendar ,Calendar 比Date强大的多
public static void main(String[] args) {
Calendar calendar =Calendar.getInstance();
System.out.println(calendar.get(Calendar.YEAR));
System.out.println(calendar.get(Calendar.DATE));
System.out.println(calendar.get(Calendar.MONTH));
System.out.println(calendar.get(Calendar.HOUR_OF_DAY));
System.out.println(calendar.get(Calendar.MILLISECOND));
}
结果:2022
28
6
11
855
6.时区: 一般用上海时间
public static void main(String[] args) {
// System.out.println(TimeZone.getDefault());
System.out.println(new Date());
Calendar calendar=Calendar.getInstance();
calendar.setTimeInMillis(calendar.getTimeInMillis());
System.out.println();
}
结果:Thu Jul 28 11:54:17 CST 2022
ZoneId:
ZoneId zoneId= ZoneId.of("America/New_York"); System.out.println(TimeZone.getTimeZone(zoneId));
7. 日期格式化 ***
SimpleDateFormat
format:格式化 date 类型,把Date类型转成String类型
我们要展示数据到客户端
parse:把String类型的时间,转成Date类型
从客户端传过来的时间,一般是String类型,转成Data类型,存入数据库
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 simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s=simpleDateFormat.format(date);
System.out.println(s);
}
小测试1:
使用Date类 打印输出7天以后的日期和时间
public static void main(String[] args) {
Date data = new Date();
long mills=data.getTime()+1000*60*60*24*7;
System.out.println(mills);
}
结果:1659607945117
小测试2:
设计一个工具类: 可以对Date类型的日期进行格式化,转成String format方法参数是Date:返回值是String可以对String类型的日式进行格式转换,转换成Date parse方法 参数是String,返回值是Date
public class DateUtils {
public static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
public static final String dateToString(Date date) {
return simpleDateFormat.format(date);
}
public static final Date stringToDate(String dateSty) throws ParseException{
return simpleDateFormat.parse(dateSty);
}
public static void main(String[] args) {
Date date=new Date();
System.out.println(date);
}
}
三.JDK8 的日期时间类
在JDK8之前,处理时间和日期,基本上就是用我们上面几个类。 Date和Calendar,获取到的月份都是0-11,而不是我们生活中的1-12. 阿里巴巴规约的明确要求: 如果是JDK8的应用,可以使用Instant代替Date LocalDateTime代替Calender DateTimeFormatter代替SimpleDateFormat 新的实践类: Instant LocalDate LocalTime LocalDateTime DateTimeFormatter
public static void main(String[] args) {
Instant instant=Instant.now();
//atZone(ZoneId.systemDefault() 获取当前地区的时间
System.out.println(instant.atZone(ZoneId.systemDefault()));
//获取时间戳:秒数
System.out.println(instant.getEpochSecond());
//获取毫秒数
System.out.println(instant.toEpochMilli());
long millis=System.currentTimeMillis();
System.out.println(Instant.ofEpochMilli(millis));
System.out.println("------------------");
String text ="2022-07-28T06:06:51.935Z";
Instant parse=Instant.parse(text);
System.out.println(parse);
}
结果:
2022-07-28T18:17:08.251+08:00[Asia/Shanghai]
1659003428
1659003428251
2022-07-28T10:17:08.320Z
------------------
2022-07-28T06:06:51.935Z
1.持续时间Duration
public static void main(String[] args) {
Instant instant=Instant.now();
Instant instant1=instant.plus(Duration.ofDays(5));
System.out.println(instant1);
}
结果:2022-08-02T10:20:16.388Z
2.LocalDate:获取当前的日期
public static void main(String[] args) {
LocalDate now=LocalDate.now();
System.out.println(now);
System.out.println(now.getMonth());
System.out.println(now.getDayOfWeek());
System.out.println(now.getDayOfMonth());
LocalDate of=LocalDate.of(2022,9,10);
System.out.println(of);
//判断是否为闰年
System.out.println(now.isLeapYear());
}
结果:
2022-07-28
JULY
THURSDAY
28
2022-09-10
false
3.LocalTime:本地时间
public static void main(String[] args) {
LocalTime now = LocalTime.now();
System.out.println(now);
}
结果:18:22:30.162
4.LocalDateTime
public static void main(String[] args) {
LocalDateTime now=LocalDateTime.now();
System.out.println(now);
}
结果:2022-07-28T18:23:33.541
5.DateTime 格式化
public static void main(String[] args) {
LocalDate now=LocalDate.now();
DateTimeFormatter dateTimeFormatter=DateTimeFormatter.ofPattern("yyyy/MM/dd");
System.out.println(now.format(dateTimeFormatter));
}
结果:2022/07/28
6.数学类Math:
随机数 random() double
向上取整 ceil() 返回值 double
向下取整 floor() double
四舍五入 round () long
public static void main(String[] args) {
//生成0-1的随机数
//Math.random()*(max-min)+min
System.out.println(Math.random());
}
结果:0.7924773411336467
7.BigDecimal统计类
使用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(bigDecimal1.add(bigDecimal2));
System.out.println(bigDecimal3.add(bigDecimal4));
}
结果:
0.7999999999999999611421941381195210851728916168212890625
0.8
8.随机 Random
public static void main(String[] args) {
Random random=new Random();
System.out.println(random.nextInt(20));
}
结果:17
9.Arrays 数组
ic 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,4));
int[]ints=Arrays.copyOf(arr,2);
System.out.println(Arrays.toString(arr));
}
结果:
[1, 2, 3, 4, 5]
3
[1, 2, 3, 4, 5]
10.System类 系统类
public static void main(String[] args) {
System.out.println("1");
System.err.println("错误信息");
}
结果:
1
错误信息
11.Objects
public static void main(String[] args) {
System.out.println(Objects.isNull(""));
}
结果:false
12.StringBuffer和StringBuilder
可变的字符序列,和String是有本质区别的 String 不可变 StringBuffer 同步的, 安全,效率低 StringBuilder 异步的,不安全,同事处理多个请求(效率高)***
public static void main(String[] args) {
StringBuffer stringBuffer=new StringBuffer("你好");
System.out.println(stringBuffer);
//追加
stringBuffer.append(",我好").append(",大家好");
System.out.println(stringBuffer);
String string="hello";
String s=string.concat(",word!");
string.concat(",word!");
System.out.println("string="+string);
System.out.println("s="+s);
stringBuffer.delete(4,7);
System.out.println(stringBuffer);
stringBuffer.deleteCharAt(4);
System.out.println(stringBuffer);
stringBuffer.insert(1,"hh");
System.out.println(stringBuffer);
//翻转
stringBuffer.reverse();
System.out.println(stringBuffer);
}
结果:
你好
你好,我好,大家好
string=hello
s=hello,word!
你好,我家好
你好,我好
你hh好,我好
好我,好hh你
面试题: 三个字符串区别?
- 区别一:String是final类不能被继承且为字符串常量,而StringBuilder和StringBuffer均为字符串变量。
- 区别二:在String类中使用“+”作为数据的连接操作,而在StringBuffer类中使用append()方法(方法定义:public StringBuffer append(数据类型 变量))进行数据连接。
- 区别三:类的定义不同
- 区别四:String类和StringBuilder、StringBuffer类的转换。
1.String类通过apend()方法转换成StringBuilder和StringBuffer类。
2.StringBuffer类和StringBuilder类通过to.String()方法转换成String类型
- 区别五:String类、StringBuffer和StringBuilder类中定义的常用方法,三类的大部分方法(下例)可以互补。
- 区别六:线程安全性方面
1.StringBuilder(非线程安全)
2.StringBuffer(线程安全的)
四、心得体会
知识点倒是好理解,就是习题有点难搞,又是疲累的一天!!!