Java基础12---String类

Scanner的概述和方法介绍

1.Scanner类的构造方法

Scanner(InputStream source)

2. 一般方法

  • hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx
package com.geekds.scanner;

import java.util.Scanner;

public class ScannerTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        if(sc.hasNextInt()) {
            int i = sc.nextInt();
            System.out.println(i);
        }else {
            System.out.println("input error");
        }
    }

}
  • nextXxx() 获取下一个输入项。Xxx的含义和上个方法中的Xxx相同,默认情况下,Scanner使用空格,回车等作为分隔符
package com.geekds.scanner;
import java.util.Scanner;


public class NextIntTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("Please input a addend:");
        int a = sc.nextInt();
        System.out.print(a + " + ");
        int b = sc.nextInt();
        System.out.print(" = " + (a + b));
    }

}
package com.geekds.scanner;

import java.util.Scanner;

public class NextLineTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("username:");
        String s1 = sc.nextLine();  
        System.out.print("password:");
        String s2 = sc.nextLine();
        System.out.println("username: " + s1);
        System.out.println("password: " + s2);
    }
}

String类

1. String类的概述

      字符串字面值”abc”也可以看成是一个字符串对象。字符串是常量,一旦被赋值,就不能被改变。

2. String类的构造方法

常见构造方法
* public String():空构造
* public String(byte[] bytes):把字节数组转成字符串
* public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
* public String(char[] value):把字符数组转成字符串
* public String(char[] value,int index,int count):把字符数组的一部分转成字符串
* public String(String original):把字符串常量值转成字符串

案例演示:

package com.geekds.string;

public class StringConstruction {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        byte[] b = {43,23,8,34,90};
        String str = new String(b); //解码
        System.out.println(str);

        byte[] b2 = {76,77,78,65,66,67,68};
        String str1 = new String(b2,3,4);   //从第3个索引开始解码4个
        System.out.println(str1);

        char[] c = {'s','g','5','s'};
        String str2 = new String(c);    //将字符数组转换成字符串
        System.out.println(str2);

        String str3 = new String(c,2,2);
        System.out.println(str3);
    }

}

3. String类的常见面试题

package com.geekds.string;

public class StringMianshi {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        mianshi1();
        mianshi2();
        mianshi3();
        mianshi4();
        String h1 = "hou";
        String h2 = h1 + "li";//String 是使用StringBuilder或者StringBuffer的append方法将这俩货串联起来的
        String h3 = "houli";
        System.out.print(h3 == h2);
        System.out.println(h3.equals(h2));
    }

    private static void mianshi4() {
        String d1 = "d" + "o" + "n" + "g";
        String d2 = "dong";
        System.out.println(d1 == d2);//true,java有常量优化机制,类似于byte b = 1 + 2;
        System.out.println(d1.equals(d2));//true
    }

    private static void mianshi3() {
        String d = new String("shuai");
        String h = "shuai";
        System.out.println(d == h);//false
        System.out.println(d.equals(h));//true
    }

    private static void mianshi2() {
        //面试题2
        String shuai = new String("dong");  //此语句创建了几个对象?
        System.out.println(shuai);  //常量池一份,堆内存一份
    }

    private static void mianshi1() {
        //面试题1
        String dong = "shuai";  //在常量池中创建shuai,常量池的特点是没有就创建,有就直接用
        String hou = "shuai";   //直接把hou指向shuai,索引dong和hou的索引一样
        System.out.println(dong == hou);
        System.out.println(dong.equals(hou));
    }

}

4. String类的判断功能

  • boolean equals(Object obj):比较字符串的内容是否相同,区分大小写
  • boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
  • boolean contains(String str):判断大字符串中是否包含小字符串
  • boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
  • boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
  • boolean isEmpty():判断字符串是否为空。

示例:

package com.geekds.string;

public class StringJudgeMethods {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        method1();
        method2();
        method3();
        method5();
        method4();

    }

    private static void method4() {
        //判断是否为空
        String ds1 = "gdsf213jp";
        String ds2 = "";
        //String ds3 = null;空指针异常
        //空串“”和null的区别,空串“”是字符串常量,也是String类的对象,既然是对象,所以可以调用String类中的方法
        //null是空常量,不能调用任何方法,否则空指针异常。null可以给任意引用数据类型赋值
        System.out.println(ds1.isEmpty());
        System.out.println(ds2.isEmpty());
    }

    private static void method5() {
        String j1 = "dongshuai";
        String j2 = "do";
        String j3 = "ai";
        System.out.println(j1.startsWith(j2));//j1是否以j2开头
        System.out.println(j1.endsWith(j3));//j1是否以j3结尾
    }

    private static void method3() {
        //contains方法,长字符串中是否包含短字符串
        String l1 = "CandyHou";
        String l2 = "fuck";
        System.out.println(l1.contains(l2));
    }

    private static void method2() {
        //equalsIgnoreCase()方法
        String s1 = "shuai";
        String s2 = "ShuaI";
        System.out.println(s1.equalsIgnoreCase(s2));//忽略大小写
    }

    private static void method1() {
        String d1 = "dong";
        String d2 = "dong";
        String d3 = "Dong";
        //equals()方法
        System.out.println(d1.equals(d2));
        System.out.println(d1.equals(d3));
    }

}

