Scanner String 类

Scanner类

1,Scanner的概述和构造方法原理

A:Scanner的概述:	JDK5以后用于获取用户的键盘输入
B:Scanner的构造方法原理
	Scanner(InputStream source)
	System类下有一个静态的字段:
		public static final InputStream in; 标准的输入流,对应着键盘录入。

import java.util.Scanner;

/*
* System类下有一个静态的字段:
*   public static final InputStream in;  in:标准的输入流,对应着键盘录入
*
*    InputStream is=System.in;
*   Class Demo{
*       public static final int x=10;
*       public static final Student s=new Student();
*
*   }
*   int y=Demo.x;
*   Student s=Demo.s;
*
*   构造方法:Scanner(InputStream source)
*
* */
public class ScannerDemo {
    public static void main(String[] args) {
        //创建对象
        Scanner scanner = new Scanner(System.in);


    }
}		

2,Scanner类的hasNextXxx()和nextXxx()方法

基本格式
	hasNextXxx()  判断下一个是否是某种类型的元素,其中Xxx可以是Int,Double等。
				  如果需要判断是否包含下一个字符串,则可以省略Xxx
	nextXxx()  获取下一个输入项。Xxx的含义和上个方法中的Xxx相同

public int nextInt():获取一个int类型的值
public String nextLine():获取一个String类型的值
public String next():获取一个String类型的值	

Scanner获取数据出现的小问题及解决方案

public class ScannerDemo2 {
    public static void main(String[] args) {
       /* Scanner sc = new Scanner(System.in);
        System.out.println("请录入一个整数");
        int num = sc.nextInt();
        System.out.println(num);
        System.out.println("请录入一个字符串");
        String s = sc.nextLine();
        System.out.println(s);*/
        //当我们先录入一个整数,在录入一个字符串时,发现字符串并没有录入进去。
        //因为你输入完数字后,敲了回车,那么这个回车换行其实被当做字符 然后 nextLine() 这个方法,把回车换行录入进去了。这种现象不是你想要的。那怎么解决。
        //解决方式1. 你可以录完整数,在录入字符串之前,重新再创建一个Scanner对象。

        Scanner sc = new Scanner(System.in);
        System.out.println("请录入一个整数");
        int num = sc.nextInt();
        System.out.println(num);
        //重新创建一个新的对象
        sc=new Scanner(System.in);
        System.out.println("请录入一个字符串");
        String s = sc.nextLine();
        System.out.println(s);

        System.out.println("===============================");
        //解决方式2:你可以再录入字符串时,换一个方法 next()
     /*   Scanner sc = new Scanner(System.in);
        System.out.println("请录入一个整数");
        int num = sc.nextInt();
        System.out.println(num);
        System.out.println("请录入一个字符串");
        //换成这个next()也能录入字符串
        String s = sc.next(); //这个方法不会录入回车换行。
        System.out.println(s);*/
    }
}

案例:判断Scanner获取数据的类型,并提示

import java.util.Scanner;

public class ScannerDemo2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数");
        int a=ScannerUtil.getNum(scanner);
        System.out.println(a);
        scanner.close();

    }
}

class ScannerUtil{
   private ScannerUtil(){};//私有化构造,不让外界创建ScannerUtils类的对象
   public static int getNum(Scanner scanner){
       while (true){
            scanner=new Scanner(System.in);

           if (scanner.hasNextInt()){
               int s=scanner.nextInt();
            
               return s;
           }else {
               System.out.println("输入错误");
           }
       }
   }
}

String类

1,String类的概述

A:什么是字符串
	字符串是由多个字符组成的一串数据(字符序列)
	字符串可以看成是字符数组
