day12-Scanner类和String类

12.1 Scanner类

  • 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器
  • 定义: public final class Scanner extends Object
12.1.1 Scanner基本键盘录入
Scanner scanner = new Scanner(System.in); //控制台键盘录入
System.out.println("请输入一个int数,输入0退出!");
while (true) {
    if (scanner.hasNextInt()) {  //判断输入的内容,Scanner有很多判断类型的方法
        int number = scanner.nextInt();
        if ( 0 == number) break;
        System.out.println("输入的内容是: " + number);
    }else {
        System.err.println("输入类型不是int。退出程序。");
        break;
    }
}
scanner.close();

//nextInt()是键盘录入整数的方法,当我们录入10的时候
//其实键盘上录入的是10和\r\n,nextInt()方法只获取了10就结束了
//nextLine()是键盘录入字符串的方法,可以接收任意类型,通过\r\n来判断录入一行是否结束
解决方法:1,创建2个Scanner对象;2,使用nextLine()接收。

12.2 String类

  • a: 字符串字面值"abc"也可以看成一个字符串对象
  • b: 字符串是常量,一旦赋值,就不能被改变

使用构造方法初始化的例子:

byte[] arr1 = {97,98,99,45};
String s1 = new String(arr1);  //通过byte数组初始化
System.out.println(s1);  //输出 abc-(通过当前平台的字符集码表,来解码成字符串的)

byte[] arr2 = s1.getBytes(); //字符串又转为码表值
System.out.println(arr2[0]+".."+arr2[1]);

char data[] = {'a','c','z','o','5'};
String s2 = new String(data);    //字符串成串,就是字符串
System.out.println(s2);
12.2.1 String面试题
// 第一题 (常量池属于方法区的一部分)
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);      //?为什么?因为同样值的字符串,在常量池只有一份,所以地址值也相等
System.out.println(s1.equals(s2)); //肯定是true

// 第二题 下面这句话在内存中创建了几个对象?
String s3 = new String("abc");
// 答:2个,常量池一个,然后拷贝副本一个到 堆内存一个(因为有new),栈区的s3指向堆内存的"abc"

// 第三题
String a1 = new String("abc");
String a2 = "abc";
System.out.println( a1 == a2); //false 一个堆地址,一个常量池地址
System.out.println( a1.equals(a2));  //肯定是true

// 第四题
String q1 = "a" + "b" + "c";
String q2 = "abc";
System.out.println( q1 == q2); //true,Java中有常量优化机制,a-b-c相加,编译时就优化成了abc
System.out.println( q1.equals(q2));  //肯定是true

// 第五题
String z1 = "ab";
String z2 = "abc";
String z3 = z1 + "c";  //这里是 变量 + 常量,跟上面abc相加是不一样的
System.out.println(z2 == z3); //false 一个在堆内存,一个在常量池
System.out.println(z2.equals(z3));   //肯定是true
第五题内存图.png
字符串内存.png
12.2.2 String常用判断方法
boolean equals(Object anObject) //比较两个字符串是否相同,区分大小写
boolean equalsIgnoreCase(String anotherString) //比较两个字符串是否相同,忽略大小写
boolean contains(CharSequence s) //判断字符串是否包含字符串s
boolean startsWith(String s) //判断字符串是否以某个字符串s开头
boolean endsWith(String s) //判断字符串是否以某个字符串s结尾
boolean isEmpty() //判断字符串是否为空(长度为0)

"" 和 null 的区别
"" 是字符串常量,同时也是String类对象,可以调用String类的所有方法
null 是空常量,不能调用任何方法,否则出现空指针异常,null可以给任何引用数据类型赋值!

