Java学习之路之week4day4

向Java程序员的目标前进!

day18

常用类—续

String类—续

String类的转换功能

public char[] toCharArray():将字符串转换为字符数组
public byte[] getBytes():将字符串转换成字节数组(使用平台默认字符集编码)
public byte[] getBytes(String charSet):将字符串转换成字节数组(使用指定字符集编码)
String(byte[] bytes):使用平台默认字符集解码(String的构造方法)
public String toLowerCase():将字符串转换成小写
public String toUpperCase():将字符串转换成大写
public static String valueOf(int/double/float/char[]/Object i):万能方法:将任何数据类型转换成String
    
拓展:Arrays工具类:可以将任何数组转换成String
public static String toString(int[]/byte[]/double[]/float[]/Object[]等类型)
  1. 平台默认字符集是UTF-8,也就意味着一个中文字符对应着三个字节编码。而GBK用一个中文字符对应两个字节编码。

  2. 解码就是将看不懂的字节数组转换成能看懂的String,而编码则与之相反。在进行操作时,解码和编码的字符集必须统一。

  3. 计算机底层存储中文时,会将中文字符转换成二进制数,使用字节来表示。其中,第一个字节永远是负数。

String类的其它功能

public String replace(char oldChar,char newChar):将指定的字符使用新字符进行替换
public String replace(String oldStr,String newStr):替换指定字符串
public String trim():去除两端空格

String类的比较功能

public int compareTo(String anotherString):将两个字符串按照字典顺序进行比较

String类的比较功能的源码分析

public int compareTo(String anotherString) {
    // 获取第一个String的长度
    int len1 = value.length;
    // 获取第二个String的长度
    int len2 = anotherString.value.length;
    // 获取两个长度中较短的那个,作为限制
    int lim = Math.min(len1, len2);
    // 分别获取两个String的字符数组形式
    char v1[] = value;
    char v2[] = anotherString.value;
	// 定义统计变量k=0
    int k = 0;
    // k循环至lim时结束
    while (k < lim) {
        // 分别获取两个String中相同位置的字符值
        char c1 = v1[k];
        char c2 = v2[k];
        // 如果c1的ASCII值和c2的ASCII值不相等,则将c1和c2的值相减并返回
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    // 最终底层将两个字符串的字符数组长度相减并返回
    return len1 - len2;
}

String类的练习

/**
 * 练习1:给定一个字符串,进行遍历输出
 */
public class StringTest {
    public static void main(String[] args) {
        //创建一个字符串
        String str = "helloJava" ;
        //最原始的做法
        System.out.println(str.charAt(0));
        System.out.println(str.charAt(1));
        System.out.println(str.charAt(2));
        System.out.println(str.charAt(3));
        System.out.println(str.charAt(4));
        System.out.println(str.charAt(5));
        System.out.println(str.charAt(6));
        System.out.println(str.charAt(7));
        System.out.println(str.charAt(8));

        System.out.println("-------------------------------------------") ;
        
        //str指定的字符串对象 charAt指定的方法,变化的是里面的角标
        //上面代码重复读高  charAt(int index)+length()获取长度结合使用
        for(int i = 0 ; i < str.length() ; i++){
            System.out.print(str.charAt(i)+"\t");
        }
        System.out.println();
        
        System.out.println("-----------------------------------------------") ;

        //方式2:转换功能 toCharArray()---->char[],遍历字符数组
        char[] chs = str.toCharArray();
        for (int i = 0; i <chs.length ; i++) {
            //每一个字符
            char ch = chs[i] ;
            System.out.print(ch+"\t");
        }
    }
}

/**
 * 练习2:键盘录入一个字符串数据,按指定的格式输出
 * 举例:输入“XiaoChenwholovecs”,输出“xIAOCHENWHOLOVECS”。
 */

/**
 * 分析:
 * 1)创建键盘录入数据
 * 2)将指定的字符串的第一个字符截取出来 subString(0,1)
 * 3)将2)的结果转换成小写 toLowerCase()
 * 4)将第一个字符后面的所有数据截取出来subString(1),默认截取到末尾
 * 5)将4)的结果转换成大写
 * 6)然3)和5)的结果拼接成一个新的字符串
 */
public class StringTest2 {
    public static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in) ;

        //提示并录入
        System.out.println("请您输入字符串数据:");
        String line = sc.nextLine() ;
        String result = getString(line);

        System.out.println(result);
    }

    public static String getString(String line) {
        //将核心代码选中:alt+alt+m:抽取一个method方法

       /* String s1 = line.substring(0, 1);//截取第一个字符
        //将s1转换成小写
        String s2 = s1.toLowerCase();

        //在将从1开始后面的字符序列截取出来
        String s3 = line.substring(1);//从1默认截取到末尾
        //将s3转换成大写
        String s4 = s3.toUpperCase();
        //然后s2和s4拼接
        return s2.concat(s4);*/

        //链式编程
        String reuslt = line.substring(0,1).toLowerCase().concat(line.substring(1).toUpperCase()) ;
        return reuslt ;
    }
}

