API概述
API (Application Programming Interface) :应用程序编程接口。Java中的API指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。
String类
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
String类的特点
- 字符串不可变,它们的值在创建后不能被更改
- 虽然 String 的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
创建String对象的两种方式
-
通过构造方法创建
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
-
直接赋值方式创建
以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护
字符串的比较
==号的作用
- 比较基本数据类型:比较的是具体的值
- 比较引用数据类型:比较的是对象地址值
equals方法的作用
public boolean equals(String s) //比较两个字符串内容是否相同、区分大小写
对于String类,如果使用new关键字创建,则相当于引用数据类型,此时用比较的是对象地址值。如果直接用字符串常量赋值,相当于基本数据类型,此时用比较的是具体的值。为了避免出错,建议都用equals方法比较。
示例
public class StringDemo02 {
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
//直接赋值的方式得到对象
String s3 = "abc";
String s4 = "abc";
//比较字符串对象地址是否相同
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s3 == s4); //true
System.out.println("--------");
//比较字符串内容是否相同
//下面全是true
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));
}
}
String常用方法
方法名 | 说明 |
---|---|
public boolean equals(Object anObject) | 比较字符串的内容 |
public int compareTo(String str) | 比较字符串的内容,返回0则说明内容相同,否则不同,可以用来对字符串排序 |
public char charAt(int index) | 返回指定索引处的 char 值 |
public int length() | 返回此字符串的长度 |
使用正则表达式
boolean matchers(String regExp):判断字符串是否匹配给定的正则表达式
String replaceAll(String regex, String replacement): 获取字符串中匹配正则表达式的子字符串
String[] split(String regex) :用正则表达式分割字符串,返回数组
StringBuilder类
StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的
StringBuilder类和String类的区别
- String类:内容是不可变的
- StringBuilder类:内容是可变的
StringBuilder类的构造方法
-
常用的构造方法
方法名 说明 public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容 public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象
public class StringBuilderDemo01 {
public static void main(String[] args) {
//public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
StringBuilder sb = new StringBuilder();
System.out.println("sb:" + sb);
System.out.println("sb.length():" + sb.length());
//public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
StringBuilder sb2 = new StringBuilder("hello");
System.out.println("sb2:" + sb2);
System.out.println("sb2.length():" + sb2.length());
}
}
StringBuilder类添加和反转方法
-
添加和反转方法
方法名 说明 public StringBuilder append(任意类型) 添加数据,并返回对象本身 public StringBuilder reverse() 返回相反的字符序列
public class StringBuilderDemo01 {
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
//public StringBuilder append(任意类型):添加数据,并返回对象本身
// StringBuilder sb2 = sb.append("hello");
//
// System.out.println("sb:" + sb);
// System.out.println("sb2:" + sb2);
// System.out.println(sb == sb2);
// sb.append("hello");
// sb.append("world");
// sb.append("java");
// sb.append(100);
//链式编程
sb.append("hello").append("world").append("java").append(100);
System.out.println("sb:" + sb);
//public StringBuilder reverse():返回相反的字符序列
sb.reverse();
System.out.println("sb:" + sb);
}
}
StringBuilder和String相互转换
-
StringBuilder转换为String
public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
-
String转换为StringBuilder
public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
public class StringBuilderDemo02 {
public static void main(String[] args) {
/*
//StringBuilder 转换为 String
StringBuilder sb = new StringBuilder();
sb.append("hello");
//String s = sb; //这个是错误的做法
//public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
String s = sb.toString();
System.out.println(s);
*/
//String 转换为 StringBuilder
String s = "hello";
//StringBuilder sb = s; //这个是错误的做法
//public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
StringBuilder sb = new StringBuilder(s);
System.out.println(sb);
}
}
ArrayList
概述
ArrayList类概述
-
什么是集合
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
-
ArrayList集合的特点
底层是数组实现的,长度可以变化
-
泛型的使用
用于约束集合中存储元素的数据类型
ArrayList常用方法
方法名 | 说明 |
---|---|
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
public class ArrayListDemo02 {
public static void main(String[] args) {
//创建集合,用到了泛型
ArrayList<String> array = new ArrayList<String>();
//添加元素
array.add("hello");
array.add("world");
array.add("java");
//public boolean remove(Object o):删除指定的元素,返回删除是否成功
// System.out.println(array.remove("world"));
// System.out.println(array.remove("javaee"));
//public E remove(int index):删除指定索引处的元素,返回被删除的元素
// System.out.println(array.remove(1));
//IndexOutOfBoundsException
// System.out.println(array.remove(3));
//public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
// System.out.println(array.set(1,"javaee"));
//IndexOutOfBoundsException
// System.out.println(array.set(3,"javaee"));
//public E get(int index):返回指定索引处的元素
// System.out.println(array.get(0));
// System.out.println(array.get(1));
// System.out.println(array.get(2));
//System.out.println(array.get(3)); //?????? 自己测试
//public int size():返回集合中的元素的个数
System.out.println(array.size());
//输出集合
System.out.println("array:" + array);
}
}
ArrayList存储学生对象并遍历
创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合,学生的姓名和年龄来自于键盘录入
/*
思路:
1:定义学生类,为了键盘录入数据方便,把学生类中的成员变量都定义为String类型
2:创建集合对象
3:键盘录入学生对象所需要的数据
4:创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
5:往集合中添加学生对象
6:遍历集合,采用通用遍历格式实现
*/
public class ArrayListTest {
public static void main(String[] args) {
//创建集合对象
ArrayList<Student> array = new ArrayList<Student>();
//为了提高代码的复用性,我们用方法来改进程序
addStudent(array);
addStudent(array);
addStudent(array);
//遍历集合,采用通用遍历格式实现
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
System.out.println(s.getName() + "," + s.getAge());
}
}
/*
两个明确:
返回值类型:void
参数:ArrayList<Student> array
*/
public static void addStudent(ArrayList<Student> array) {
//键盘录入学生对象所需要的数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄:");
String age = sc.nextLine();
//创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
Student s = new Student();
s.setName(name);
s.setAge(age);
//往集合中添加学生对象
array.add(s);
}
}
Math
Math类用来进行数学运算,无构造方法,所有方法都是静态的,可以通过类名直接调用。
常用方法
方法名 方法名 | 说明 |
---|---|
public static int abs(int a) | 返回参数的绝对值 |
public static double ceil(double a) | 返回大于或等于参数的最小double值,等于一个整数 |
public static double floor(double a) | 返回小于或等于参数的最大double值,等于一个整数 |
public static int round(float a) | 按照四舍五入返回最接近参数的int |
public static int max(int a,int b) | 返回两个int值中的较大值 |
public static int min(int a,int b) | 返回两个int值中的较小值 |
public static double pow (double a,double b) | 返回a的b次幂的值 |
public static double random() | 返回值为double的正值,[0.0,1.0) |
Random
可以用Math.random()生成一个随机数,介于0.0到1.0之间,但这其实是一个伪随机数。Java提供了Random类,可以传入种子,这样就能生成一个真的随机数了。而且Random类提供的方法可以生成各种类型的随机数。
import java.util.Random;
public class Test02 {
public static void main(String[] args) {
//返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
System.out.println("随机数:"+Math.random());
//Random类
//(1)利用带参数的构造器创建对象:
Random r1 = new Random(System.currentTimeMillis());//传入当前时间作为随机数种子
int i = r1.nextInt();
System.out.println(i);
//(2)利用空参构造器创建对象:
Random r2 = new Random();//无参构造默认调用系统的时间戳作为种子
System.out.println(r2.nextInt(10));//返回[0,10)之间均匀分布的 int 值。
System.out.println(r2.nextDouble(5));//返回[0.0,5.0)之间均匀分布的 double 值。
}
}
System
实例:在控制台输出1-10000,计算这段代码执行了多少毫秒
public class SystemDemo {
public static void main(String[] args) {
// 获取开始的时间节点
long start = System.currentTimeMillis();
for (int i = 1; i <= 10000; i++) {
System.out.println(i);
}
// 获取代码运行结束后的时间节点
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
}
垃圾回收机制
除了等待Java虚拟机进行自动垃圾回收外,还可以通过调用System.gc()方法来通知Java虚拟机立即进行垃圾回收。当一个对象在内存中被释放时,它的public void finalize()方法会被自动调用,因此可以在类中通过定义finalize()方法来观察对象何时被释放。
class Person{
public void finalize(){//此方法会在垃圾回收前被调用
System.out.println("对象被当做垃圾回收了。。。");
}
}
public class Demo{
public static void main(String[] args){
//创建了两个实例化对象
Person p1 = new Person();
Person p2 = new Person();
//让对象成为垃圾
p1=null;
p2=null;
//调用方法进行垃圾回收
System.gc();
for(int i = 0; i < 10000; i ++){}//延长程序执行时间
}
}
Runtime
Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此该类采用单例模式进行设计,对象不可以直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式。
Runtime run = Runtime.getRuntime();
Arrays
-
Arrays的常用方法
方法名 说明 public static String toString(int[] a) 返回指定数组的内容的字符串表示形式 public static void sort(int[] a) 按照数字顺序排列指定的数组 public static ArrayList asList(T…a) 将传入的多个数据包装成ArrayLIst集合并返回 -
工具类设计思想
1、构造方法用 private 修饰(没法创建对象了)
2、成员用 public static 修饰
时间日期类
util.Date类
方法名 | 说明 |
---|---|
public long getTime() | 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值 |
public void setTime(long time) | 设置时间,给的是毫秒值 |
public class DateDemo02 {
public static void main(String[] args) {
//创建日期对象
Date d = new Date();
//public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
// System.out.println(d.getTime());
// System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");
//public void setTime(long time):设置时间,给的是毫秒值
// long time = 1000*60*60;
long time = System.currentTimeMillis();//此方法等同于Data类提供的getTime方法
d.setTime(time);
System.out.println(d);
}
}
sql.Date
一般使用util.Date,sql.Date是专为数据库sql语句提供的,只有日期没有时间。
sql.Date没有无参构造,只有Date(long date)的构造方法。所以可以用new util.Date().getTime()获得当前日期的毫秒值作为参数传入sql.Date()中。下面的语句可以将util.Date转为数据库专用的sql.Date
java.sql.Date date = new java.sql.Date(util.Date(getTime()));
SimpleDateFormat类
-
SimpleDateFormat类概述
SimpleDateFormat是一个具体的类,用来设置接守日期的格式。设置好了格式之后,就可以用Date类生成想要的日期。
-
SimpleDateFormat类构造方法
方法名 说明 public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认模式和日期格式 public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat使用给定的模式和默认的日期格式 -
SimpleDateFormat类的常用方法
- 格式化(从Date到String)
- public final String format(Date date):将日期格式化成日期/时间字符串
- 解析(从String到Date)
- public Date parse(String source):从给定字符串的开始解析文本以生成日期
- 格式化(从Date到String)
-
设置格式
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) {
//SimpleDateFormat extends DataFormat
//格式化的标准参见jdk文档
DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
//String --> Date
try {
Date d = df.parse("2020/07/10 14:25:30");
System.out.println(d);//Fri Jul 10 14:25:30 GMT+08:00 2020
} catch (ParseException e) {
e.printStackTrace();
}
//Date --> String
String currentDate = df.format(new Date());//返回当前日期
System.out.println(currentDate);//2021/07/10 15:02:12
}
}
Calendar类
Date类提供的方法大部分都已经过时,现在常用Calendar类代替Date类。Calendar类是抽象类,不能用new来创建对象,它提供了一个getInstance()方法来返回一个实例化对象。
-
Calendar类常用方法
方法名 说明 public int get(int field) 返回给定日历字段的值 public abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段 public final void set(int year,int month,int date) 设置当前日历的年月日 -
示例代码
import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { //抽象类不能使用new关键字创建实例化对象 Calendar cal = Calendar.getInstance(); //常用方法,get() System.out.println(cal.get(Calendar.YEAR));//2021 System.out.println(cal.get(Calendar.MONTH));//6 System.out.println(cal.get(Calendar.DATE));//10 这里的DATE和DATE_OF_MONTH是一样的 System.out.println(cal.get(Calendar.DAY_OF_WEEK));//7 System.out.println(cal.getActualMaximum(Calendar.DAY_OF_MONTH));//获取当月最大天数 //set() cal.set(Calendar.YEAR,1949); cal.set(Calendar.MONTH,10); cal.set(Calendar.DATE,1); System.out.println(cal); java.sql.Date da = new java.sql.Date.valueOf("2021-4-20"); cal.setTime(da); System.out.println(cal); } }
日历项目
import java.util.Calendar;
import java.util.Scanner;
public class Test08 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//录入日期的String:
Scanner sc = new Scanner(System.in);
System.out.print("请输入你想要查看的日期:(提示:请按照例如2012-5-6的格式书写)");
String strDate = sc.next();
/*System.out.println(strDate);*/
//String--->Calendar:
//String-->Date:
java.sql.Date date = java.sql.Date.valueOf(strDate);
//Date--->Calendar:
Calendar cal = Calendar.getInstance();
cal.setTime(date);
//后续操作:
//星期提示:
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
//获取本月的最大天数:
int maxDay = cal.getActualMaximum(Calendar.DATE);
//获取当前日期中的日:
int nowDay = cal.get(Calendar.DATE);
//将日期调为本月的1号:
cal.set(Calendar.DATE,1);
//获取这个一号是本周的第几天:
int num = cal.get(Calendar.DAY_OF_WEEK);
/*System.out.println(num);*/
//前面空出来的天数为:
int day = num - 1;
//引入一个计数器:
int count = 0;//计数器最开始值为0
//在日期前将空格打印出来:
for (int i = 1; i <= day; i++) {
System.out.print("\t");
}
//空出来的日子也要放入计数器:
count = count + day;
//遍历:从1号开始到maxDay号进行遍历:
for (int i = 1; i <= maxDay ; i++) {
if(i == nowDay){//如果遍历的i和当前日子一样的话,后面多拼一个*
System.out.print(i+"*"+"\t");
}else{
System.out.print(i+"\t");
}
count++;//每在控制台输出一个数字,计数器做加1操作
if(count%7 == 0){//当计数器的个数是7的倍数的时候,就换行操作
System.out.println();
}
}
}
}
第三代日期类
JDK1.0中使用java.util.Date类 --》第一批日期时间API
JDK1.1引入Calendar类 --》第二批日期时间API
JDK1.8新增日期时间API --》第三批日期时间API
缺陷:
可变性 : 像日期和时间这样的类应该是不可变的。
偏移性 : Date中 的年份是从1900开始的,而月份都从0开始。
格式化 : 格式化只对Date有用,Calendar则不行。
新引入的日期类生成日期之后就不可变了,如果想要改变日期只能实例化一个新的对象,这就是不可变性。
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
* @Auther: msb-zhaoss
*/
public class Test09 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//1.完成实例化:
//方法1:now()--获取当前的日期,时间,日期+时间
LocalDate localDate = LocalDate.now();
System.out.println(localDate);
LocalTime localTime = LocalTime.now();
System.out.println(localTime);
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime);
//方法2:of()--设置指定的日期,时间,日期+时间
LocalDate of = LocalDate.of(2010, 5, 6);
System.out.println(of);
LocalTime of1 = LocalTime.of(12, 35, 56);
System.out.println(of1);
LocalDateTime of2 = LocalDateTime.of(1890, 12, 23, 13, 24, 15);
System.out.println(of2);
//LocalDate,LocalTime用的不如LocalDateTime多
//下面讲解用LocalDateTime:
//一些列常用的get***
System.out.println(localDateTime.getYear());//2020
System.out.println(localDateTime.getMonth());//JUNE
System.out.println(localDateTime.getMonthValue());//6
System.out.println(localDateTime.getDayOfMonth());//14
System.out.println(localDateTime.getDayOfWeek());//SUNDAY
System.out.println(localDateTime.getHour());//22
System.out.println(localDateTime.getMinute());//22
System.out.println(localDateTime.getSecond());//6
//不是set方法,叫with
//体会:不可变性
LocalDateTime localDateTime2 = localDateTime.withMonth(8);
System.out.println(localDateTime);
System.out.println(localDateTime2);
//提供了加减的操作:
//加:
LocalDateTime localDateTime1 = localDateTime.plusMonths(4);
System.out.println(localDateTime);
System.out.println(localDateTime1);
//减:
LocalDateTime localDateTime3 = localDateTime.minusMonths(5);
System.out.println(localDateTime);
System.out.println(localDateTime3);
}
}
设置格式化:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
/**
* @Auther: msb-zhaoss
*/
public class Test10 {
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//格式化类:DateTimeFormatter
//方式一:预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;IS0_LOCAL_TIME
DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//df1就可以帮我们完成LocalDateTime和String之间的相互转换:
//LocalDateTime-->String:
LocalDateTime now = LocalDateTime.now();
String str = df1.format(now);
System.out.println(str);//2020-06-15T15:02:51.29
//String--->LocalDateTime
TemporalAccessor parse = df1.parse("2020-06-15T15:02:51.29");
System.out.println(parse);
//方式二:本地化相关的格式。如: oflocalizedDateTime()
//参数:FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT
//FormatStyle.LONG :2020年6月15日 下午03时17分13秒
//FormatStyle.MEDIUM: 2020-6-15 15:17:42
//FormatStyle.SHORT:20-6-15 下午3:18
DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
//LocalDateTime-->String:
LocalDateTime now1 = LocalDateTime.now();
String str2 = df2.format(now1);
System.out.println(str2);
//String--->LocalDateTime
TemporalAccessor parse1 = df2.parse("20-6-15 下午3:18");
System.out.println(parse1);
//方式三: 自定义的格式。如: ofPattern( "yyyy-MM-dd hh:mm:ss") ---》重点,以后常用
DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//LocalDateTime-->String:
LocalDateTime now2 = LocalDateTime.now();
String format = df3.format(now2);
System.out.println(format);//2020-06-15 03:22:03
//String--->LocalDateTime
TemporalAccessor parse2 = df3.parse("2020-06-15 03:22:03");
System.out.println(parse2);
}
}