B:String类的概述	
	通过JDK提供的API,查看String类的说明
    //String 类重写toString()方法,不在打印地址值,而是打印字符串的字面内容
    //String  类重写了equals()方法,不再比较两个字符串的地址值是否相同,而是比较两个字符串,字面上的内容是否相同。
	
	可以看到这样的两句话。
	a:字符串字面值"abc"也可以看成是一个字符串对象。
	b:字符串是常量,一旦被创建,就不能被改变,但引用是可以改变的;
	当我们采用 字符串字面值 这种方式来定义一个字符串的时候,
        他会先去字符串常量池去查找有没有有该字符串,如果没有,就构建这个字符串。
        如果有,就把字符串常量池中这个字符串的地址值,赋值给这个新的引用
 String str = new String("abc"):这句话创建了两个对象

字符串内存图

2,String类的构造方法

常见构造方法
	public String():空构造 创建的是一个空串
	public String(byte[] bytes):把字节数组转成字符串	
	public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串       (index:表示的是从第几个索引开始, length表示的是长度)
	
	public String(char[] value):把字符数组转成字符串
	public String(char[] value,int index,int count):把字符数组的一部分转成字符串
	public String(String original):把字符串常量值转成字符串

3,==和equals的区别

== 号 比较两个对象,比较的是对象的地址值是否相同
String类重写了父类Object的equals方法,不再去比较两个字符串的地址值是否相同,而是比较两个字符串字面上的内容是否相同

4,String类的判断功能

String类的判断功能
public boolean equals(Object obj):				比较字符串的内容是否相同,区分大小写
public boolean equalsIgnoreCase(String str):	比较字符串的内容是否相同,忽略大小写
public boolean contains(String str):			判断字符串中是否包含传递进来的字符串
public boolean startsWith(String str):			判断字符串是否以传递进来的字符串开头
public boolean endsWith(String str):			判断字符串是否以传递进来的字符串结尾
public boolean isEmpty():						判断字符串的内容是否为空串""

判断功能的应用:模拟用户登录

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        String name="张三";
        String num="12345";
        //获取用户从键盘输入的用户名和密码,来模拟登陆
        Scanner sc = new Scanner(System.in);

        for (int i = 1; i <=3; i++) {
            System.out.println("请输入用户名");
            String s=sc.nextLine();
            System.out.println("请输入密码");
            String m=sc.nextLine();
            //把用户输入的数据和我们查出来的数据进行比对
            if (s.equals(name)&&m.equals(num)){
                System.out.println("登录成功");
                break;
            }else {
                if ((3-i)==0){
                    System.out.println("锁定");
                }else {
                    System.out.println("还剩"+(3-i)+"次机会");
                }
            }
        }

    }
}

5,String类的获取功能

String类的获取功能
public int length():				获取字符串的长度。
public char charAt(int index):		获取指定索引位置的字符
public int indexOf(int ch):			返回指定字符在此字符串中第一次出现处的索引。
//调用indexOf() 如果没有找到 返回 -1  -1 经常用来代表没找到 我们经常用 -1来作为判断条件    
public int indexOf(String str):		返回指定字符串在此字符串中第一次出现处的索引。
public int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
public int indexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
lastIndexOf系列:与indexOf系列相反(从右往左)	
public String substring(int start):		从指定位置开始截取字符串,默认到末尾。
public String substring(int start,int end):	从指定位置开始到指定位置结束截取字符串。
(含头不含尾)    

遍历字符串

public class MyTest2 {
    public static void main(String[] args) {
        String s4 = "我在人民广场吃着炸鸡而此时此刻你在哪里";
      // 快速生成 s4.length().fori
        for (int i = 0; i < s4.length(); i++) {
            char ch = s4.charAt(i);
            System.out.println(ch);
        }
        System.out.println("================================");
        //反向遍历
        for (int length = s4.length()-1; length >= 0; length--) {
            char ch = s4.charAt(length);
            System.out.println(ch);
        }
    }
}

统计不同类型字符个数

