String
查询字符串
indexOf(int ch) / String
根据一个整数 或者 一个字符串 查找在字符串中第一次出现的位置下标
// 检索 参数 在 字符串中出现的下标(从下标0 开始检索)
String s = "hello String";
int index = s.indexOf("h");
System.out.println(index);
int index = s.indexOf(104); // 104 在 ASII 编码表中 对应 h
如果字符串中没有该字符出现, 返回 -1 (下标不可能为 -1 )
lastIndexOf(int ch)
// 检索 参数 在 字符串中出现的下标(从下标0 开始检索)
String s = "hello String";
int index = s.lastIndexOf("h");
System.out.println(index);
获取
length()
获取字符串长度 length()方法
区别于 数组的.length属性
charAt(下标)
根据下标获取 对应的字符
截取字符串substring
String s = "hello String";
String s1 = s.substring(6);
// s1 = String 从第6 个下标开始 截取一直到末尾
String s = "hello String";
String s1 = s.substring(6,10);
// s1 = Stri 从第6 个下标开始 截取到第10 个下标
// 左包右不包
getBytes()
String s = "hello String";
byte[] bys = s.getBytes();
System.out.println(Arrays.toString(bys));
// [104, 101, 108, 108, 111, 32, 83, 116, 114, 105, 110, 103]
toCharArray()
String s = "hello String";
char[] chars = s.toCharArray();
System.out.println(Arrays.toString(chars));
// [h, e, l, l, o, , S, t, r, i, n, g]
判断
endsWith(String suffix)
startsWith(String prefix)
contains(CharSequence s)
String s = "hello String";
// 判断是否以 a 结尾
System.out.println(s.endsWith("a"));
// 判断是否以 h 开头
System.out.println(s.startsWith("h"));
// 判断是否包含 a
System.out.println(s.contains("a"));
equals(Object anObject)
isEmpty()
String s = ""; // 只有该情况 字符串是空字符串
matches(String regex)
验证字符串是否满足某种规则的 正则表达式
String phoneNo = "13687613109";
//正则表达式 使用一个字符串 描述一种规则
// 1[\d]{10} 表示 首位字符必须为 1 之后的10位必须为数字
boolean flag = phoneNo.matches("1[\\d]{10}");
System.out.println(flag);
其他
split(表达式)
String hobby = "抽烟,喝酒,烫头";
// 根据指定的分隔符 把字符串切割成为一个数组
String[] hobbys = hobby.split(",");
System.out.println(Arrays.toString(hobbys));
与其对应的方法 为 join 链接
concat(String str)
字符串拼接 相当于 +
replace(char oldChar, char newChar)
String name = "秦桧";
String name1 = name.replace("桧", "*");
System.out.println(name1);
trim()
String s = " Hello ";
// 去除前后空格 , 字符中间的空格 不能去除
System.out.println(s.trim());
toLowerCase()
toUpperCase()
String s = "Hello";
System.out.println(s.toLowerCase()); // hello
System.out.println(s.toUpperCase());// HELLO
案例
配合之上一章的 map 完成案例, 在控制台随机输入一个字符串,
打印该字符串每个字符以及该字符出现的次数
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个字符串");
String s = input.next();
// 假设 s = hello
// 统计s 每个字符出现的次数
/*
思路分析
1- 把 s 字符串 转换为 字符数组 [h,e,l,l,o]
2- 把数组中的每一个数据去字符串中查找, 每查找到一次计数器叠加
整体字符与该字符出现的次数 是 一一对应的, 最好是采用键值对的方式
*/
// 字符数组
char[] chars = s.toCharArray();
Map<Character,Integer> map = new HashMap<Character,Integer>();
// 遍历数组, 每找到一个字符 把累加器叠加
for(int i = 0 ; i < chars.length; i++){ // [h,e,l,l,l,o]
// map 默认是一个空的
// 当遍历到字符的时候 该字符和其出现的次数 添加到map中
if(map.containsKey(chars[i])){
// 如果该字符不是第一次出现 说明以前出现过, 需要在以前出现的次数的基础之上加 1
// 如果出现过, 先获取 之前出现过的次数
int count = map.get(chars[i]);
map.put(chars[i],count+1);
}else{
// 如果该字符第一次出现 在map 中添加 字符 出现 1
map.put(chars[i],1);
}
}
System.out.println(map);
}
StringBuffer
带有缓冲区功能的字符串
String 类的弊端分析
String s1 = "hello";
String s2 = s1 + "world";
// 内部运行流程
String 特点是 在字符串池创建对象, 一旦创建不能更改
在创建新对象的时候, 会先去常量池寻找, 有没有创建好的对象, 如果有, 直接使用, 如果没有创建新对象
当进行字符串拼接的时候, 因为一旦创建不能更改, 每一次拼接都会创建新对象,占用大量空间, 效率较低
字符串拼接案例
// 8万次字符串拼接 会花费多少时间
public static void t1(){
String s = "";
long old = System.currentTimeMillis();
for(int i = 0 ; i < 80000; i++){
s += i;
}
System.out.println(System.currentTimeMillis() - old); // 运行时间为 25000
}
缓冲区Buffer
StringBuffer
构造方法
StringBuffer(String str)
构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer()
构造一个没有字符的字符串缓冲区,初始容量为16个字符。
成员方法
append(很多类型 )
将 boolean参数的字符串表示附加到序列中。
String toString()
返回表示此顺序中的数据的字符串。
基本使用
StringBuffer stb = new StringBuffer(s);
stb.append("world");
stb.append(123);
stb.append(true);
System.out.println(stb);
使用StringBuffer 改写 字符串拼接8万次案例
public static void t3(){
StringBuffer s = new StringBuffer();
long old = System.currentTimeMillis();
for(int i = 0 ; i < 80000; i++){
s.append(i);
}
System.out.println(System.currentTimeMillis() - old); // 12
}
String 和 StringBuffer 对比
StringBuffer 带有缓冲区功能的字符串增强类
在执行大量字符串拼接时 , StringBuffer 效率远高于 String
StringBuilder
线程不安全的字符串缓冲区类
Date
构造方法
无参构造
Date date = new Date();
System.out.println(date);
// Tue Jul 23 12:04:16 CST 2019
有参
long currentTimeMillis = System.currentTimeMillis();
// 使用 毫秒数作为参数
Date date1 = new Date(currentTimeMillis);
System.out.println(date1);
方法
getTime()
Date date = new Date();
date.getTime(); // 返回当前时间毫秒数
System.currentTimeMillis(); // 效果相同
SimpleDateFormat
时间格式转换器
Date date = new Date();
System.out.println(date);
// Tue Jul 23 12:08:25 CST 2019
// 格式工厂
// 数控机床
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 默认格式 19-7-23 下午12:17
String s = sdf.format(date);
System.out.println(s);
语法标准
表达式 | 含义 |
---|---|
y | 年 |
M | 月 |
d | 日期 |
H | 小时 |
m | 分钟 |
s | 秒 |
日期转换成字符串
sdf.format(date);
字符串转换为日期
sdf.parse(日期格式的字符串)
Calendar
日历类
对象的获取方式
// Calendar 抽象方法
Calendar ca = Calendar.getInstance();
System.out.println(ca);
属性
Calendar ca = Calendar.getInstance();
// 获取年份
int year = ca.get(Calendar.YEAR);
System.out.println(year);
// 获取月份
int month = ca.get(Calendar.MONTH);
System.out.println(month); // month 也是从 0 开始计算的
// 获取日期
int day = ca.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
// 星期几
int week = ca.get(Calendar.DAY_OF_WEEK);
System.out.println(week); // 周天算一周中的第一天
方法
add
add(属性字段, 添加或减去的量)
ca.add(Calendar.YEAR,1);
ca.add(Calendar.MONTH,4);
ca.add(Calendar.DAY_OF_MONTH,10);
set
set(int field, int value)
将给定的日历字段设置为给定的值
set(int year, int month, int date)
设置日历字段中的值 YEAR , MONTH和 DAY_OF_MONTH 。
getTime()
Date time = ca.getTime();
getTimeInMillis()
案例
查看吴金响 来到这个世界多少天
// 获取当前时间毫秒数
// 获取老吴出生当天毫秒数
// 根据生日计算 来到世界多少天
Calendar ca = Calendar.getInstance();
ca.set(Calendar.YEAR,1998);
ca.set(Calendar.MONTH,10);
ca.set(Calendar.DAY_OF_MONTH,17);
// Date time = ca.getTime();
long birthday = ca.getTimeInMillis();
long now = System.currentTimeMillis();
System.out.println((now-birthday)/1000/60/60/24);
打印万年历
int year = 2008;
int month = 8;
// 打印该月 万年历, 设置日期时间为当月第一天
Calendar ca = Calendar.getInstance();
ca.set(year,month-1,1);
// 获取当月1 号是星期几
// 从周天开始计算的
int week = ca.get(Calendar.DAY_OF_WEEK);
// 定义日历表的表头
System.out.println("日\t一\t二\t三\t四\t五\t六\t");
for(int i = 1; i < week ; i++){
System.out.print(" \t");
}
// 循环打印日期
while(ca.get(Calendar.MONTH) == month-1){
System.out.print(ca.get(Calendar.DAY_OF_MONTH)+"\t");
if(ca.get(Calendar.DAY_OF_WEEK) == 7){
System.out.println();
}
// 当前日期 添加一天
ca.add(Calendar.DAY_OF_MONTH,1);
// 每到周六开始换行打印
}