StringBuffer类

如果用之前介绍的方式对String进行拼接操作,每次拼接后JVM就会构建一个新的String对象,这样的方式浪费了计算机的资源。StringBuffer的出现就解决了这样的问题。

综上所述,StringBuffer是一个线程安全的可变字符序列,本质是一个字符串缓冲区。

面试题:StringBuffer和StringBuilder的异同点

A:共同点:两者都是具有相互兼容的API(StringBuffer能用的String也可以)

不同点:StringBuffer是一个线程安全的类(是一个同步操作的类,执行效率低)StringBuilder是一个线程不安全的类(是一个不同步操作的类,执行效率高)

举例:StringBuffer——银行网站、医疗网站等等

​ StringBuilder——论坛网站等等

所以单线程环境下都会使用StringBuilder去替换StringBuffer,因为执行效率高。

StringBuffer的构造方法

StringBuffer():空参构造

StringBuffer(String str):有参构造

int length():获取字符串缓冲区的长度(缓冲区中实际的字符序列的长度)

public int capacity():获取缓冲区的容量大小,英文字符默认是16个初始长度。

StringBuffer(int capacity):指定缓冲区的容量大小

一般情况下,空参构造和有参构造较为常用。

StringBuffer的成员方法

添加功能
public StringBuffer append(任何类型数据):在缓冲区中的默认的字符序列后面依次追加,返回值是字符串缓冲区本身。
public StringBuffer insert(int offset/char c/String str):在指定的位置插入指定的字符或者字符串,返回值是字符串缓冲区本身。

通常append方法更为常用。

删除功能
public StringBuffer deleteCharAt(int index):删除指定索引处的字符,返回字符串缓冲区本身
public StringBuffer delete(int start,int end):删除从执行位置从指定位置的字符序列开始,到end-1处结束,返回字符串缓冲区本身。
反转功能
public StringBuffer reverse():返回字符串缓冲区本身
截取功能

StringBuffer的截取功能和String一样

String subString(int beginIndex):从指定位置默认截取到末尾,完成后返回新的字符串
String subString(int beginIndex,int endIndex):从指定开始
截取到指定位置(endIndex-1处)结束,完成后返回的新的字符串

StringBuffer和String的类型转换

String转StringBuffer
String s = "hello" ;
//方式1:无参构造方法+append()追加
StringBuffer sb = new StringBuffer() ;
sb.append(s) ;
System.out.println("sb:"+sb);
System.out.println("--------------------------------------") ;
//方式2:有参构造直接StringBuffer(String s)
StringBuffer sb = new StringBuffer(s) ;
System.out.println("sb:"+sb) ;
StringBuffer转String
//StringBuffer----String
StringBuffer buffer = new StringBuffer("XiaoChen") ;
//方式1:public String(StringBuffer buffer)
String str = new String(buffer) ;
System.out.println("str:"+str);
System.out.println("--------------------------------------") ;
//方式2:public String toString();
String result = buffer.toString();
System.out.println("result:"+result) ;

面试题:String和StringBuffer的区别

A:String是一个特殊的引用类型,形参的改变不会实际参数,效果和基本类型一致!而且String是常量,一旦被赋值后值就不能被更改!

StringBuffer:是线程安全的一个类,它支持可变的字符序列。

引用类型除String外,在使用时形参改变会直接影响实际参数!

Integer类

包装类类型是什么?

包装类类型就是将基本数据类型与一些方法进行“封装”,方便我们使用而定义的类型。常用的基本数据类型和包装类类型如下表所示。

基本数据类型包装类类型
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
charCharacter
booleanBoolean

Integer类的定义

Integer类将基本数据类型int封装成了对象,让我们可以在对象中定义更多的功能方法操作该数据。

Integer类提供了多种方法,能使int类型与String类型互相转换。当然,它还提供了更多处理int类型的常量和方法。

Integer类的相关方法

构造方法
public Integer(int value):将基本类型数据int转换为Integer
public Integer(String s) throw NumberFormatExceptionInteger的静态转int类型功能。这里的形式参数必须为“数字字符串”,否则会出现数字格式化异常。
成员方法
public static int parseInt(String s):将String类型的数字转换为int类型
public static Integer valueOf(int i):将int类型转换为Integer类型
public static Integer valueOf(String s):将String类型的数字转换为Integer类型
常用的进制转换方法
public static String toBinaryString(int i):以字符串形式将十进制数据转换为二进制数据
public static String toOctalString(int i):以字符串形式将十进制数据转换为八进制数据
public static String toHexString(int i):以字符串形式将十进制数据转换为十六进制数据

JDK5的新特性——自动拆装箱

JDK1.5之后,简化了Integer的定义方式。原来的

Integer x = new Integer(4);

可以直接写成:

Integer x = 4; //自动装箱

而运算时,可以写成:

