小王学习java打卡8day 字符串类(跟着源代码学习

字符串类(跟着源代码学习)

  1. String 的深入学习(构造器—> 学习常用方法 ------->)

    • 构造器
    //无参构造器
     public String() {
         this.value = new char[0];
     }	
    
    //string类型的构造器
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }
    //char类型构造器
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }
    
    
    • ​ 成员变量
  2. //string底层 还是char数组
    private final char value[];
    
    private int hash; // Default to 0
    
    
  3. 方法

    //length方法  返回此字符串的长度。长度等于字符串中Unicode 代码单元的数量。
    public int length() {
        return value.length;
    }
    //这个对象(它已经是一个字符串!)本身被返回。返回值:字符串本身。
    public String toString() {
        return this;
    }
    //判断是否为空
    public boolean isEmpty() {
        return value.length == 0;
    }
    //从 dstBegin 开始将此字符串中的字符复制到 dst。此方法不执行任何范围检查。
    void getChars(char dst[], int dstBegin) {
        System.arraycopy(value, 0, dst, dstBegin, value.length);
    }
    //使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。
    public byte[] getBytes() {
        return StringCoding.encode(value, 0, value.length);
    }
    
    //测试此字符串是否以指定的前缀开头
    public boolean startsWith(String prefix) {
        return startsWith(prefix, 0);
    }    public boolean contains(CharSequence s) {
            return indexOf(s.toString()) > -1;
        }
    
    //测试此字符串是否以指定的后缀结尾。
    public boolean endsWith(String suffix) {
        return startsWith(suffix, value.length - suffix.value.length);
    }
    
    //当且仅当此字符串包含指定的 char 值序列时才返回 true
    public boolean contains(CharSequence s) {
        return indexOf(s.toString()) > -1;
    }
    //围绕给定正则表达式的匹配拆分此字符串,返回数组
    public String[] split(String regex, int limit) {
    }
    

需求:练习String str = “ 我爱学-Java ”

  • ​ 判断字符串是否为空字符串

  • 通过 - 将字符串分隔开

  • 去除字符串里面的空格

  • 判断字符串是否包含java

StringBuilder

  1. StringBuilder 也是final修饰的,char[]数组不是final修饰的,所以是可变的

  2. 默认不传参,初始 8 个字节

  3. @Override //常用
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
    

需求:拼接十万次"-"

string需要5631ms,stringbuilder需要7毫秒

/*
需求:拼接十万次"-"
* */
public class StringBuilderDemo2 {
    public static void main(String[] args) {
        long beginTime = System.currentTimeMillis();
//        String str = "-";
//        for (int i = 0; i < 100000; i++) {
//            str += "-";
//        }
//        System.out.println(str);
        StringBuilder sb = new StringBuilder("-");
        for (int i = 0; i < 100000; i++) {
            sb.append("-");
        }
        System.out.println(sb);
        long endTime = System.currentTimeMillis();
        System.out.println(endTime-beginTime);  //5631    //7
    }
}

StringBuilder 和 StringBuffer 的区别

  1. StringBuffer 是线程安全的,适合在多线程环境中使用

  2. StringBuilder 是非线程安全的

    选择情况

    多线程环境优选StringBuffer,单线程使用StringBuilder

基本类型的包装类型

  1. 问题
    • 一切皆对象? int age = 18;
    • 给一个 9999转换成二进制,太麻烦
    • double 类型,默认值是0.0 ,如果是考试缺考需要0分,怎么表示?
  2. 基本数据类型,缺少对象。包装类型
  3. number 类里面定义了求基本类型值的 方法

Integer(int)

  1. 常用方法
Integer.valueOf(5);
        int i1 = new Integer(6).intValue();
        
  1. 自动拆箱和装箱
int a = 10;
Integer integer = Integer.valueOf(a);  //装箱
System.out.println(integer);

//自动装箱
Integer i = 10;
Integer integer1 = Integer.valueOf(10);  //把int类10,转化成Integer对象

//自动拆箱
 Integer integer2 = new Integer(3);
int i1 = integer2;