5. 模拟用户登录

package com.geekds.test;

import java.util.Scanner;

public class StringLogin {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);


        for (int i = 0; i < 3; i++) {
            System.out.println("please input username:");
            String userName = sc.nextLine();
            System.out.println("please input password");
            String password = sc.nextLine();
            //以后作比较,最好把常量放前,因为userName可能是null,通常是字符串常量调用方法,防止空指针异常
            if("admin".equals(userName) && "admin".equals(password)){
                System.out.println("登录成功");
                break;  //跳出循环
            }else {

                if(i == 2) {
                    System.out.println("you are wrong too mang times, please come back tomorrow");
                }else {
                    System.out.println("username or password wrong! you have " + (2-i) + " chance");
                }
            }
        }
    }
}

6. String类的获取功能

  • int length():获取字符串的长度。
  • char charAt(int index):获取指定索引位置的字符
  • int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
  • int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
  • int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的
    索引。
  • int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
  • lastIndexOf
  • String substring(int start):从指定位置开始截取字符串,默认到末尾。
  • String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。

示例:遍历字符串

package com.geekds.test;

public class StringErgodic {

    /**
     * 遍历字符串
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = "我喜欢大长腿!";
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            System.out.print(c);
            //或者下面也行
            System.out.print(s.charAt(i));
        }
    }

}

示例:统计不同类型字符个数

package com.geekds.test;

public class StringSum {

    /**
     * 统计字符串中各类型字符的个数
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = "ASDFsdfoi235235-=,./$@%@$##$\3";
        int capital = 0;
        int lowerCase = 0;
        int number = 0;
        int other = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);//通过索引拿到每一个字符

            if(c >= 'A' && c <= 'Z'){
                capital++;
            }else if (c >= 'a' && c <= 'z') {
                lowerCase++;
            }else if(c >= '0' && c <= '9') {
                number++;
            }else {
                other++;
            }
        }

        System.out.println("capital: " + capital);
        System.out.println("lower case: " + lowerCase);
        System.out.println("number: " + number);
        System.out.println("other character" + other);
    }

}

7. String类的转换功能

  • byte[] getBytes():把字符串转换为字节数组。
  • char[] toCharArray():把字符串转换为字符数组。
  • static String valueOf(char[] chs):把字符数组转成字符串。
  • static String valueOf(int i):把int类型的数据转成字符串。
  • 注意:String类的valueOf方法可以把任意类型的数据转成字符串。

  • String toLowerCase():把字符串转成小写。

  • String toUpperCase():把字符串转成大写。
  • String concat(String str):把字符串拼接。

示例:


package com.geekds.string;

import com.geekds.bean.Person;

public class TransformTest {

    /**
     * String类的转换功能
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        methodGetBytes();
        methodToCharArray();
        methodValueOf();
        methodUpperLowerConcat();
    }

    private static void methodUpperLowerConcat() {
        String s1 = "dongdaxia董大侠";
        String s2 = "YuXinSuoShan";
        String s3 = s1.toUpperCase();//将字符串转成大写
        String s4 = s2.toLowerCase();
        System.out.println(s3);
        System.out.println(s4);


        System.out.println(s3 + s4);//用“+”拼接能力更强大,可以将字符串与任意类型拼接
        System.out.println(s3.concat(s4));//concat()方法调用和传入的都必须是字符串
    }

    private static void methodValueOf() {
        System.out.println();
        //static String valueOf()方法将任意类型转换为字符串
        //底层还是用的String的构造方法完成的
        char[] c = {'d','o','n','g'};
        String s = String.valueOf(c);
        System.out.println(s);

        String s2 = String.valueOf(100);//将整形转换为字符串
        System.out.println(s2 + 1000);

        //还可以将Object转换为字符串
        //valueOf()和copyValueOf()方法功能是一样的
        Person p = new Person("余心所善",16);
        String s3 = String.valueOf(p);  //调用的是对象的toString()方法
        System.out.println(p);
        System.out.println(s3);
    }

    private static void methodToCharArray() {
        System.out.println();
        //将字符串转换为字符数组
//      遍历字符串有两种方式,一种是用索引,还有一种是这个方法
        String s1 = "geekds";
        char[] c = s1.toCharArray();
        for (int i = 0; i < c.length; i++) {
            System.out.print(c[i] + " ");
        }
    }

    private static void methodGetBytes() {
        //将字符串转换为字节数组
        String s1 = "dong";
        byte[] b = s1.getBytes();
        for (int i = 0; i < b.length; i++) {
            System.out.print(b[i] + " ");
        }
        System.out.println();
        /*
         * 通过GBK码表将字符串转换为字节数组
         * 这个过程成为编码:把人能看懂的转换为计算机能看懂的
         * GBK码表一个中文代表两个字节
         * GBK码表特点:中文的第一个字节肯定是负数
         */
        String s2 = "静女其姝,俟我于城隅,爱而不见,搔首踟蹰。";
        byte[] b2 = s2.getBytes();
        for (int i = 0; i < b2.length; i++) {
            System.out.print(b2[i] + " ");;
        }
        System.out.println();
        String s3 = "琲";
        byte[] b3= s3.getBytes();
        for (int i = 0; i < b3.length; i++) {
            System.out.print(b3[i] + " ");
        }
    }

}