x = x + 5; //自动拆箱

注意:在使用时,直接定义Integer x = null;,运行时会出现空指针异常(NullPointerException).

从上面的例子可以看到,自动装箱是自动将基本类型提升为对应的包装类型,而自动拆箱就是自动将包装类类型降为基本数据类型。

int与String类型的相互转换

int转String
//int--->String
int i = 100 ;
//方式1:最接的方式,空串拼接
String s = "" ;
String result = s+i ;
System.out.println(result); //"100"
System.out.println("---------------------------------") ;
//方式2:int---->Integer作为中间桥梁---->String
Integer integer= new Integer(i) ;//Integer类型了
//public String toString():重写Object的,打印出对象名称是int类型的原始值,不是地址
String reuslt = integer.toString();
System.out.println(result);//"100"
System.out.println("---------------------------------") ;
//方法3:Integer的静态功能public static String toString(int i)(Integer的自己toString方法)
String result2 = Integer.toString(i);
System.out.println(result2);//"100"
String转int
//String--->int
String str = "50" ;
//String--->int 最为有效最接的方式  (最推荐的,使用最多)
//Integer的这个方法
//public static int parseInt(String s) throws NumberFormatException
//参数必须为数字字符串
//在其他的基本类型对应的引用类型 parseXXX(String s) --->XXX类型
int ii = Integer.parseInt(str);
System.out.println(ii); //50
System.out.println("----------------------------") ;
//String--Integer->int
//Integer的成员方法public int intValue()
Integer integer2 = new Integer(str) ;
int iii = integer2.intValue();
System.out.println(iii); //50

Integer类的练习

/**
 * 代码中分别定义了i1到i8的整型变量,逐个推断输出的内容
 */
public class Test {
    public static void main(String[] args) {
        Integer i1 = 127 ;
        Integer i2 = 127 ;
        
        System.out.println(i1==i2) ; //1) true
        System.out.println(i1.equals(i2)) ;//2) true
        Integer i3 = 127 ;
        Integer i4 = new Integer(127) ;
        
        System.out.println(i3==i4) ;//3) false
        System.out.println(i3.equals(i4)) ;//4) true

        Integer i5 = 128 ;      
        Integer i6 = 128 ;
        
        System.out.println(i5==i6) ; //5) false
        System.out.println(i5.equals(i6)) ;//6) true

        Integer i7 = new Integer(128) ;
        Integer i8 = new Integer(128) ;
        
        System.out.println(i7==i8) ;//7) false
        System.out.println(i7.equals(i8)) ;//8) true
    }
}

解析:

  1. i1与i2中都定义了整型变量和127的常量,并使i1和i2指向常量127,所以内存地址值相同,结果为true
  2. 内容相同,所以结果为true
  3. i3定义了栈内存变量、堆内存变量和常量127;i4定义了栈内存变量和常量127。所以栈内存变量指向的内存地址值不同,结果为false
  4. 同2,故此处省略
  5. 这是我当时看的原理的解析,博客说的很清楚:Integer缓存IntegerCache详解_谷哥的小弟的博客-CSDN博客_integercache
  6. 同2,故此处省略
  7. i7、i8都定义了栈内存变量、堆内存变量和常量128,所以栈内存变量指向的内存地址值不同,结果为false
  8. 同2,故此处省略

Character类

Character是char类型的包装类型。其中,该类提供了几种方法,以确定字符的类别,并将字符转为大写或小写。

Character的相关方法

构造方法
public Character(char value)
成员方法
public static boolean isUpperCase(char ch):判断是否为大写字母字符
public static boolean isLowerCase(char ch):判断是否为小写字母字符
public static boolean isDigit(char ch):判断是否为数字字符
public static char toUpperCase(char ch):将字符转为大写字符
public static char toLowerCase(char ch):将字符转为小写字符

Date类

java.util.Date类表示特定的瞬间(日期对象),精确到毫秒。

Date类的构造方法

构造方法
public Date():空参构造方法
public Date(long date)
成员方法
public long getTime():获取自197011000秒以来,经过的毫秒数
public void setTime(long time):设置日期

DateFormat类

DateFormat类是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。由于是抽象类,使用时不能直接去new,所以使用其子类SimpleDateFormat。

SimpleDateFormat构造方法

public SimpleDateFormat()
public SimpleDateFormat(String pattern)

SimpleDateFormat成员方法

public final String format(Date date):将日期转为字符串
public Date parse(String source) throws ParseException:解析字符串调用本身这个方法就会出现问题,因为String类型的格式和SimpleDate这里面的模式不一致的话,会出现解析异常(编译时期异常)。

方法属于编译时期异常时,谁调用这个方法必须对这个做出处理,如果不处理就不能编译通过!

对于编译时期的异常,可以用throws抛出在main方法上,也可以用try…catch捕获异常(开发中业务层代码处理异常捕获)

博客难免会产生一些错误。如果写的有什么问题,欢迎大家批评指正。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值