12.2.2 String的获取功能(截取)
int length() //获取字符串的长度(数组的长度是属性,字符串的长度是方法)
char charAt(int index) //获取字符串指定位置的字符(可能字符串索引越界异常)
int indexOf(char c) //获取字符c在字符串中出现的第一个位置,无则返回-1
int indexof(String str) //返回字符串str在字符串出现的第一个位置,无则返回-1
int indexOf(int ch, int fromIndex)  //字符在字符串中出现的第一个位置,从fromIndex开始匹配
int indexOf(String ss, int fromIndex)  //字符串在字符串中出现的第一个位置,从fromIndex开始匹配
lastIndexOf(xx) //跟indexof相反,从结尾开始匹配位置,值还是从正开始的,无则返回-1


String substring(int beginIndex) //从指定位置截取字符串(包含此位置),默认到末尾。
String substring(int beginIndex, int endIndex)  //截取字符串,从哪截取到哪,包含头,不含尾
12.2.2 String的遍历
String string = "遍历字符串";
for (int i = 0; i < string.length(); i++) {
    System.out.println(string.charAt(i));
}
12.2.2 题目:统计不同类型字符的个数
// 需求:统计字符串中大写字符,小写字符,数字字符,其他字符出现的次数
//分析:字符值都是有范围的,通过范围来判断是否包含该字符
String string = "Aabbcc123*&^$-a1@";
int big = 0, small=0, num=0, other=0;

for (int i = 0; i < string.length(); i++) {
    char c = string.charAt(i);
    if (c >= 'A' && c <= 'Z') big++;
    else if (c >= 'a' && c <= 'z') small++;
    else if (c >= '0' && c <= '9') num++;
    else other++;
}
12.2.4 String常用转换方法
byte[] getBytes() //把字符串转为码表值(中文有时候是GBK码表)
char[] toCharArray() //把字符串转为char数组
static String valueOf(char data[])  //把字符数组,转为字符串
static String valueOf(int i)     //把int转为字符串
static String valueOf(double d)  //把double转为字符串
    //valueOf可以将任意类型的对象,转为字符串

String toLowerCase() //将字符串转为小写
String toUpperCase() //将字符串转为大写
String concat(String str)  //字符串拼接,没有 + 号拼接强大
12.2.5 题目:转换字符
//需求: 把第一个字符串首字母大写,其余小写
String s = "loveXXOO";
String re = s.substring(0, 1).toUpperCase().concat(s.substring(1).toLowerCase());
System.out.println(re);  //注意上面的链式编程,前期可以分开写
12.2.5 题目:把数组转为字符串
int[] arr = {1,3,5,68};
String string = "[";
for (int i = 0; i < arr.length; i++) {
    if (i == (arr.length - 1))  //其实根据运算符号的优先级,不加里面的()也是可以的
        string = string + arr[i] + "]";
    else 
        string = string + arr[i] + ",";
}  // if else 不加{},是为了节省篇幅,建议加上

System.out.println(string);
12.2.6 String的其他功能
String replace(char old, char new) //替换字符串中的字符,返回新的字符串。不存在返回原字符串

String replace(String old, String new) //同上
String trim()  //去掉字符串两端的空格,中间不会去掉

int compareTo(String ss) //比较两个字符串,按照码表值比较(Unicode)
int compareToIgnoreCase(String str) //比较2个字符串,不区分大小写
12.2.7 题目:字符串反转
String s = "123456", s2 = "";

for (int i = 0; i < s.length(); i++) {
    s2 = s.charAt(i) + s2;
}

System.out.println(s2);
12.2.8 题目:字符串出现的次数
// 需求:求s2在s中出现的个数
String s = "qwe12-qwe12-qwe12-qwe12-qwe12-";
String s2 = "12";

int count = 0 ;    //出现的次数
int formIndex = 0; //从什么位置开始匹配
while ( (formIndex = s.indexOf(s2)) != -1 ) {
    count++;
    s = s.substring(formIndex+s2.length());
}
System.out.println(count);

END。
我是小侯爷。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,132评论 0 41
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,617评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,743评论 0 33
  • 写作是我面临的最最困难的事情,而我很庆幸遇到了一个很棒的英语老师。我从他的课堂中学到了很多有用的写作方法和思路。因...
    笺婵阅读 792评论 0 0