需求:统计一个字符串中大写字母字符,小写字母字符,数字字符出现的次数。
ublic class Test1 {
    public static void main(String[] args) {
        int caps=0;
        int letter=0;
        int num=0;
        String str = "asdfaASFfdcfdf144149855001asdfasAFdcdf";
        //遍历,遍历途中,就得判断是什么字符,然后统计
        //定义统计变量
        for (int i = 0; i <str.length(); i++) {
            char ch=str.charAt(i);
            if (ch>='a'&&ch<='z'){
                letter++;
            }else if (ch>='A'&&ch<='Z'){
                caps++;
            }else if (ch>='0'&&ch<='9'){
                num++;
            }
        }
        System.out.println("大写字符有" + caps + "个");
        System.out.println("小写字符有" + letter + "个");
        System.out.println("数字符有" + num + "个");
    }
}

6, String类的转换功能

String的转换功能:
	public byte[] getBytes():						把字符串转换为字节数组。
	public char[] toCharArray():					把字符串转换为字符数组。
	public static String valueOf(char[] chs):		把字符数组转成字符串。
	public static String valueOf(int i):int类型的数据转成字符串。
		注意:String类的valueOf方法可以把任意类型的数据转成字符串。
	public String toLowerCase():					把字符串转成小写。
	public String toUpperCase():					把字符串转成大写。
	public String concat(String str):					把字符串拼接。+也可实现

按要求转换字符

	需求:把一个字符串的首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
public class Test3 {
    public static void main(String[] args) {
      
        String s="avbcfCSxx";
        String a=s.substring(0,1).toUpperCase().concat(s.substring(1).toLowerCase());
        System.out.println(a);

    }
}
	

7,String类的其它功能

String的替换功能
	public String replace(char old,char new)			将指定字符进行互换
	public String replace(String old,String new)		将指定字符串进行互换
String的去除字符串两空格
	public String trim()							去除两端空格
String的按字典顺序比较两个字符串及案例演示
	public int compareTo(String str)    会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果
如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果
如果连个字符串一摸一样 返回的就是0
	public int compareToIgnoreCase(String str) 跟上面一样 只是忽略大小写的比较

8,在大串中查找小串出现的次数

需求:统计大串中小串出现的次数
	举例: "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun”
思路:
  a:定义一个统计变量,初始化值是0;
  b:先获取一次"java"在大串中第一次出现的索引
     1:如果返回值为-1,说明没有java,返回统计变量
     2:如果不为-1,说明存在,统计变量++
  c:把刚才的索引加小串长度作为起始位置,截取原始大串,并赋给原来的大串。
  d:回到b
  
代码实现;
ublic class Test2 {
    public static void main(String[] args) {
        //需求:统计大串中小串出现的次数 "java"
        String s = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
        String ele = "java";
        int count = getCount(s, ele);

        System.out.println("在大串中出现了" + count + "次");
    }

    public static int getCount(String s, String e) {
        //定义统计变量
        int count = 0;
        int index = s.indexOf(e);
        while (index != -1) {
            //索引不是-1,说明存在
            count++;
            //把刚才的索引+小串的长度作为开始位置,截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
            int startIndex = index + e.length();
            s = s.substring(startIndex);
            //继续查
            index = s.indexOf(e);

        }
        return count;
    }
}

优化

public class Test4 {
    public static void main(String[] args) {
        //需求:统计大串中小串出现的次数 "java"  改进
        String s = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
        String ele = "java";
        int count = getCount(s, ele);

        System.out.println("在大串中出现了" + count + "次");
    }

    public static int getCount(String s, String e) {
        //定义统计变量
        int count = 0;
        int index ;
        while ((index=s.indexOf(e))!=-1) {
            //索引不是-1,说明存在
            count++;
            //把刚才的索引+小串的长度作为开始位置,截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串(改进后 合并)
            s = s.substring(index + e.length());
        }
        return count;
    }
}

);
}

public static int getCount(String s, String e) {
    //定义统计变量
    int count = 0;
    int index ;
    while ((index=s.indexOf(e))!=-1) {
        //索引不是-1,说明存在
        count++;
        //把刚才的索引+小串的长度作为开始位置,截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串(改进后 合并)
        s = s.substring(index + e.length());
    }
    return count;
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值