目录
API
API使用练习
String构造方法
字符串方法
API
API ( Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
简单理解:API是给程序员提供的一种工具,以便能更轻松的实现想要完成的功能。
比如手机充电的接口
Java API:指的就是JDK中提供的各种功能的Java类
这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用
API使用练习
需求:学习Scanner类的使用,并实现键盘录入一个字符串,最后输出在控制台
前面学习了使用scanner模块录入了一个数字类型
- import java.util.Scanner;
- Scanner sc = new Scanner(System.in); //System.in是一个构造方法的参数
- int x = sc.nextInt(); //nextInt()返回一个int类型的
接下来录入一个字符串类型nextLine
package com.test;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
//创建对象
Scanner sc = new Scanner(System.in); //这里创建对象的时候其实调用了一个构造方法
//接收数据
System.out.println("请输入一个字符串数据:");
String line = sc.nextLine();
//输出结果
System.out.println("你输入的数据是:" + line);
}
}
String构造方法
string类代表字符串。Java程序中的所有字符串文字〈例如"abc”〉都被实现为此类的实例。也就是说,Java程序中所有的双引号字符串,都是String类的对象
字符串特点
- 字符串不可变,他们的值在创建后不能被更改
- 虽然String的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组( char[]),就是由多个字符组成的数据。但是底层原理是字节数组( byte[])。
1. 关于字符串它们的值在创建后不能被更改。是真的吗
字符串属于引用数据类型,所以String a = "aa"是指向堆内存中的aa地址。当对字符串重新赋值a = "bb",堆内存又会为其开辟新的空间bb,其a又指向了"bb"空间这个地址。看起来值是改变了,但其实原来字符串中的内容并没有改变。
String 构造方法
下面是几种常见的获取字符串对象的方式。推荐使用直接赋值的方式得到字符串对象
总体来是就是两种方式得到String对象,一种是通过构造方法,第二种就是直接赋值的方式
package com.test;
import com.sun.xml.internal.org.jvnet.fastinfoset.sax.FastInfosetReader;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
//创建一个空白字符串对象,不含有任何内容
String s1 = new String();
System.out.println(s1); //输出空白
//根据字符数组的内容。来创建 字符串对象
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println(s2); //输出abc
//根据字节数组的内容,来创建字符串对象
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println(s3); //输出abc
//直接赋值的方式创建字符串对象
String s4 = "abc";
System.out.println(s4); //输出abc
}
}
String对象的特点
1)通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同
char[] chs = { 'a','b','c'};
string s1 = new string(chs) ;string s2 = new string(chs) ;
上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的
2)以 " " 方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串池中维护
string s3 = "abc" ;
string s4 = "abc" ;
在上面的代码中,针对第一行代码,JVM会建立一个String对象放在字符串池中,并给s3参考;第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上是同一个对象
字符串比较
使用==做比较
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫: equals()
- public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
package com.test;
import com.sun.xml.internal.org.jvnet.fastinfoset.sax.FastInfosetReader;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a' , 'b', 'c'};
String s1 = new String(chs); //new出来的字符串对象地址是不同的
String s2 = new String(chs);
//直接赋值的方式得到对象
String s3 = "abc";
String s4 = "abc";
//比较字符串对象地址是否相等
System.out.println(s1 == s2); //false
System.out.println(s1 == s3); //false
System.out.println(s3 == s4); //true
//比较字符串内容是否相等
System.out.println(s1.equals(s2)); //true
System.out.println(s1.equals(s3)); //true
System.out.println(s3.equals(s4)); //true
}
}
用户登录案例
需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
思路:
- 已知用户名和密码,定义两个字符串表示即可
- 键盘录入要登录的用户名和密码,用Scanner 实现
- 拿键盘录入的用户名、密码和已知的用户名、密码进行比较,给出相应的提示。字符串的内容比较,用equals()方法实现
- 用循环实现多次机会,这里的次数明确,采用for循环实现,并在登录成功的时候,使用break结束循环
package com.test;
import com.sun.xml.internal.org.jvnet.fastinfoset.sax.FastInfosetReader;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
//已知用户名和密码,定义两个字符串表示即可
String username = "admin";
String password = "123456";
//键盘录入要登录的用户名和密码,用Scanner 实现
Scanner sc = new Scanner(System.in);
for(int i=0; i<3; i++){
System.out.print("请输入用户名:");
String name = sc.nextLine();
System.out.print("请输入密码:");
String pwd = sc.nextLine();
//拿键盘录入的用户名、密码和已知的用户名、密码进行比较,给出相应的提示。字符串的内容比较,用equals()方法实现
if(name.equals(username) && pwd.equals(password)){
System.out.println("登录成功");
break;
}else{
if(2-i == 0){
System.out.println("您的账户已被锁定,请于管理员联系");
}else{
//i值:0,1,2
// 2,1,0
System.out.println("登录失败,你还有"+(2-i)+"几次机会");
}
}
}
}
}
字符串方法
String s = "today is nice";
- s.length() 获取字符串长度,输出13
- s.charAt(0) 获取0索引所在字符,输出t
统计字符次数案例
需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
思路
- 键盘录入一个字符串,用Scanner 实现
- 要统计三种类型的字符个数,需定义三个统计变量,初始值都为0
- 遍历字符串,得到每一个字符
- 判断该字符属于哪种类型,然后对应类型的统计变量+1
知识点补充:
字符比较大小其实就是用的其的ASCII值进行比较,java中如何将一个字符转换为ascii码?
- A-Z的ascii码值:65-90
- a-z的ascii码值:97-122
方法一:
直接将这个字符转化为int型就可以得到ascii码值
- char s = 'A';
- int k = (int)s;
方法二:
将这个字符转化为byte型就可以得到ascii码值
- char s = 'A';
- byte k = (byte)s;
package com.test;
import com.sun.xml.internal.org.jvnet.fastinfoset.sax.FastInfosetReader;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
int daxie = 0;
int xiaoxie = 0;
int num = 0;
//录入字符串
Scanner sc = new Scanner(System.in);
System.out.println("请录入一个字符串:");
String s = sc.nextLine();
//遍历字符串,获取索引所在字符
for(int i=0; i<s.length(); i++){
char a = s.charAt(i);
if (a>='a' && a <='z'){ //程序默认使用其中的ASCII值进行比较
xiaoxie++;
}else if(a>='A' && a<='Z'){
daxie++;
}else if(a>='0' && a<='9'){
num++;
}
}
System.out.println("大写字符个数为:"+daxie);
System.out.println("小写字符个数为:"+xiaoxie);
System.out.println("数字个数为:"+num);
}
}
拼接字符串案例
需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为int[] arr= {1,2,3};,执行方法后的输出结果为:[1,2,3]
package com.test;
import com.sun.xml.internal.org.jvnet.fastinfoset.sax.FastInfosetReader;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
//初始化一个数组
int[] arr = {1, 2, 3, 4, 5, 6};
//调用函数
String s = arrayToString(arr);
System.out.println(s); //输出 [1, 2, 3, 4, 5, 6]
}
public static String arrayToString(int[] arr){
String s = "";
s += "[";
for(int i=0; i <arr.length; i++){
if(i==arr.length-1){ //判断是否是数组中最后一个字符
s += arr[i];
}else{
s += arr[i] + ", ";
}
}
s += "]";
return s;
}
}
字符串反转案例
需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果例如,键盘录入abc,输出结果cba
package com.test;
import com.sun.xml.internal.org.jvnet.fastinfoset.sax.FastInfosetReader;
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
String s = reverse(line);
System.out.println(s);
}
//定义方法,实现字符串反转。定义方法首先要求两个明确,返回值类型与参数类型
public static String reverse(String s){
String ss = "";
for(int i=s.length()-1; i>=0; i--){
ss += s.charAt(i);
}
return ss;
}
}