String类及常用方法

String类及常用方法


一、对于String常见的面试题?

String s = new String(“hello”);创建了几个对象?

/**
 * String s = new String("hello");创建了几个对象
 * 答:两个
 * 在string池中创建”hello“字面量对象(在双引号中会创建对象),并存储在常量池
 *  遇到new在内存上创建String对象”hello“
 *  局部变量指向new String
 */
String s1 = "111";//当jvm看到"Hello",在string池创建string对象存储它,并将他的引用返回给s
String s2 = new String("hello");//复用常量池中创建的hello字面量对象
System.out.println(s1 == s2);//false,两个引用地址指向不同的地址
/** 在实际应用中,String比较相等一般是比较字符串内容是否相等
 * 因此我们需要使用eyuals()方法来比较俩个字符串的内容是否相同 */
String s3 = "hello";
System.out.println(s3.equals(s2));//true

二、String常用的方法

1. length():专门用于获取字符串长度(个数)
/**
 * int length() 方法:专门用于获取字符串长度(个数)
 */

String str = "我爱Java!";
System.out.println(str.length());//6
2. trim():去除当前字符两边的空白字符
/**
 * String trim():
 * 去除当前字符两边的空白字符
 * 字符串str是不变的,str.trim()是重新创建了一个不含空格的新对象,并返回新对象
 * 应用场景:注册表单输入
 */

String str = "          hello world    ";
System.out.println(str);//          hello world
str = str.trim();//去除str两边的空白字符,并将去除之后的新对象存储到str中
System.out.println(str);//hello world
3. toUpper()/toLowerCase():将当前的字符串中的英文部分转换为全部 大/小写
/**
 * String toUpperCase():
 * 将当前的字符串中的英文部分转换为全部 大写
 *
 * String toLowerCase()
 * 将当前的字符串中的英文部分转换为全部 小写
 *
 * 应用场景:验证码随机生成,将输入的字符串统一转为符合开发要求的 大/小写
 */
String str = "我爱Java";
String upper = str.toUpperCase();//将str中的英文部分转换为大写,并存入upper
String lower = str.toLowerCase();//将str中的英文部分转换为小写,并存入lower

System.out.println(upper);//我爱JAVA
System.out.println(lower);//我爱java
4. startsWith()/endswith():判断当前字符串是否是以给定的字符串(s)开始/结束的
/**
 * boolan startsWith(String s)
 *  判断当前字符串是否是以给定的字符串(s)开始的
 *
 * boolean endsWith(String s)
 *  判断当前字符串是否是以给定的字符串(s)开始的
 *  应用场景:判断照片格式是否正确
 */
String str = "think in java";//编程思想(经典书籍)
boolean starts = str.startsWith("think");
System.out.println(starts);//true

boolean ends = str.endsWith(".png");//判断石头人是否以.png结尾的
System.out.println(ends);//false
5. charAt():返回当前字符串指定位置(index)上的字符----根据下标位置找字符
/**
 * char charAt(int index)
 * 返回当前字符串指定位置(index)上的字符----根据下标位置找字符
 * 应用场景:从一个字符串中随机选取n个字符
 */
String str = "think in java";
char c = str.charAt(9);
char c1 = str.charAt(3);
System.out.println(c);//j
System.out.println(c1);//n
6. ndexOf():检索给定字符串(s)在当前字符串中第一次/最后一次出现的位置
/**
 * int indexOf(String s):
 *  检索给定字符串(s)在当前字符串中第一次出现的位置
 *
 * int lastIndexOf(String s):
 *  检索给定字符串(s)在当前字符串中最后一次出现的位置
 *
 *  应用场景:经常和subString()一起用
 */
String str = "thinking in java";
int index = str.indexOf("java");//从头(下标为0的位置)开始检索java在str中第一次出现的位置
int index2 = str.indexOf("in" , 3);//从下标为3的位置开始检索in第一次出现的位置
int index3 = str.indexOf("abc");//如果在字符串str中找不到的情况下 ,输出 -1
System.out.println(index);//12
System.out.println(index2);//5
System.out.println(index3);

int last = str.lastIndexOf("in");
System.out.println(last);//9
7. substring():截取当前字符串中指定范围内的字符串
/**
 * String substring(int start , int end):
 * 截取当前字符串中指定范围内的字符串(含头不含尾:包含start位置但不包含end位置的字符)
 *
 * 适用场景:
 */
String str = "www.tedu.cn";
String name = str.substring(4 , 8);//tedu
System.out.println(name);

int start = str.indexOf(".") + 1;//获取第一个点之后的下标4
int end = str.lastIndexOf(".");//获取最后一个点的下标8
String name2 = str.substring(start , end);//截取下标4-7之间的字符
System.out.println(name2);//tedu