示例:按要求转换字符,链式编程,需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)

package com.geekds.test;
//练习,将一个字符串的首字母转成大写,其余小写(只考虑英文字母的大小写)
public class UpperLower {
    public static void main(String[] args) {
        String s = "dONGDAxia!";
        //链式编程,只要保证每次调用完方法返回的是对象,就可以继续调用
        String s2 = s.substring(0,1).toUpperCase().concat(s.substring(1).toLowerCase());
        System.out.println(s2);
    }
}

示例:把数组转成字符串

package com.geekds.test;

public class ArrayString {
    public static void main(String[] args) {
        int[] i = {23,200,13,4567,};
        String s = "[";
        for (int j = 0; j < i.length; j++) {
            if(j == i.length - 1) {
                s = s + i[j] + "]";
            }else {
                s = s + i[j] + ", ";
            }
        }
        System.out.println(s);
    }
}

8. String类的其他功能,替换功能,trim(),按字典比较两个字符串

1)String的替换功能

String replace(char old,char new)
String replace(String old,String new)

2)String的去除字符串两空格

String trim()

3)String的按字典顺序比较两个字符串

int compareTo(String str)
int compareToIgnoreCase(String str)

示例:

package com.geekds.string;

public class StingReplaceCompareTo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        methodReplace();
        methodTrim();
        methodCompareTo();
        methodCompareToIgnoreCase();
    }

    private static void methodCompareToIgnoreCase() {
        //不区分大小写的比较
        String s = "dong";
        String s1 = "dONG";
        int i = s.compareToIgnoreCase(s1);
        System.out.println(i);
    }

    private static void methodCompareTo() {
        //按字典顺序比较两个字符串
        String s1 = "geekds";
        String s2 = "dongdaxia";
        int i = s1.compareTo(s2);
        System.out.println(i);

        String s3 = "d";
        String s4 = "ddd";
        int i2 = s3.compareTo(s4);//字符相同,长度不同的,这样的比较长度
        System.out.println(i2);

        String s5 = "董";
        String s6 = "猴";
        int i3 = s5.compareTo(s6);
        System.out.println('董' + 0);//内存中char类型的用的是ASCII码表,设置到硬盘读写的用的是跟系统相关的码表,UTF-8或者GBK
        System.out.println('猴' + 0);
        System.out.println(i3);
    }

    private static void methodTrim() {
        String s = " geek ds ";
        String s2 = s.trim();//去掉字符串前后两端的空格
        System.out.println(s2);//用于注册的时候去掉用户名两端的空格
    }

    private static void methodReplace() {
        //String replace(char old,char new)
        String s = "dongdaxia";
        String s2 = s.replace('o', 'd');
        String s3 = s.replace('z','d');
        String s4 = s.replace("ong","ing");
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
    }

}

9. 字符串反转

直接上示例:

package com.geekds.test;

import java.util.Scanner;

public class StringReversal {

    /**
     * 将字符串反转
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("Please input a string");
        String s1 = sc.nextLine();

        char[] arr = s1.toCharArray();
        String s2 = "";
        for (int i = arr.length - 1; i >= 0; i--) {
            s2 = s2 + arr[i];
        }
        System.out.println(s2);
    }

}

10. 在大串中查找小串出现的次数

示例:

package com.geekds.test;

public class BigStringFindSmallString {

    /**
     * 统计大串中小串出现的次数
     * 通过indexOf()方法
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String bigString = "江南可采莲,莲叶何田田,鱼戏莲叶间。鱼戏莲叶东,鱼戏莲叶西,鱼戏莲叶南,鱼戏莲叶北。";
        String smallString = "莲叶";

        int count = 0;//定义计数器
        int index = 0;//定义索引
        while((index = bigString.indexOf(smallString)) != -1) {
            count++;
            bigString = bigString.substring(index + smallString.length());
        }
        System.out.println(count);
    }

}

利用间隙时间多看看API中的方法,加深记忆,不会就打开eclipse敲一遍。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值