0x01 java.lang.String
String是不可变的,且在创建String的时候,JVM会在常量池中保存一份引用,当再次创建相同的String时,JVM会从常量池中寻找是否存在引用,存在则将引用给新的String,不存在则创建!常量池在JDK1.7之后放入到堆中了
- 构造方法
- new String() 初始化一个空的字符串对象
- new String(String original) 初始化一个新建的String对象,使其表示一个与参数相同的字符序列
- new String(byte[] bytes) 使用默认字符集编码指定的byte数组 创建一个新的String对象
- new String(byte[] bytes,Charset charset) 通过指定字符集的byte数组,创建一个新的String对象
- String(byte[] bytes, int offset, int length, Charset charset) 通过指定的字符集的byte数组 从offset处开始创建到length处的String对象 长度为length
代码示例:
//创建一个空的字符串对象
String str = new String();
//创建一个指定字符序列的字符串对象
String s5 = new String("ABC");
//通过默认字符集的byte数组创建一个字符串对象
byte[] data = new byte[32];
String password = new String(data);
//通过指定字符集的byte数组,创建一个新的字符串对象
byte[] data = new byte[32];
String str = new String(data,"utf-8");
//通过指定的字符集的byte数组 从offset处开始创建到length处的String对象 长度为length
byte[] data = new byte[1024];
String str = new String(data, 0, 12,"utf-8");
-
方法
注意:以下方法可直接使用,不用自建 。但使用下列方法的大前提是导入相关类且存在字符串引用,如:
import java.util.Scanner; //导入类包
String str = "AbCdEfghIjKlmnOpqRsTuvwXYz "; //创建字符串引用- int length() 返回此字符串的长度
- char charAt(int index) 返回指定索引处的char值 ,返回的是个字符(char),不是字符串
- int indexOf(String str) 返回字符串第一次匹配时的索引下标
- int indexOf(String str,int fromIndex) 返回字符串第一次匹配时的索引下标,从从指定的索引下标开始
- int lastIndexOf(String str) 返回字符串最后一次匹配的索引下标
- boolean startsWith(String prefix) 判断此字符串是否是以指定字符前缀开始
- boolean endWith(String suffix) 判断此字符串是否是以指定字符后缀结尾
- char[] toCharArray() 将此字符串转换为一个新的字符数组
- String toUpperCase() 将此字符串中所有的英文字母转换为大写后返回
- String toLowerCase() 将此字符串中所有的英文字母转换为小写后返回
- String substring(int beginIndex) 将此字符串从索引beginIndex开始截取,返回到字符串结尾的一个子字符串
- String substring(int beginIndex,int endIndex) 将此字符串从索引beginIndex开始截取,返回到endIndexc处结尾的一个子字符串
- String trim() 返回此字符串去除空字符之后的结果
- String toString() 返回此字符串对象本身
- boolean matches(String regex) 判断此字符串是否匹配给定正则表达式
注意:
默认从边界位置开始 完整的、全部的 匹配正则表达式,^和$ 不写也可,且方法内部:
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
调用了Pattern类的matches方法,不用再自行创建一个Pattern类 ,且String大部分与正则表达式 的 方法内部都有调用Pattern类的方法- String replaceAll(String regex,String replacement) 使用给定的字符序列替换此字符串所有匹配字面序列值
- String split(String regex) 使用给定的正则表达式,匹配,拆分字符串
- byte[] getBytes() 使用默认字符集将String编码为byte序列,将结果储存到一个新的byte[] 数组中
- byte[] getBytes(Charset charset) 使用指定字符集将String编码为byte序列,将结果储存到一个新的byte[] 数组中
- boolean equals(Object anObject) 判断对象和此字符串是否相等
代码示例:
public static void main(String[] args) {
StringMethodDemo demo = new StringMethodDemo();
System.out.println("-----------------常用String方法演示------------我是分割线------------------------------");
demo.commonMethod();
System.out.println("-------------------查找字符串出现------------我是分割线------------------------------");
demo.findStr();
System.out.println("--------------------url截取hsot---------我是分割线------------------------------");
demo.subUrl();
System.out.println("--------------------字符串遍历----------我是分割线------------------------------");
demo.traversalString();
System.out.println("--------------------字符串去除空格--------------我是分割线------------------------------");
demo.trimStrSpace();
System.out.println("--------------------检测文件-------我是分割线------------------------------");
demo.checkFile();
}
public void commonMethod(){
String str = "ancbaksakhfaka";
//String.charAt(): 按照下标 返回指定索引处的 char 值。
System.out.println("str的第14个字符为:"+str.charAt(13));
//String.length(): 返回字符串的长度。
System.out.println("str的长度为:"+str.length());
//String.indexOf(): 返回字符串第一次出现的位置索引下标.
int a = str.indexOf("k");
System.out.println("k在str中第一次出现的索引下标为:"+a);
//String.lastIndexOf(): 返回字符串最后一次出现的位置索引下标.
a = str.lastIndexOf("a");
System.out.println("a在str中最后一次出现的索引下标为:"+a);
str= "deMo.docX";
String UpFile = str.toUpperCase();
System.out.println("转换为大写之后的字符串:"+UpFile);
String LowerFile = str.toLowerCase();
System.out.println("转换为小写之后的字符串:"+LowerFile);
String file = "demo.docx";
LowerFile = file.toLowerCase();
System.out.println("比较和源字符串是否相同:"+ file == LowerFile);
}
public void traversalString(){
/** 遍历字符串 */
String str = "你好Java";
for(int i=0;i<str.length();i++){
System.out.print(str.charAt(i)+" ");
System.out.println((int)str.charAt(i));
}
}
public void subUrl(){
/** url截取 host主机 和 文件名 */
String url ="http://www.google.cn/cate/category.html";
String host = url.substring(7,url.indexOf("/",7));
String file_name = url.substring(url.lastIndexOf("/")+1);
System.out.println(host);
System.out.println(file_name);
}
public void trimStrSpace(){
/** trim() 当且仅当 字符串的开始和末尾有空字符时去除 中间的空字符无法去除 */
String chinese = " 今天的我很困 , 没有办法我只能打瞌睡了 ";
System.out.println(chinese.trim()+"\n");
}
public void findStr(){
String str = "啊啊啊啊啊啊啊啊";
/** 查找指定开头的字符串 */
boolean b = str.startsWith("啊");
System.out.println(b);
b = str.startsWith("今天");
System.out.println(b);
b = str.startsWith("");
System.out.println(b);
}
/** 验证文件正确性*/
public void checkFile(){
String file = "demo.docx";
/** 判断 file是否以 .png 结尾 */
if(file.endsWith(".png")){
System.out.println("这是图片文件");
}else{
System.out.println("这不是图片文件");
}
file = "background.Png";
/**将此字符串中所有的大写英文字母转换为小写 */
if(file.toLowerCase().endsWith(".png")){
System.out.println("图片!");
}else {
System.out.println("非图片!");
}
String url = "https://www.baidu.com/index.php";
/** 判断 url 是否以 https://开头 */
if(url.startsWith("https://")){
System.out.println("安全加密通信");
}else {
System.out.println("非安全的通信");
}
}
/**
* boolean equals(Object anObject) 判断对象内容否正确
*/
public class checkUserInput {
public static void main(String[] args) {
//创建接收器
Scanner scan = new Scanner(System.in);
//预定义一个用户名和密码
String username,pwd;
do{
//接收控制台输入的用户名
System.out.println("请输入用户名");
username = scan.nextLine();
//接收控制台输入的密码
System.out.println("请输入密码");
pwd = scan.nextLine();
//当用户名和密码不相同时 提示登录失败,相同时提示登录成功
if(!"熊大".equals(username) || !"123".equals(pwd))){
System.out.println("登录失败!");
}else{
System.out.println("登录成功");
//打桩
System.out.println("用户名:"+username+" 密码 :"+pwd);
}
//当用户名和密码不相同时,循环输入,直到相同为止
}while(!"熊大".equals(username) || !"123".equals(pwd));
}
}
0x02 正则表达式相关知识:
正则表达式-1.png
正则表达式-2.png
正则表达式-3.png
正则表达式-4.png
正则表达式-5.png
正则表达式-6.png
正则表达式-7.png
正则表达式-8.png
正则表达式-9.png
有关正则表达式方法代码示例:
java.util.regex.Pattern
/**
* 正则匹配演示
* Pattern 正则表达式的编译表示形式
* 指定为字符串的正则表达式必须首先编译为此类的实例。然后可将得到的模式用于创建Matcher对象,
* 依照正则表达式。该对象可以与任意字符序列匹配。
* 执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
*
*/
public class PatternDemo {
public static void main(String[] args) {
String regex = "hello[0-9]";
String str = "hello1";
test(regex,str);
}
public static void test(String regex,String str) {
//创建一个正则表达式对象
Pattern p = Pattern.compile(regex);
//创建一个匹配器
Matcher m = p.matcher(str);
//判断匹配器是否匹配正则
boolean b = m.matches();
System.out.println(b);
//输出匹配结果
System.out.println(m.group());
}
}
java.lang.String
public class StringMatchesDemo {
/**
* String 字符串支持正则表达式的相关方法之一:
* boolean matches(String regex)
* 使用给定的正则表达式判断当前字符串是否符合格式要求
*
* "hshshakssj@ss.cn"
* [a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
*
*/
public static void main(String[] args) {
//定义一个 “正确的” email
String email = "hshshakssj@ss.cn";
//定义一个错误的email
String etc = "hahahah";
//构建匹配正则表达式
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
//判断 “正确的” email是否和正则表达式匹配 并使用一个boolean 变量存储
boolean b = email.matches(regex);
//判断email是否“正确”
if(b){
System.out.println(email+":匹配邮箱成功");
}else {
System.out.println(email+":匹配失败");
}
//判断错误的 email 是否和正则表达式匹配 并使用一个boolean 变量存储
b = etc.matches(regex);
//判断email是否“正确”
if(b){
System.out.println(etc+":匹配邮箱成功");
}else {
System.out.println(etc+":匹配失败");
}
}
}
/**
* String 字符串支持正则表达式的相关方法之二:
* String repleaseAll(String regex,String str)
* 将当前字符串中,满足正则表达式的部分替换为给定字符串
*
*/
public class StringRepleaseAllDemo {
public static void main(String[] args) {
String string = "abc123def456hik";
/*
* 将当前字符串中的数字部分替换为#NUMBER#
*/
string = string.replaceAll("[0-9]+", "#NUMBER#");
//string = string.replaceAll("[0-9]", "#NUMBER#");
//string = string.replaceAll("[a-z]+", "#char#");
System.out.println(string);
//用户输入信息 “礼貌” 河蟹
//创建一个接受器
Scanner scan = new Scanner(System.in);
//构建匹配正则表达式
String regex = "(wqnmlgb|nc|dsb|djb|mmp|tmd|nmsl|bitch|hmp|nmj)";
System.out.println("输入框:");
//将控制台输入的接受的到数据转换为小写
String message = scan.next().toLowerCase();
//匹配到正则表达式的字符串 替换为 *** 【河蟹神兽重出江湖啦~~】
message = message.replaceAll(regex, "***");
//输出信息
System.out.println(message);
}
}
/**
* String 字符串支持正则表达式的相关方法之三:
* String[] split(String regex)
* 将当前字符串按照满足正则表达式的部分进行拆分,并返回
* 拆分后的每段内容
*/
public class StringSplitDemo {
public static void main(String[] args) {
String string = "abc123def456hik";
/*
* 按照数字部分进行拆分,得到所有的字母部分
*/
String[] arr = string.split("[0-9]+");
//String[] arr = string.split("[0-9]"); 每个数字截一段
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
/* 上传文件统一重命名 :上传时间+文件后缀*/
//假定一个上传的图片对象
String imageName = "123.jpg";
//按照 . 处进行拆分 得到一个 图片名称 和图片后缀的 字符串数组
String[] names = imageName.split("\\.");
//获取格林威治时间 将其与拆分的图片后缀组合 重命名操作 将其赋给imageName
imageName = System.currentTimeMillis()+ "." + names[1];
//输出图片名称
System.out.println(imageName);
////按照 . 处进行拆分 得到一个 图片名称 和图片后缀的 字符串数组
names = imageName.split("\\.");
//记录图片的名称即上传时间
long time = Long.parseLong(names[0]);
//转化时间戳
Date date = new Date(time);
//输出时间戳
System.out.println(date);
}
}
注意:
在正则表达式中 “ . ”表示匹配任意一个字符,使用文件后缀匹配“ . ”时, 要被转义,并且“ \ ”也要被转义,否则会报错即 "\\."
0x03 java.lang.StringBuilder
- 构造方法
- new StringBuilder() 创建一个不带任何字符的字符串生成器,其初始容量为16个字符
- new StringBuilder(String str) 创建一个新的字符串生成器,并初始化为指定的字符串内容
代码示例:
//空的字符串引用
StringBuilder str = new StringBuilder();
//指定字符串引用
StringBuilder str = new StringBuilder("hello world");
-
方法
注意:
以下方法可以直接使用,不用自建,但其使用大前提为导入相关类且存在字符串引用
- int capacity() 返回此字符序列的容量,此时容量相当于字符序列的长度(length)
- StringBuilder insert(int offset,Object anObject) 将anObject插入到此字符串中指定的offse处
- StringBuilder append()以及重载的append(Object anObject) 将anObject 追加到字符序列(字符串)的末尾
注意:anObject 代表众多的对象和变量 (包括但不限于boolean、char、char[]、String)等
- StringBuilder delete(int start,int end) 移除此字符序列的从start位置开始到end结束的字符
代码示例:
public class StringBuilderMethodDemo {
/**
* StringBuilder 常用 API方法 演示
* 1. StringBuilder 是可变字符串,其内部的字符数组容量初始为16,
* 2. 后续的操作,都可以对这个数组内容进行修改,
* 3. 当容量不过的时候,会自动进行扩容,扩容规则1倍+2
*
* String对象中也封装了char数组,但是其数组内容在创建之后不可改变
*
* 用于检测StringBuilder内部字符数组的容量,大于等于数组长度
* .capacity()
*
* 添加字符 在当前字符串的末尾
* .append()
*
* 从开始逐个往后按照索引,在指定位置删除字符
* .delete()
*
* 开始逐个往后按照索引,在指定位置插入字符
* .insert()
*/
public static void main(String[] args) {
StringBuilderMethodDemo str = new StringBuilderMethodDemo();
str.test();
}
public void test(){
//创建一个空的字符序列
StringBuilder str = new StringBuilder();
//capacity 容量,就是StringBuilder中char数组大小
//capacity() 方法用于检测StringBuilder内部字符数组的容量
//由于当长度超过数组容量的时候,会进行自动扩容,
//所以这个数组的容量总会大于等于数组长度
int size = str.capacity();
System.out.println(size);
//追加字符串
str .append("采蘑菇的小")
.append("姑娘今天上山")
.append("去采蘑菇的时候")
.append("碰到了")
.append("熊大");
System.out.println(str);
//记录容量(长度)
size = str.capacity();
System.out.println(size);
//删除指定位置的字符
str .delete(1,3)
//插入指定字符
.insert(1,"老师");
System.out.println(str);
}
}
网友评论