Java第四天——核心技术第三章(4)

字符串

String类 双引号括起来的 String s = “Enjoy!” ""表示空串

  • 子串
    String ss = s.substring(0,2); ss=“En”
    substring(a,b) 子串位置是从0到2 ( 字符串从0开始计数 )
    易于计算子串的长度: b-a

  • 拼接
    String str = ss + s; ss和s都可以替换为直接的字符串”xxxx”

  • 不可变字符串
    String类对象—不可变字符串
    因为在Java中String对象是在一个共享的存储池中,变量指向存储池中的相应位置,若想改变其变量的内容,只能改变变量的指向,不能改变存储池中的数据(因为改变数据很麻烦,效率极低) ,所以叫做不可变字符串。

-字符串是否相等
ss.equals(s); 字符串ss与字符串s是否相等 ss,s可以是常量“xxx”
ss.equalsIgnoreCase(s); 不区分大小写判断是否相等
== 只能判断两个字符串是否在同一位置 若判断相等不可用

  • 代码点与代码单元
    s.length(); 代码单元数量(即为字符串的长度)
    s.codePointCount(0,s.length()); 代码点数量(即为实际的长度)
    s.charAt(a); a在0~s.length()-1之间 位置为a的代码单元(字符)
    s.offsetByCodePoints(a,b) 得到以a位置偏移b个的代码点 再根据代码点求出代码单元

  • String类的方法 java.lang.stirng

    • boolean endsWith(String suffix) 若字符串以suffix结尾,返回true
    • int indexOf(String str)
    • int indexOf(String str,int fromIndex)
    • int indexOf(int cp)
    • int indexOf(int cp,int fromIndex)
      返回与字符串str或代码点cp匹配的第一个子串的开始位置,从索引0或者fromIndex开始计算。若在原始串中不存在str,返回-1
      lastIndexOf与indexOf相似,最后一个子串的开始位置,从索引原始串尾端或fromIndex开始计算
    • String substring(int beginIndex)
    • String subString(int beginIndex,int endIndex)
      返回一个新字符串(包含原始字符串从beginIndex到串尾endIndex-1的所有代码单位
    • String toLowerCase() 返回一个新字符串,大写变小写
    • String toUpperCase() 返回一个新的字符串,小写变大写
    • String trim() 返回一个新字符串,删除了原始字符串头部和尾部的空格
      务必用好API
  • 字符串构建 java.lang.StringBuilder
    StringBuilder builder = new StringBuilder(); 构建一个空的字符串构建器
    builder.sppend(“sss”); 添加一部分内容 append()
    builder.toString(); 用toString()构造字符串String类型
    bulider.length(); 求出其构建器或者缓冲器的代码单位数量(长度)
    builder.setCharAt(0,‘r’); 将builder中的第0个代码单元位置设置为‘r’

  • 输入输出

    • 读取输入 import java.util.*;
      Scanner sc = new Scanner(System.in);
      String line = sc.nextLine(); 输入一行 输入中可以包含空格
      String word = sc.next(); 输入一个单词 以空白符’ 作为分隔符
      sc.nextInt() 输入一个整数
      sc.nextDouble() 输入一个浮点数
import java.util.*;

/*    展示读取输入  */
public class InputTest{
	public static void main(String[] args){
	Scanner in = new Scanner(System.in);
	
	System.out.print("What is your name?");
	String name = in.nextLine();		//输入第一个字符串
	
	System.out.print("How old are you?");
	int age = int.nextInt(); 			//输入第二个整数

	System.out.println("Hello,"+name+",Next year,you'll be "+(age+1));      //输出Hello,XXX,Next year,you'll be XX
	}
}

注意:从控制台读取密码使用Console类 每次只能读取一行输入 没有读取单个单词或数值的方法
(可能进行交互操作时使用,通过控制台窗口为交互的用户返回一Console对象,否则,返回null。
对于任一通过控制台窗口启动的程序,都可使用Console对象。否则,其可用性将与所使用的系统有关)
Console con = System.console();
String username = con.readLine("User name: ");
char[] passwd = con.readPassword("Password: "); 返回的密码放到了一维字符数组中,为了安全。
在对密码处理后,应该立即用一填充值覆盖数组元素(一会儿会提到)

java.util.Scanner.* 除上面提到的 补充:
- boolean hasNext() 检测输入中是否还有其他单词
- boolean hasNextInt()
- boolean hasNextDouble() 检测是否还有表示整数或浮点数的下一个字符序列

java.io.Console.*
- static char[] readPassword(String prompt,Object …args)
- static String readLine(String prompt,Object …args) 显示字符串prompt并读取输入,直到输入行结束。args参数设定输入格式(下一节讲)

  • 格式化输出
    • System.out…print()
    • System.out.println()
    • System.out.printf(“Hello,%s.Next year,you’ll be %d”,name,age); %s代表name参数,%d代表age参数
      s,d为转换符

s 字符串 Hello
c 字符 H
b 布尔 True
h 散列码 42628b2
tx 日期时间
% 百分号 %
n 与平台有关的行分隔符
d 十进制整数 158
x 十六进制整数 9f
o 八进制整数 237
f 定点浮点数 15.8
e 指数浮点数 1.58e+01
g 通用浮点数
a 十六进制浮点数 0x1.fccdp3

System.out.printf("%8.2f",x) 用8个字符的宽度和小数点后两个字符的精度打印x 若x=1000.0/3.0 则输出为 3333.33(空格+3333.33 8个字符宽度 不够的用空格进行占位)

格式化输出标志 3333.33
+ +3333.33
空格 3333.33(空格+3333.33)
0 003333.33
- 3333.33(左对齐)
( (3333.33)将负数括在括号里
, 3,333.33 添加分组分隔符
# 3,333 对于f格式 包含小数点
# 0xcafe 对于x或o格式 添加前缀0x或0
$ 159 9F 给定被格式化的参数索引 %1 d d, %1 x 将以十进制和十六进制格式打印第一个参数
< 159 9F 格式化前面说明的数值 %d%<x以十进制和十六进制打印同一个数值

格式化字符串 String message = String.format(“Hello,%s.Next year,you’ll be %d”,name,age); 静态方法 不打印输出

  • 文件输入输出
    Scanner in = new Scanner(new File(“File.txt”); 构造一个File类去读取文件 文件输入
    文件位于Java虚拟机启动路径的相对位置,也可使用绝对路径(在命令行方式下用java MyProg启动程序,启动路径为命令解释器的当前路径。集成开发环境下,启动路径由IDE控制,可使用String dir = System.getProperty(“user.dir”);
    若文件中包含反斜杠符号 要在每一个反斜杠之前再添加一个反斜杠
    PrintWriter out = new PrintWriter(“myfile.txt”); 写入文件 文件输出
    注意:若用一个不存在的文件构造Scanner,或用一个不能被创建的文件名构造一个PrintWriter,会发生异常。Java认为这种异常比“被零整除“异常还严重
    当知道有可能出现“找不到文件”的异常的时候,应该只编译器:抛出异常
    public static void main(String[] args) throws FileNotFoundException{ Scanner in = new Scanner(new FIle("File.txt")); ...... }}
    命令行方式下,可利用重定向将任一问价捆绑到System.in和System.out java MyProg<myfile.txt> output.txt 这样就处理了FileNotFoundException异常

java.util.Scanner.*
Scanner(String data) 构造一个从给定字符串读取数据的Scanner

java.io.PrintWriter.*
PrintWriter(String filename) 构造 一个将数据写入文件的PrintWriter 文件名有参数指定

  • 补充: Date类型
    Date d = new Date(); Mon Feb 09 18:05:19 PST 2004

    日期和时间的转换符 常用
    c Mon Feb 09 18:05:19 PST 2004 完整的日期和时间
    F 2004-02-09 ISO 8601日期
    D 02/09/2004 美国格式的时间(月/日/年)
    T 18:05:19 24小时时间
    r 06:05:19 12小时时间

    printf方法特性:格式说明符语法
    % 参数索引+$ 标志 宽度 .+精度或t 转换字符

猜你喜欢

转载自blog.csdn.net/weixin_43137176/article/details/82749874