//重载用法
String name3 = str.substring(4);//截取从下表4开始一致到最后的字符
System.out.println(name3);//tedu.cn
8. static String valueOf():是一个静态方法,将其他数据类型转换为string类型
/**
 * static String valueOf(数据类型:a):
 * 是一个静态方法,将其他数据类型转换为string类型
 *
 * 应用场景:数组转化为字符串常用
 */

int a = 123;
double b = 123.445;
char[] arr = {'1' , 'a' , '3'};
String str = String.valueOf(a);     //将int型的变量a转换为string类型并复制给str
String str2 = String.valueOf(b);    //将double型的变量b转换为string类型并复制给str2
String str3 = 123.1 + "";
String str4 = String.valueOf(arr);  //将数组型的变量arr转换为string类型并复制给str4


System.out.println(str);//123--字符串类型
System.out.println(str2);//123.445--字符串类型
System.out.println(str3);//123.1--字符串类型
System.out.println(str4);//1a3--字符串类型

9. boolean contains() 方法用于判断字符串中是否包含指定的字符或字符串。chars – 要判断的字符或字符串。如果包含指定的字符或字符串返回 true,否则返回 false。

三、正则表达式:

1. 用于描述字符串的内容格式,使用他通常用于匹配一个字符是否符合格式要求
2. 正则表达式的语法:
1.[]:表示一个字符,该字符可以是[]中指定的内容
  例如:
  [abc]:这个字符可以是a或b或c
  [a-z]:表示任意一个小写字母
  [a-zA-Z]:表示任意一个字母
  [a-zA-Z0-9]:表示任意一个字母数字
  [a-zA-Z0-9_]:表示任意一个数字字母下划线
  [^abc]:该字符只要不是a或b或c
2.预定义字符:
  .:表示任意一个字符,没有范围限制
  \d:表示任意一个数字,等同于[0-9]
  \w:表示任意一个单词字符,等同于[a-zA-Z0-9_]----单词字符指字母、数字和_
  \s:表示任意一个空白字符
  \D:不是数字
  \W:不是单词字符
  \S:不是空白字符
3.量词:
  ?:表示前面的内容出现0-1次
    例如: [abc]? 可以匹配:a 或 b 或 c 或什么也不写
          但是不能匹配:m或aaa
  +:表示前面的内容最少出现1次
    例如: [abc]+ 可以匹配:b或aaaaaaaaaa...或abcabcbabcbabcba....
          但是不能匹配:什么都不写 或 abcfdfsbbaqbb34bbwer...
  *:表示前面的内容出现任意次(0-多次)---匹配内容与+一致,只是可以一次都不写
    例如: [abc]* 可以匹配:b或aaaaaaaaaa...或abcabcba....或什么都不写
          但是不能匹配:abcfdfsbbaqbb34bbwer...
  {n}:表示前面的内容出现n次
      例如: [abc]{3} 可以匹配:aaa 或 bbb 或 aab 或abc 或bbc
           但是不能匹配: aaaa 或 aad
  {n,m}:表示前面的内容出现最少n次最多m次
        例如: [abc]{3,5} 可以匹配:aaa 或  abcab 或者 abcc
        但是不能匹配:aaaaaa 或 aabbd
  {n,}:表示前面的内容出现n次以上(含n次)
       例如: [abc]{3,} 可以匹配:aaa 或 aaaaa.... 或 abcbabbcbabcba....
            但是不能匹配:aa 或 abbdaw...             
4.()用于分组,是将小括号里面的内容看做是一个整体     
  例如: (abc){3} 表示abc整体出现3. 可以匹配abcabcabc
        但是不能匹配aaa 或abcabc
        (abc|def){3}表示abc或def整体出现3.
        可以匹配: abcabcabc 或 defdefdef 或 abcdefabc
        但是不能匹配abcdef 或 abcdfbdef
3.String支持的正则表达式的相关方法
1.boolean matches():
/**
 * boolean matches(String string) 匹配
 * 使用给定的正则表达式验证当前字符串的格式是否符合要求,若符合则返回true,否则返回false
 * 邮箱正则表达式:[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+)+
 * 注意:\.中的\时正则表达式中的转义符,
 * \\.中的第一个\,是Java的转义符,是转移正则表达式中的\
 */

String email = "wangkj@tedu.cn";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
boolean match = email.matches(regex);
if (match){
    System.out.println("邮箱格式正确");
}else{
    System.out.println("邮箱格式错误");
}

