java 第十五次作业

目录

一、包装类

1. 什么是包装类

2. 基本数据类型对应的包装类

 二、日期相关类

sql.Date

SimpleDateFormat

Calendar

 DateTimeFormatter 自定义格式

三、Math类

四、Random类

1. 自行在API文档中初步了解Random类

2. 不管是无参数构造Random,还是Math类的random方法,最后底层都是到Random类的有参构造中。

五、String类

1. String类的本质

2. String的常用方法

String内存分析

 StringBuilder类

StringBuffer、StringBuilder、 String 之间的关系

1. StringBuffer、StringBuilder、String 互相转换

例5.40 创建StringBuffer对象、StringBuilder对象、 String 对象,并将三者的内容互相转换。

总结

一、包装类
1. 什么是包装类
以前定义变量,经常使用基本数据类型,对于基本数据类型,它就是一个数。加点属性,加点方法,加点构造器,对基本数据类型对应进行了封装产生了一个新的类,这种类叫包装类(改造基本数据类型的的类)。

int, byte...-->基本数据类型

包装类 -->引用数据类型

2. 基本数据类型对应的包装类


包装类特有机制,拆箱装箱(底层使用了方法完成,velueOf() 和 intValue() )可以自行断点查看

 

常用方法可以在idea点进方法查看底层

1.comperTo() 在数字上比较两个Integer对象。

Integer i = 2;
Integer i1 = 3;
Integer i2 = 3;
System.out.println(i.compareTo(i1));//-1
System.out.println(i1.compareTo(i));//1
System.out.println(i1.compareTo(i2));//0


2.equals()将对象和指定对象进行比较

Integer i3 = new Integer(13);//通过new创建
Integer i4 = new Integer(13);
System.out.println(i3.equals(i4));//ture,equals被重写
System.out.println(i3 == i4);//false
 
Integer i5 = 1;//通过自动装箱创建
Integer i6 = 2;
System.out.println(6.equals(i5));//ture,equals被重写
System.out.println(i6 == i5);//ture,当自动装箱的值在-128~127之间自动装箱返回的是数,否则是地址
 



 二、日期相关类

sql.Date
Date d = new Date(1592055964263L);
System.out.println(d);
/*
1. 区别
    java.util.Date:年月日 时分秒
    java.sql.Date:年月日
2. 联系
    sql.Date 继承自 util.Date
3. 转换
 */
//util-->sql
java.util.Date d1 = new Date(1592055964263L);
Date d11 = (Date) d1;//方式一,强制转换 util-->sql
Date d12 = new Date(d1.getTime());//借助构造器
//sql-->util
d1 = d;//父类指向子类
//String --> sql.Date
Date d13 = Date.valueOf("2017-7-3");


SimpleDateFormat
从前台过来的日期数据一般都是有格式的String,需要转换成util.Date类型

String-->sql.Date

sql.Date-->util.Date

局限性:日期必须是规定格式!

引入新类DateFormat

java.sql.Date sdate = java.sql.Date.valueOf("2017-7-7");//String-->sql.Date,字符转只能是YYYY-MM-DD格式
Date ud = sdate;//sql.Date-->util.Date
//局限性:日期必须是规定格式!
 
 
//日期转换
//public class SimpleDateFormat(子类) extends DateFormat(父类)
DateFormat df = new SimpleDateFormat("yyyy MM dd");//转化标准已经定好(对标前台)
//String ---> Date
try {//需要try/catch才能使用
    Date d = df.parse("2017 03 07");//parse,根据给定字符串和格式生成日期
    System.out.println(d.toLocaleString());
} catch (ParseException e) {
    e.printStackTrace();
}
 
 
//Date ---> String
String format = df.format(new Date());//根据日期给出格式
System.out.println(format);


Calendar
Calendar是一个抽象类,不能直接创建对象,使用子类实现

可以使用静态方法Calendar.getInstance()创建。

常用方法:get(),set()

