目标
- java API
- Object 类
- 包装类
- 字符串类
- Math类
- 日期类
API
API (Application Programming Interface) 应用程序接口
结构:左上package 左下:对应的类和接口 右:方法和属性说明
java.lang包下:Java语言包 ,任何类中,该包中的类都会被自动导入。
java.util包: 工具包
java.io包:文件操作
java.net:网络
Object
它是所有类的超类,是唯一没有父类的类
java.lang.Object
hashcode:该方法返回对象的哈希码,十六进制
toString:类的完全限定名@hashcode
equals:比较两个引用类型的地址是否相等
public class TestObject {
public static void main(String[] args) {
TestObject to = new TestObject();
System.out.println(to.hashCode());
TestObject to1 = new TestObject();
System.out.println(to1.hashCode());
System.out.println(to.toString());
System.out.println(to);
}
}
equals:
if(to.equals(to1)){
System.out.println("相等");
}else{
System.out.println("不相等");
}
单例(懒汉式):
public class SingleTon {
//懒汉式
//1.私有静态的类型为自身的成员变量
private static SingleTon instance=null;
//2.私有的构造方法
private SingleTon(){
}
//3.公有的静态的方法,返回创建后的对象
public static SingleTon getInstance(){
if(instance==null){
instance=new SingleTon();
}
return instance;
}
}
比较两个对象是否相等
SingleTon a=SingleTon.getInstance();
System.out.println(a);
SingleTon b=SingleTon.getInstance();
System.out.println(b);
System.out.println(a.equals(b));
课堂练习
编写一个商品类,包含品名和价格。创建商品对象,判断两个同名商品对象是否相同;判断两个同名同价格商品对象是否相同。
equals ==区别
equals:只能比较引用类型,比较引用类型时,常规的是比较他的引用地址。但是很多类都对equals方法进行重写,重写后比较值相等
==:基本类型和引用类型 比较基本类型时就直接比较值是否相等,比较引用类型时也是比较地址是否相等不能被覆盖
类型转换:
public void test2() {
//基本类型转包装类
Integer i=new Integer(123);
System.out.println(i.toString());
System.out.println("int的最大值"+Integer.MAX_VALUE);
Integer j=new Integer(2147483647+1);
System.out.println("j="+j);
}
@Test
public void test3() {
//包装类转基本类型
Integer a=new Integer(123);
int i_a=a.intValue();
System.out.println(i_a);
}
@Test
public void test10() {
//自动转换 自动拆箱封箱
Integer a=123;
int b=a;
}
@Test
public void test4() {
//包装类转String *.toString()
Integer a=new Integer(123);
String s=a.toString();
System.out.println(s);
}
@Test
public void test5() {
//String转包装类 两种方式
Integer wInt = new Integer("500");//优先掌握
Integer wInt2 = Integer.valueOf("500");
}
@Test
public void test6() {
//String转int
String sInt = "500";
int pInt = Integer.parseInt (sInt);
System.out.println(pInt);
}
课堂练习
1、下列代码的输出是什么?
int a1 = 10;
int a2 = 10;
System.out.println(a1 == a2);
Integer b1 = 10;
Integer b2 = 10;
System.out.println(b1 == b2);
Integer c1 = new Integer(10);
Integer c2 = new Integer(10);
System.out.println(c1 == c2);
2、从控制台得到字符串作为整数,判断该字符串能否转换为数字
@Test
public void test9() {
//从控制台得到字符串作为整数,判断该字符串能否转换为数字
//思路 一位一位的截取 获取每位的char,character.isDigit()
System.out.println("请输入一个整数");
Scanner sc=new Scanner(System.in);
String s=sc.next();
//记录这个数是否为数字的标识
boolean flag=true;
//思路 一位一位的截取 获取每位的char,character.isDigit()
for(int i=0;i<s.length();i++){
//判断当前位的char是否为数字
char c=s.charAt(i);
if(!Character.isDigit(c)){
System.out.println(c);
flag=false;
break;
}
}
if(flag){
System.out.println("全是数字,可以转换");
}else{
System.out.println("不全是数字,不可以转换");
}
}
3、这两种结果相同吗?为什么?
@Test
public void test11() {
Integer a1 = 127;
Integer a2 = 127;
System.out.println(a1 == a2);
Integer b1 = 129;
Integer b2 = 129;
System.out.println(b1 == b2);
}
不同,结果为true/false 因为静态赋值如果值在-128到127之间放到常量池,大于127就new对象存放。
作业
线上学习内部类
String
被final修饰,不可变字符串
String的创建
有两种方式:
1)静态方式(常用)。像是给变量直接赋值一样来使用。如:String s1 = “abc”; String s2 = “abc”;
2)动态方式。动态的内存分配,使用new运算符。如:String s3= new String(“abc”); String s4= new String(“abc”);
3)两种方式创建的字符串区别:
使用静态方式创建的字符串,在方法区的常量池中只会产生唯一一个字符串对象,使用该方式产生同样一个字符串时,内存中不再开辟另外一块空间,而是两个引用变量指向同一个字符串对象。
使用动态方式创建的字符串,在堆内存中会产生出不同的对象。
equals 默认比较引用类型时比较地址 String对它进行了重写,改为比较字面量,也就是字符串的值是否相等。
如: 判断登录用户是普通用户还是管理员
@Test
public void test3() {
while (true) {
System.out.println("请输入用户名:");
Scanner sc = new Scanner(System.in);
String username = sc.next();
// 判断用户名是不是root/admin
if (username.equals("admin") || username.equals("root")) {
// 如果是,就认为他是管理员,否则是普通用户
System.out.println("欢迎管理员登录");
} else {// 否则是普通用户
System.out.println("请充值后再登录。");
}
}
}
课堂练习
@Test
public void test4(){
System.out.println(5+6+'A');//76
System.out.println(5+6+"A");//11A
System.out.println(5+"A"+6);//5A6
}
@Test
public void test5(){
System.out.println(5+6+'A');
System.out.println(5+6+"A"+6+5);
System.out.println(5+"A"+6+5);
}
常用方法
1.equals
2.equalsIgnoreCase
@Test
public void test5() {
while (true) {
System.out.println("请输入用户名:");
Scanner sc = new Scanner(System.in);
String username = sc.next();
// 判断用户名是不是root/admin
if (username.equalsIgnoreCase("admin") || username.equalsIgnoreCase("root")) {
// 如果是,就认为他是管理员,否则是普通用户
System.out.println("欢迎管理员登录");
} else {// 否则是普通用户
System.out.println("请充值后再登录。");
}
}
}
3.substring(int begin) 字符串截取
返回一个新字符串,该字符串是从begin开始的字符串的内容
@Test
public void test6() {
String a="abcenglish";
String sub_a=a.substring(3); //english
System.out.println(sub_a);
}
返回一个新字符串,该字符串是从begin开始到end-1结束的字符串的内容
@Test
public void test7() {
String a="abcenglishefg";
String sub_a=a.substring(3,10); //索引3-->9
String sub_b=a.substring(3,a.length()-3);
System.out.println(sub_a);//english
System.out.println(sub_b);//english
}
indexOf/lastIndexOf
indexOf和lastIndexOf也接受字符串类型
@Test
public void test8() {
//indexOf 判断子串在字符串中第一次出现的索引。如果不存在,就返回-1
String a="abcenglisheafg";
int loc=a.indexOf('a');
System.out.println(loc);
//lastIndexOf判断子串在字符串中最后一次出现的索引。如果不存在,就返回-1
int last_loc=a.lastIndexOf('a');
System.out.println(last_loc);
}
课堂练习
从控制台输入一个邮箱地址,并用程序判断,邮箱地址里面是不是只有一个@
@Test
public void test9() {
//indexOf 判断子串在字符串中第一次出现的索引。如果不存在,就返回-1
System.out.println("请输入邮箱:");
Scanner sc = new Scanner(System.in);
String email = sc.next();
int loc=email.indexOf("wangqj");
System.out.println(loc);
}
trim 去掉首尾空格
@Test
public void test10() {
String a=" abcenglisheafg ";
System.out.println(a.trim());
}
replace替换
@Test
public void test11() {
String a=" abcenglisheafg ";
System.out.println(a.replaceAll(" ", ""));
System.out.println(a.replaceAll("abc", "123"));
System.out.println(a.replaceAll("e", "f"));
}
split分隔
@Test
public void test12() {
String a="李海峰#男;王均仪#女;王晓宇#男";
String[] names=a.split(";");
for(int i=0;i<names.length;i++){
System.out.println(names[i]);
String[] info=names[i].split("#");
System.out.println(info[0]);
System.out.println(info[1]);
}
}
编码方式比较
@Test
public void test13() {
String a="中";
try {
byte[] byte_a=a.getBytes("utf-8");
System.out.println(byte_a.length);//3byte
String s_a=new String(byte_a,"utf-8");
System.out.println(s_a);
byte[] byte_gbk=a.getBytes("gbk");
System.out.println(byte_gbk.length);//2byte
byte[] byte_iso8859_1=a.getBytes("ISO8859-1");//1byte
System.out.println(byte_iso8859_1.length);
String s_8859=new String(byte_iso8859_1,"ISO8859-1");//乱码 因为ISO8859-1不包括汉字
System.out.println(s_8859);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
课堂练习
三位数数字转化字符串补零,如:数字1转化后为“001”
StringBuffer
可变字符串
追加方法append
@Test
public void test(){
//Stringbuffer可变字符串
//经常用他来拼接sql语句
//假设用户从控制台输入用户名和密码,根据用户名和密码去t_user表里查询用户信息
//select * from t_user where username=? and password=?
System.out.println("请输入用户名");
Scanner sc=new Scanner(System.in);
String name=sc.next();
System.out.println("请输入密码");
String password=sc.next();
StringBuffer sql=new StringBuffer("select * from t_user where username is not null ");
if(name!=null){
sql.append(" and username="+name);//append 是追加
}
if(password!=null){
sql.append(" and password="+password);//append 是追加
}
System.out.println(sql.toString());
}
反转方法
@Test
public void test1(){
StringBuffer sql=new StringBuffer("中华人民共和国");
System.out.println(sql.reverse());
}
练习:输入一个手机号码,将中间四位使用星号替代。
@Test
public void test2(){
StringBuffer phone=new StringBuffer("13904001139");
StringBuffer new_phone=phone.replace(3, 7, "****");
System.out.println(new_phone);
}
重点掌握
String StringBuffer和StringBuilder区别
https://www.cnblogs.com/AmyZheng/p/9415064.html
** Math类 **
常量PI E
方法:大多与mysql类似
sqrt:开方
public static void main(String[] args) {
//Math方法 x即为[20,30]的整数。
int x = (int)(20+Math.random()*11);
//Random方法 y即为[20-30]的整数
Random r = new Random();
int y = 20 + (r.nextInt(11));
}
Math.random
假设取【m,n】m<n;的随机整数 则
Math.random的规律是:
(int)(m+Math.random()*(n-m+1));
Random类的规律是:
m+(new.Random()).nextInt(n-m+1);
课堂练习
海伦公式,从键盘输入三个整数作为三角形的三边,使用海伦公式求出该三角形的面积。
@Test
public void test3(){
//从键盘输入三个整数作为三角形的三边,使用海伦公式求出该三角形的面积。
System.out.println("请输入三边");
int a=new Scanner(System.in).nextInt();
int b=new Scanner(System.in).nextInt();
int c=new Scanner(System.in).nextInt();
double p=(a+b+c)/2.0;
double s=Math.sqrt(p*(p-a)*(p-b)*(p-c));
System.out.println(s);
}
日期类
@Test
public void test1() {
Date d=new Date();
System.out.println(d.getMonth());
System.out.println(d.getDay());
}
//SUN MON TUE WED THU FRI SAT
// 1 2 3 4 5 6 7
@Test
public void test2(){
Calendar c = Calendar.getInstance();
//Date now=c.getTime();
//System.out.println(now);
System.out.println("年:"+c.get(c.YEAR));
System.out.println("月:"+c.get(c.MONTH));
//需要加1
System.out.println("日:"+c.get(c.DAY_OF_MONTH));
System.out.println("时:"+c.get(c.HOUR_OF_DAY));
System.out.println("分:"+c.get(c.MINUTE));
System.out.println("秒:"+c.get(c.SECOND));
//1~7来表示:星期天,星期一,星期二,星期三,星期四,星期五,星期六
System.out.println("星期:"+c.get(c.DAY_OF_WEEK));
}
@Test
public void test3(){
//首先定义一下日期格式 HH24小时制 hh 12小时制
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_d=sdf.format(new Date());
System.out.println(str_d);
//字符串转成日期
try {
Date d=sdf.parse(str_d);
System.out.println(d);
} catch (ParseException e) {
System.out.println("出错了");
}
}
@Test
public void test4(){
Calendar c = Calendar.getInstance();
c.set(2018, 10, 10);
System.out.println(c.get(c.YEAR));
System.out.println(c.get(c.MONTH));
}
//编写一个方法,找到两个日期格式的字符串的最大值
@Test
public void test5() throws ParseException{
System.out.println("请输入两个日期格式的字符串");
String d1=new Scanner(System.in).next();
String d2=new Scanner(System.in).next();
System.out.println(DateTest.max(d1, d2).toString());
}
public static Date max(String date1,String date2) throws ParseException{
//date1>date2 输出 date1
//date1<date2 输出date2
//假设格式为yyyy-MM-dd
//第一步,把两个字符串都转成日期格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date d1=sdf.parse(date1);
Date d2=sdf.parse(date2);
if(d1.before(d2)){
return d2;
}
return d1;
}
@Test
public void test6() throws ParseException{
Calendar c = Calendar.getInstance();
c.add(c.DATE, 15);
System.out.println(c.getTime());
}
加上指定天数后的日期
实战演练
输入日期格式字符串作为商品的生产日期,输入保质期(天);计算截止到今天,该商品还有多少天会过保质期
1、控制台输入字符串转为日期格式
2、将输入日期增加保质期天数
3、取得当前系统日期,比较两个日期,如果过期输出“该商品已经过期”
@Test
public void test7() throws ParseException{
System.out.println("请输入生产日期和过期时间");
//得到生产日期
String date_str=new Scanner(System.in).next();
//得到过期时间
int days=new Scanner(System.in).nextInt();
//指定日期转换格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//把用户输入的字符串转成日期型
Date d1=sdf.parse(date_str);
Calendar c = Calendar.getInstance();
c.setTime(d1);
//加上n天
c.add(c.DATE, days);
//过期日期
Date d_guo=c.getTime();
//打印过期日期
System.out.println("过期日期为:"+d_guo);
//获取当前日期
Date now=sdf.parse(sdf.format(new Date()));
System.out.println("当前日期为:"+now);
//比较两个日期先后,得到结果
if(now.before(d_guo)){
System.out.println("已过期");
}else{
System.out.println("未过期");
}
}
请编写一个方法,计算两个日期相差的天数
改写上面的程序
public static long days(String begin,String end) throws ParseException{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date d1=sdf.parse(begin);
Date d2=sdf.parse(end);
long begintime=d1.getTime();
System.out.println("毫秒数:"+begintime);
long endtime=d2.getTime();
//毫秒数换数成天 1天=24小时 1小时=60分 1分=60秒 1秒=1000毫秒
long day=(endtime-begintime)/24/60/60/1000;
System.out.println(day);
return day;
}
@Test
public void test8() throws ParseException{
System.out.println("请输入生产日期和过期时间");
//得到生产日期
String date_str=new Scanner(System.in).next();
//得到过期时间
int days=new Scanner(System.in).nextInt();
//算当前日期与生产日期之间相差的天数
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String now=sdf.format(new Date());
System.out.println(now);
//相差的天数
int dis_days=(int)DateTest.days(date_str, now);
if(dis_days>days){
System.out.println("已过期");
}else{
System.out.println("没过期");
}
}
作业
课后作业1,2,3
选做题3
@Test
public void test06() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入字符串");
String a = sc.next();
System.out.println("请输入子字符串");
String b = sc.next();
//System.out.println(a.indexOf(b));
/* 请输入字符串
abcenglishgagagaenglish
请输入子字符串
english
3*/
int index=0;
int count=0;
int j=0;
do{
//从index索引处开始,a中b第一次出现的位置
j=a.indexOf(b, index);
if(j!=-1){
count++;
index=j+b.length();
}
}
while(index<a.length());
System.out.println("count---->"+count);
}