2.String replaceAll():
/**
 * String replaceAll(String regex , String s):替换
 * 将当前字符串中满足正则表达式(regex)的部分给替换为给定的字符串(s)
 * 引用场景:不文明用于替换
 */

String line = "ufb544364uiwefuBIUHUbuki";
line = line.replaceAll("[0-9]+" , "*");
System.out.println(line);//ufb*uiwefuBIUHUbuki
3.String split() :
/**
 *String[] split(String regex)
 * 当前字符按照满足正则表达式(regex)的部分进行拆分,将拆分除的以String数组(String[])的形式返回
 */
String str = "ab.c123.def.g345h.uo";
String[] data = str.split("[0-9]+");//按照数字拆分
String[] data1 = str.split("\\.");//按照.拆分
String[] data2 = str.split("[0-9]");//与data相比无+号比较
System.out.println(Arrays.toString(data));//[ab.c, .def.g, h.uo]
System.out.println(Arrays.toString(data2));//[ab.c, , , .def.g, , , h.uo]
System.out.println(Arrays.toString(data1));//[ab, c123, def, g345h, uo]


//最开始就是可拆分项(.),那么数组的第一个元素为空字符串("")
//如果连续两个(两个以上)可拆分项,那么中间也会拆除一个空字符串("")
//如果末尾连续多个可拆分想,那么拆除的空字符串被忽略
String str2 = ".1111.4535.....2332......";
String[] data3 = str2.split("\\.");
System.out.println(Arrays.toString(data3));//[, 1111, 4535, , , , , 2332]

四、StringBuilder:

  • StringBuffer和StringBuilder用法基本一致,不详细说;
  • 由于string是不变对象 ,每次修改内容都会创建新的对象,执行的效率会很低;因此string不适合频繁修改操作,为解决这个问题,java提供了StringBuilder类
  • StringBuilder是专门 用于修改字符串的一个类,内部维护一个可变的char数组,所作操作总都是在这个数组基础之上纪念性的,修改速度、性能优秀,并且提供了修改字符串的常见方法(增删改查)
/**
 *  String不适合频繁的修改内容(效率第)--------for循环下的 string+i;string是不变对象 ,每次修改内容都会不断的创建新的对象,执行的效率会很低
 */

//StringBuilder的创建方式:
StringBuilder builder1 = new StringBuilder();//创建一个空的字符串("")
StringBuilder builder2 = new StringBuilder("abc");//创建一个abc串("abc")

String str = "abc";
//创建一个abc串("abc")/或者所将String类型转换为StringBuilder类型/或者是将str的内容复制到builder3中
StringBuilder builder3 = new StringBuilder(str);
String str2 = builder3.toString();//将StringBuilder类型转换为String类
StringBuilder常用方法:
  1. append():增加内容,在末尾追加
  2. delete():删除内容,替换部分内容(含头不含为)
  3. replace():替换内容
  4. insert():插入内容
String str = "好好学习Java";
StringBuilder builder = new StringBuilder(str);

//append():追加内容---在末尾追加
builder.append(",为了找个好工作");
System.out.println(builder);//好好学习Java,为了找个好工作

//replace():替换部分内容(含头不含尾)
//将下标为9-16的内容替换为---就是为了改变世界
builder.replace(9 , 16 , "就是为了改变世界");
System.out.println(builder);//好好学习Java,就是为了改变世界
builder.replace(9 , 12 , "哈哈哈哈哈哈哈");
System.out.println(builder);//好好学习Java,哈哈哈哈哈哈哈了改变世界

//delete():删除部分内容,含头不含尾
builder.delete(0,8);//删除下标0-7的字符
System.out.println(builder);//,不是为了做慈善而是为了改变世界

//insert():插入内容
builder.insert(0 , "活着");
System.out.println(builder);//活着,不是为了做慈善而是为了改变世界

五、补充

  1. 数组是length属性,字符串是length()方法
  2. 字符串内容若需要查看,那建议 用String---------实际应用中一般都是查看字符串;若需要频发修改,那建议用StringBuilder
  3. StringBuffer和StringBuilder的区别:
  • StingBuilder:非线程安全的,并发处理的,性能稍快 ------一般使用StringBuilder
  • StringBuffer:线程安全的,同步处理的,性能稍慢
  1. getter和setter数据私有,设计getter和setter的原因:
    • 很多框架都是基于getter/setter来配置获取数据的,是一种行为标准
    • getter/setter时可以堆数据进行控制,而public权限无法对数据进行控制(如,当满足条件是对变量进行赋值)
  2. 超类和派生类中竟太快和构造方法的执行顺序:
  • 先走超类的静态快、
  • 再走派生类静态块、
  • 再走超类构造方法、
  • 再走派生类构造方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值