给出一个日期,打印出那一月正确的日历,且在给定日期标星号

package com.xiaowei9s.commonuse.dateclass;
 
import java.sql.Date;
import java.util.Calendar;
import java.util.Scanner;
 
public class Demo05 {
    public static void main(String[] args) {
 
        //获取日期
        System.out.println("请输入你想要查看的日期(提示:格式为1990-2-5):");
        Scanner sc = new Scanner(System.in);
        String strDate = sc.next();
        Date date = Date.valueOf(strDate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
 
        //打印信息
        int nowday = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println("日\t一\t二\t三\t四\t五\t六");
        for (int i = 0; i < cal.get(Calendar.DAY_OF_MONTH); i++) {//对齐一号是星期几
            System.out.print("\t");
        }
 
        for (int i = 1; i <= cal.getActualMaximum(Calendar.DATE); i++) {//遍历该月
            String day = i+"";
            if(i<=9){               //为了对齐一位数两位数
                day = i+" ";
            }
            if (i==nowday){ //在指定日期打星号
                day = i+"";
                System.out.print(day+"*"+"\t");
                continue;
            }
            cal.set(Calendar.DATE,i);
            if (cal.get(Calendar.DAY_OF_WEEK)==7){  //在换行时换行
                System.out.println(day+"\t");
                continue;
            }
            System.out.print(day+"\t");             //正常日期
        }
 
    }
}


 DateTimeFormatter 自定义格式
用于转换LocalDateTime等与String转换的定义和规范.

 

方式一:

//方式一:预定义的标准格式

DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;//df可以帮助转换String和LocalDateTime
LocalDateTime localDateTime = LocalDateTime.now();
String str = df1.format(localDateTime);
System.out.println(str);
 
TemporalAccessor parse = df1.parse("2021-09-04T11:25:23.5");
System.out.println(parse);


方式二

//方式三:自定义格式
DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy MM dd");//df可以帮助转换String和LocalDateTime
String str2 = df3.format(localDateTime);
System.out.println(str2);
TemporalAccessor parse2 = df3.parse("2021 09 04");
System.out.println(parse2);


三、Math类
常用方法
 

System.out.println("随机数:"+Math.random());
System.out.println("绝对值:"+Math.abs(-5.6));
System.out.println("进一:"+Math.ceil(9.1));
System.out.println("舍一:"+Math.floor(9.9));
System.out.println("四舍五入:"+Math.round(9.9));
System.out.println("取最大:"+Math.max(3,9));
System.out.println("取最小:"+Math.min(9,28));

四、Random类
1. 自行在API文档中初步了解Random类
2. 不管是无参数构造Random,还是Math类的random方法,最后底层都是到Random类的有参构造中。

package com.xiaowei9s.commonuse.mathclass;import java.util.Random;public class Demo02 {
    public static void main(String[] args) {
        System.out.println("Math随机数:"+Math.random());//math中生成随机数:底层还是用了Random类        
        //Random类学习        
        //带参数构造的Random        
        Random random = new Random(1858858L);//只要种子固定,则每次启动都会是同一个随机数开始,只有next后才是不同的随机数,并且几次都是一样        
        //解决办法:给出每次都不一样的种子        
        Random random1 = new Random(System.currentTimeMillis());        
        System.out.println(random.nextInt());        
        System.out.println(random1.nextInt());        //空参数构造的Random:表面无参,实际底层还是调用带参        
        Random random2 = new Random();        
        System.out.println(random2.nextInt(10));        
        System.out.println(random2.nextDouble());       
        System.out.println(random2.nextFloat());    
    }
}


五、String类
1. String类的本质
将字符串起来,就是字符串,是不可变类
所有的字符串都是一个实例化出来的对象,例如"abc","你好世界","helloworld"等。
字符串内容不可变,类比LocalDateTime类的不可变性。
String底层是一个char类型的数组
2. String的常用方法
1.String()空参构造器,给出一个空的value。

2.String(String original),将original的value和hash给到正构造的String对象。

3.String(char value[]),将value数组中的值复制到正构造的String对象的属性value中。

4.length(),字符串底层数组长度。

5.isEmpty(),字符串底层数组是否为空。

6.charAt(int index),字符串中底层数组相对应下标的对应值。

7.equals(Object object),比较两个字符串是否值相等,已被重写。

