什么是JDK API?
Application Programming Interface 应用程序接口
已经写好的,可供直接调用的类。
比如: 字符串操作、IO流、集合操作、线程、网络编程Socket等等
常用包 主要功能
java.lang Java程序基础类,如:String、线程Thread等,不用通过import关键字导包
java.util 工具类,如集合Collection、随机数Random、时间Date等
java.io 输入输出IO流
java.math 数学运算操作
java.net 网络编程,如Socket
java.sql 操作数据库,如:JDBC
java.text 文本操作等 JDK常用包 API官方文档 不认识的类就去查
文档注释一般加载类和方法的开头,用于说明作者、时间、版本等信息。 以 “/**”开头
/**
* zhe shi yi ge zi ding yi de Person lei
*
* @author Le
* @since jdk2.1
*/
public class MyPerson {
String name;
int age;
double salary;
/**
* @return int
* @param i
*/
public int show(int i) {
System.out.println("show...");
return i;
文档注释可以使用javadoc命名生成一个html文档
生成结果如下
二、常用类
1.String类
1.1 String对象不能改变
String 的底层是字符数组
String类是final修饰的,不能被继承,不能改变,但引用可以重新赋值
String采用编码方式是Unicode
}
}
String的底层是字符数组
private final char value[];//定义了一个字符数组
String类是final修饰的,不能被继承,不能改变,但引用可以重新赋值
String采用编码方式是Unicode
享元模式:(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少 内存使用量以及分享资讯给尽可能多的相似物件;它适合用于只是因重复而导致使用无法令人接受 的大量内存的大量物件。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构 (常量池),当需要使用时再将它们传递给享元(字符串的直接量)。
Java为了提高性能,静态字符串在常量池中创建,并且是同一对象,使用时直接拿取。
对于重复的字符串直接量,JVM会去常量池查找,如果有则返回,无则创建。
注意:
/*常量池,外部的数据结构,用来存储字符串 --当创建字符串时会去常量池中去查找,如果有对象的对象则直接返回,如果没有则创建
面试加分:
常量池存储在什么地方?堆中?栈中?方法区中?
1.jdk1.6,常量池放在方法区的永久代里
2.jdk1.7,Oracle的工程师调整至java堆中
3.jdk1.8,移除到Metaspace(元数据区),在堆中
4.jdk1.8之前,常量池本质是char[]
5.jdk1.9时,常量池修改为byte类型的数组
测试:常量池
//在常量池中查找,没有创建一个"Hello";
String s = "Hello";
//在常量池中查询,不会创建新对象
String s1 = "Hello";
System.out.println(s == s1);//true
String s2 = new String("Hello");
System.out.println(s1 == s2);//false
扩展:
扩展案例:
String s = new String("java");创建了几个对象?1/2
//以下语句分别创建了几个对象?
String string1 = "java";// 对象:0/1
//2.
String string2 = new String("c");//对象:1/2
//3.常量的拼接在编译时会直接拼接 “java"+”c"---->"javac"
String string3 = new String("java"+"c");//对象:1/2
//4.
String str1 = "php"; //
String string4 = "java" + str1;// 对象:0/1/2/3
//5."c++" "javaC" "javacc++"
String str2 = "c++";// 对象:0/1
String string5 = new String("java" +"c" + str2);// 对象:1/2/3/4
//6."c#" "java" "c" javac#" "javac#c"
String str3 = "c#";// 对象:1
String string6 = new String("java" + str3 +"c");// 对象:1/2/3/4/5/6
//1.无参的
String s1 = new String();
System.out.println(s1);//不是null 而是空字符
//2.byte[] Unicode编码转化为对应的字符
String s2 = new String(new byte[]{97,98,99});
System.out.println(s2); //a,b,c
//3.byte[] 截取字符串,Unicode编码转化为对应的字符
String s3 = new String(new byte[]{97,98,99},1,1); //截取
System.out.println(s3); //a,b,c
//4.byte[] GBK编码转化为对应的字符 "GBK"支持中文的编码,"utf-8"国际编码 ,"utf8"
String s4 = new String(new byte[]{97,98,99},1,1,"GBK"); //截取
System.out.println(s4); //a,b,c
//5.StringBuffer
String s5 = new String(new StringBuffer("hello"));
System.out.println(s5);
//6.byte[],字符集
String s6 = new String(new byte[]{97,98,99},"utf-8");
System.out.println(s6);
//7.StringBuilder
String s7 = new String(new StringBuilder("world"));
System.out.println(s7);
//8.String副本
String s8 = new String(new String("how are you ?"));
System.out.println(s8);
//9.char[]
String s9 = new String(new char[]{'a','b','c'});
System.out.println(s9);
//10.char[] 加参数
String s10 = new String(new char[]{'a','b','c','d','e'},1,3);
System.out.println(s10);
//11.int[]
String s11 = new String(new int[]{65,66,67},1,2);
System.out.println(s11);
//12.找出字符串”java",v出现的位置索引,返回int 参数String 'v'
String str = new String("java");
System.out.println(str.indexOf("v"));
//13.根据索引找字符串
char c = str.charAt(1);
System.out.println(c);
//14.给出一个字符串,找出末尾是不是为com结束
String str1 = new String("javacom");
System.out.println(str1.endsWith("com"));
//一.String的判断方法
/*
boolean equals(Object obj):比较字符串的内容是否相等
boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
boolean startWith(String str):判断字符串是否以指定的str开头
boolean endwith(String str):判断字符串是否以指定的str开结尾
*/
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s2);//false
String s3 = "HELLO";
System.out.println(s1.equalsIgnoreCase(s3)); //true
String s4 = "stroor";
System.out.println(s4.startsWith("str")); //true
System.out.println(s4.endsWith("str")); //false
//二.String 的截取
/*
int length():获取字符串的长度,其实也就是字符个数
char charAt(int index):获取指定索引处的字符
int indexof(String str):获取str在字符串对象中第一次出现的索引
String substring(int start):从start开始截取字符串
String substring(int start,int end):从start开始,到end结束截取字符串,前包后不包
*/
String str1 = "hello world";
System.out.println(str1.length()); //11
System.out.println(str1.charAt(7)); //o
System.out.println(str1.indexOf("o")); //4
String str2 = str1.substring(4);
System.out.println(str2); //o world
String str3 = str1.substring(2,8);
System.out.println(str3); //llo wo
//三.String 的转换
/*
char[] toCharArray():把字符串转换为字符数组
String toLowerCase():把字符串转换为小写字符串
String toUpperCase():把字符串转换为大写字符串
*/
String string1 = "String,char";
char[] ch =string1.toCharArray();
System.out.println(ch); //String,char
String string2 = "HEllo";
System.out.println(string2.toLowerCase()); //hello
System.out.println(string2.toUpperCase()); //HELLO
//四.String的其他方法
/*
String trim():去除字符串两端空格
String[] split(String str):按照指定符合分割字符串
*/
String string3 = " blank ";
System.out.println(string3.trim()); //blank
String string4 = new String("hello*world*girl");
String[] a1 = string4.split("\\*");
System.out.println(Arrays.toString(a1));
:在StringAPI中任意选取5个方法测试,并总结
//作业:在StringAPI中任意选取5个方法测试,并总结
/*1.concat(String str)
功能:将指定字符串联到当前字符串的结尾
返回值:String
*/
String str1 = "hello";
System.out.println(str1.concat("world")); //helloworld
/*2.indexOf(String str)
功能:查询指定的字符串是否存在
参数:字符串
返回值:存在,字符串的位置,不存在,返回-1
*/
String str2 = "www.baidu.com";
System.out.println(str2.indexOf("com")); //10
System.out.println(str2.indexOf("xfv")); //-1
/*3.split(String regex)
功能:分割字符串
参数:正则表达式,
返回值:分割后的字符串数组
*/
String str3 = "I like eat bread";
String[] a = str3.split(" ");
System.out.println(Arrays.toString(a)); //[I, like, eat, bread]
/*4.replace(char oldChar, char newChar)
功能:替换字符串,使用新的字符替换掉当前字符串中出现的所有旧的字符
参数:oldChar:被替换的字符串,newChar:新的字符串
返回值:返回一个新的字符串
*/
String str4 = "I like rice,I like bread ";
System.out.println(str4.replace("like","hate")); //I hate rice,I hate bread
/*5.substring(int beginIndex, int endIndex)
功能:截取字符串,从开始位置截取到结束位置,不包含结束位置 (beginIndex——endIndex-1)
返回值:返回一个新字符串
*/
String str5 = "communication";
System.out.println(str5.substring(2,7)); //2--6为:mmuni
:在控制台任意输入一个网址(www开头,com结尾),然后根据网址截取中间部分
public class TestCase {
//:在控制台任意输入一个网址(www开头,com结尾),然后根据网址截取中间部分
//比如www.baidu.com的baidu
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个网址(www开头,com结尾)");
String str1 = scanner.next();
if (str1.startsWith("www.") && str1.endsWith(".com")) {
int start = str1.indexOf(".")+1;
int end = str1.lastIndexOf(".");
System.out.println(str1.substring(start,end));
} else {
System.out.println("输入有误...");
}
}
}
Object person = new Person();
Person p = new Person();
System.out.println(p);
System.out.println(p.toString());
/*return getClass().getName() + "@" + Integer.toHexString(hashCode());
com.hqyj.api.objects.Person@1540e19d
Person向上造型为Object,当Person对象没有指定的值时,返回地址
*/
//String类重写了父类的tostring方法
String s = new String("123");
System.out.println(s);
//Arrays也重写了toString方法
int[] a = new int[]{1,2,3};
System.out.println(Arrays.toString(a));
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
1. Object是所有类的父类,因此所有类型都可以造型成为Object
2. Object中提供了toString方法打印了对象的地址信息
3. 子类可以重写toString方法,改变逻辑体,打印想要的结果
比较字符串的内容:return (this == obj);
String s1 = new String("java");
String s2 = new String("java");
System.out.println(s1 == s2); //f
System.out.println(s1.equals(s2)); //t
Person person = new Person("zhangs",20);
Person person1 = new Person("zhangs",20);
System.out.println(person == person1); //f
System.out.println(person.equals(person1)); //t 重写了equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true; //判断是否传了对象
if (o == null || getClass() != o.getClass()) return false; //判断是否传了其他类型
Person person = (Person) o;
if (age != person.age) return false; //向下造型
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
* javaBean pojo entity,实体类
*
* 1.定义私有属性
* 2.无参构造方法
* 3.有参构造方法
* 4.set && get 方法
* 5.toString方法
* 6.equals方法
创建实体类,属性:uid uname pwd
public class User {
private int uid;
private String uname;
private String pwd;
//无参构造方法
public User() {
}
//有参构造方法
public User(int uid, String uname, String pwd) {
this.uid = uid;
this.uname = uname;
this.pwd = pwd;
}
//set && get 方法
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
//重写 toString方法
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uname='" + uname + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
//重写 equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if (uid != user.uid) return false;
if (uname != null ? !uname.equals(user.uname) : user.uname != null) return false;
return pwd != null ? pwd.equals(user.pwd) : user.pwd == null;
}
@Override
public int hashCode() {
int result = uid;
result = 31 * result + (uname != null ? uname.hashCode() : 0);
result = 31 * result + (pwd != null ? pwd.hashCode() : 0);
return result;
}
}
1.Object:
- 1.1 Object是所有类的父类,因此所有类型都可以造型成为Object
- 1.2 Object中提供了toString方法打印了对象的地址信息
2.toString方法:
- 2.1 子类可以重写toString方法,改变逻辑体,打印想要的结果
- 2.2 toString方法是一个常用的调试工具,因此建议给每一个javaBean都添加toString方法
3.equals方法
- 3.1 对于equals方法,如果没有重写,==和equals完全没有区别
- 3.2 建议对每一个实体类读添加equals方法,比较属性的值
- 1.没有重写时,两者没有区别,源码中的equals()也是运用==去比较的
- 2.重写了equals后,比较的是属性的值
4.实体类创建:
- 定义私有属性
- 无参构造方法
- 有参构造方法
- set && get 方法
- toString方法
- equals方法
包装类就是基本类型转化成为对象的类(Java.lang.Number类下的子类提供了8种基本类型的包装 类)。
每一个基本类型都有一个与之对应的包装类(wrapper)。
基本类型 | 包装类型 | 目录 |
byte | Byte | java.lang.Number |
short | Short | java.lang.Number |
int | Interger | java.lang.Number |
long | Long | java.lang.Number |
float | Float | java.lang.Number |
double | Double | java.lang.Number |
boolean | Boolean | java.lang.Object |
char | Character | java.lang.Object |
Integer i1 = 1;
System.out.println(i1);
int i2 = i1.intValue(); //将包装类转换为int类型
System.out.println(i2);
int i3 = 12;
Integer i4 = Integer.valueOf(i3);
System.out.println(i4);
int i5 = 121;
String i6 = String.valueOf(i5);
System.out.println(i6);
String i7 = "12";
int i8 = Integer.parseInt(i7);
System.out.println(i8);
String str1 = "456";
Integer d = Integer.parseInt(str1);
System.out.println(d);
Integer m = 123456;
String str2 = m.toString();
String str3 = String.valueOf(m);
System.out.println(str2);
System.out.println(str3);
总结:
1.八大基本类型都有对应的包装类
2.转换关系: --包装类 ---> 基本类型:int i.intValue(Integer i)
--基本类型 ---> 包装类:Integer.valueOf(int i)
--基本类型 ---> String:String.valueOf(int i)
--String ---> 基本类型:Integer.parseInt(String str)
--String-->包装类:Integer.parseInt(String str)
--包装类-->String:Integer m.toString()
//构造方法,传入的参数因与包装类型相匹配
Integer s = new Integer("123456");
System.out.println(s);
4.自动装箱和拆箱
Integer a = 100;
Integer b = 200;
Integer c = a + b;
System.out.println(c);
Java中的时间是用一个固定时间点的毫秒数表示
纪元(epoch):1970年1月1日 00:00:00
常见的时区:
1.1构造方法
Date对象封装了当前时间
Date date = new Date();
System.out.println(date);
//Sat Apr 09 14:34:31 CST 2022 当前时间
1.2setTime和getTime
//如何打印明天的当前时间
//方式1::
Date date1 = new Date();
date1.setTime(System.currentTimeMillis()+86400000);
System.out.println(date1);
//方式2:
long ms = System.currentTimeMillis() + (60*60*24*1000);
Date date2 = new Date(ms);
System.out.println(date2);
2.1构造方法
SimpleDateFormat()
用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
2.2日期匹配字符
2.3常用方法
// (日期 -> 文本)
//1.获取日期
Date date1 = new Date();
System.out.println(date);
//2.设置文本规则
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
//3.输出文本
String format = simpleDateFormat.format(date1); //格式化
System.out.println(format);
//(文本 -> 日期)
//1.设置文本
String str = "2022-5-20 : 12:00:00"; //yyyy-M-dd : HH:mm:ss
//2.解析文本
SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-M-dd : HH:mm:ss");
//3.获取日期
Date date2 = simpleDateFormat1.parse(str); //自己解决异常,抛出
System.out.println(date2);
3.1构造方法
//1.创建Calendar对象
// Calendar calendar1 = new GregorianCalendar(); //方式1
// Calendar calendar2 = Calendar.getInstance(); //方式2
//2.传入时间
//方式1
Calendar calendar1 = new GregorianCalendar(2022,4,9,15,27,30);
Date date = calendar1.getTime();
System.out.println(date);
//方式2
//1.set参数
Calendar calendar2 = Calendar.getInstance();
calendar2.set(2022,4,9);
System.out.println(calendar2.getTime());
//2.set重写的方式设置时间分量,Calendar中提供 了静态的属性,可以跟属性赋值
calendar2.set(Calendar.HOUR,15);
calendar2.set(Calendar.MINUTE,20);
System.out.println(calendar2.getTime());
3.2计算日期分量
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,2022);
//注意:初始值是从0开始的,阳历没有13月,但阴历有
calendar.set(Calendar.MONTH,12);
calendar.set(Calendar.DATE,6);
System.out.println(calendar.getTime());
//1。一周中的第几天
int week = calendar.get(Calendar.DAY_OF_WEEK);
//应该是周四,calendar从周日开始
System.out.println(week); //6
//2.一月中的第几周
int i = calendar.get(Calendar.WEEK_OF_MONTH);
System.out.println(i);
//3.一年的第几天
i = calendar.get(Calendar.DAY_OF_YEAR);
System.out.println(i);
//4.当前月的星期几
i = calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH);
System.out.println(i);
//5.22年的最大天数
i = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(i);
//6.当前月的最大周数
i = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);
System.out.println(i);
//计算21年的2月的最大天数
calendar.set(Calendar.MONTH,1);
System.out.println(calendar.getTime());
i = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("最大天数:"+i);
}