//实际上 底层调用了 intValue() 方法。 int i2 = integer2.intValue(); 把Integer类型的integer2转变成int类型的i2
  1. 整数类型有一个常量池
缓存值
[-128,127]

String int Integer 之间的相互转换

String str = "99";
Integer integer = Integer.valueOf(str);  //String 转 Integer
int i = integer;   //Integer 转 int
String s = i + "33";  //int 转 String

注意:int 和 Integer 不是一个数据类型(里面存在自动拆箱和装箱),int 是在栈里,Integer是在堆里面的。

建议:实际开发中建议使用Integer

日期处理

  1. 获取当前系统的时间 new Date() (底层实现:System.currentTimeMillis())

    //打印符合中国人习惯的时间格式
    @Deprecated
    public String toLocaleString() {
        DateFormat formatter = DateFormat.getDateTimeInstance();
        return formatter.format(this);
    }
    //2022-5-9 10:42:25
    
  2. 格式化操作 SimpleDateFormat

  • yyyy-MM-dd HH:mm:ss			
    

    层次结构:

    image-20220509105947333
  1. 常用方法:

    • //把日期变成字符串
      public final String format(Date date){}
      
      //把字符串变成日期
      public Date parse(String source){}
          
             
      

Calender 日历类

  1. 获取当前日历对象

    • Calendar instance = Calendar.getInstance();
      
  2. 获取当前的时间

    Date time = instance.getTime();
    
public class CalenderDemo {
    public static void main(String[] args) {
        Calendar instance = Calendar.getInstance();
        Date time = instance.getTime();
        System.out.println(time.toLocaleString());
        System.out.println(instance);

        int year = instance.get(Calendar.YEAR);
        System.out.println(year);

        int month = instance.get(Calendar.MONTH) + 1;
        System.out.println(month);

        int date = instance.get(Calendar.DATE);
        System.out.println(date);
    }
}

工具类的设计

  1. 日期工具类的设计
    • 需求:录入五个员工,建立一个员工类 Employee 名字,年龄,entry入职时间,birthday生日,EmployeeManger input(Employee e) , 员工数组
public class DateTool {
    public static final String PATTERN = "yyyy-MM-dd";
    /**
     * 将字符串日期转化成日期格式
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date getDateByString(String date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat(PATTERN);
        Date ret = format.parse(date);
        return ret;
    }
    /**
     * 将日期格式转成字符串格式
     * @param date
     * @return
     * @throws ParseException
     */
    public static String getStringByDate(Date date) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat(PATTERN);
        String ret = format.format(date);
        return ret;
    }
}

//测试
ate dateByString = DateTool.getDateByString("2014-02-09");
System.out.println(dateByString.toLocaleString());//2014-2-9 0:00:00
String string = DateTool.getStringByDate(dateByString);
System.out.println(string);//2014-02-09
    //重写数组的toString方法
public static String toString(Object[] arr) {
    if (arr == null) {
        return "null";
    }
    int iMax = arr.length - 1;
    if (iMax == -1) {
        return "[]";
    }
    StringBuilder sb = new StringBuilder("[");
    for (int i = 0; i < arr.length; i++) {
        if (i == iMax) {
            sb.append(String.valueOf(arr[i])).append("]");
        } else {
            sb.append(arr[i]).append(",");
        }
    }
    String s = sb.toString();
    return s;
}
}

单例设计模式(只能有一个对象存在)

​ 设计模式:把一些反复使用的,或多数人使用的常用方法,封装成一个设计模式,供其他人使用

//单利规范 代码

public class ArraysTool {
    //使之不能被创建对象
    private ArraysTool(){}
//在本类中创建对象
public static final ArraysTool instance = new ArraysTool();

    public void sort(int[] arr){
        System.out.println("排序操作");
    }

    public static ArraysTool getInstance(){
        return instance;
    }
}

//测试类
public class ArraysTest {
    public static void main(String[] args) {
//        ArraysTool arraysTool = new ArraysTool();  无法创建对象
        int[] arr = {2,5,66,32,15,4,11};
        ArraysTool.getInstance().sort(arr);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值