 8.

 9.compareTo(String anotherString),对比两个字符串,实现了一个Comparable接口,需要重写compareTo方法,已被重写

 

String内存分析
String在常量池中放置了一个变量,如果后续有结果相同的变量那就不会在增加一个变量,比如String s = "abc";后续如果再来了一个String s1 = "ab"+"c",常量池中也只会有一个"abc",不会有两个。但是注意使用String(String original)构造的String对象则不同。

 StringBuilder类
可变字符串类有:StringBuilder类,StringBuffer类

不可变字符串类:String类

StringBuilder sb = new StringBuilder();//表面是空的构造器,底层对value数组初始化长度为16
StringBuilder sb1 = new StringBuilder(3);//底层对value数组初始化长度为3
StringBuilder sb2 = new StringBuilder("abc");//底层对value数组初始化长度为3
sb2.append("aaa").append("bbbbbb").append("ccccccccc").append("ddddddddddddd");//链式调用  return this


StringBuffer、StringBuilder、 String 之间的关系
1. StringBuffer、StringBuilder、String 互相转换
StringBuffer类和 StringBuilder类都有toString()方法,可以返回字符序列的字符串表示形式。这两个类在初始化的时候,可以通过字符串作为参数,指定初始化的字符序列内容

例5.40 创建StringBuffer对象、StringBuilder对象、 String 对象,并将三者的内容互相转换。

public class StringInterchange40 {//创建主类
    public static void main(String[] args) {//主方法
        // TODO Auto-generated method stub
        String str = "String";
        StringBuffer sbf = new StringBuffer(str);  //String转换StringBuffer
        StringBuilder sbd = new StringBuilder(str);  //String转换StringBuilder
        str = sbf.toString();  //StringBuffer转换String
        str = sbd.toString();  //StringBuilder转换String
        StringBuilder bufferToBuilder = new StringBuilder(sbf.toString());  //StringBuffer转换StringBuilder
        StringBuffer BuilderToBuffer = new StringBuffer(sbd.toString());  //StringBuilder转换StringBuffer
    }
 
}


2. StringBuffer、StringBuilder、String的不同之处

String只能赋值一次,每一次内容发生改变都生成了一个新的对象,然后原有的对象引用新的对象,所以说 String 本身是不可改变。每一次改变 String 的字符串内容,都会在内存创建新的对象,而每一次生成新对象都会对系统性能产生影响。  

而StringBuffer和StringBuilder不同,每次操作都是对自身对象做操作,而不是生成新的对像,其所占空间会随着字符内容增加而扩充,做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。

StringBuffer 和 StringBuilder 也存在不同之处。StringBuffer的方法都使用"synchronized”关键字进行修饰,这样保证了同时最多只有一个线程可以运行这些方法,也就是保证了线程安全。 StringBuilder则不具备这样的特点。反过来说,正因为StringBuilder 没有线程安全机制,运行起来就不用考虑给线程加锁,所以运行效率会比 StringBuffer 要高。

总结
String的特点:
字符串是由多个字符组成的一串数据
字符串是常量,一旦被创建就不能改变,这是因为字符串的值是存放在方法区的常量池里面,但是引用可以改变。
在Object类里边equals方法和“==”是相同的,都是用来判断两个对象的地址是否相等,即两个对象是否是同一个对象。
总结来说:
  (1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
    如果作用于引用类型的变量,则比较的是所指向的对象的地址
  (2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。
效率从高到低排列:StringBuilder > StringBuffer > String
String 类型和 StringBuffer 的主要性能区别:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String
如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值