base
String
final修饰的 不能继承 底层是final char[ ] 所以不可变的字符序列
存在常量池 常量池中不会存在相同内容的常量
1 | //s1和s2指向同一个 也体现了不可变性 |
2 | String s1 = "abc"; |
3 | String s2 = "abc"; |
4 | //创建了两个对象 一个在常量池 一个在堆里 value指向常量池 |
5 | String s3 = new String("abc"); |
6 | System.out.println(s1 == s2);//true 指向常量池的同一个 |
7 | System.out.println(s1.equals(s2));//String重写了equals 比较的实体内容 |
8 | System.out.println(s1 == s3);//false ==比较地址池 s3在堆里 s1在常量池里 |
9 | System.out.println(s1.equals(s3));//String重写了equals 比较的实体内容 |
String部分方法
// 创建字符串 字符串一旦初始化就不能改变
1 | String str = "123JavaSE"; |
// 获取字符串长度 length()
1 | System.out.println("字符串长度:"+str.length()); |
// 获取指定字符在字符串的位置 没有找到返回-1 indexOf(str)
1 | System.out.println("j在"+str.indexOf("j")+"位置上"); |
// 从指定位置开始找 indexOf(str,int)
1 | System.out.println("v后出现的a的位置:"+str.indexOf("a",str.indexOf("v"))); |
// 查找字符最后出现的位置 lastIndexOf(str)
1 | System.out.println("a最后出现的位置"+str.lastIndexOf("a")); |
// 截取字符串 subString(start,end) 包含头不包含尾 没有end直接截取到末尾
1 | System.out.println("截取字符串中的123:"+str.substring(0, 4)); |
2 | System.out.println("截取字符串中的javaSE:"+str.substring(3)); |
// 去除字符串两边的空格 trim()
1 | String str1 = " 123java "; |
2 | System.out.println("去除两边的字符串的空格:"+str1.trim()); |
// trim只能去掉字符串两边的字符 去掉所有字符可以用 replace方法
1 | String str2 = " 123 java"; |
2 | System.out.println("去除字符串的空格:"+str2.replace(" ", "")); |
// 查找字符串指定字符 charAt()
1 | System.out.println("字符串第3个字符是:"+str.charAt(2)); |
// 判断是否以某个字符结尾或者开始 startWith(str) endWith(str)
1 | System.out.println("是否以1开头"+str.startsWith("1")); |
2 | System.out.println("是否以a结尾"+str.endsWith("a")); |
// 将字符转为大写或者小写 toUpperCase() toLowerCase()
1 | System.out.println("原来的字符串"+str); |
2 | System.out.println("将字符转为大写:"+str.toUpperCase()); |
3 | System.out.println("将字符转为小写:"+str.toLowerCase()); |
// 将其它数据类型转换为字符串 静态方法 String.valueOf()
1 | int i = 6; |
2 | System.out.println("将i转换为字符串进行运算:"+String.valueOf(i)+1); |
String涉及到编码问题 使用byte[ ]时指定字符集
编码和解码的字符集要一致 不然要出现乱码
1 | String s1 = "还要继续努力"; |
2 | //字符串转换成字节数组 |
3 | // byte[] bytes = s1.getBytes(); |
4 | // System.out.println(Arrays.toString(bytes)); |
5 | // 字节数组转换为字符串 |
6 | // String string = new String(bytes); |
7 | // System.out.println(string); |
8 | try { |
9 | //编码时修改字符集 |
10 | byte[] bytes = s1.getBytes("gbk"); |
11 | // System.out.println(new String(bytes)); |
12 | //解码时修改字符集 |
13 | System.out.println(new String(bytes,"gbk")); |
14 | } catch (UnsupportedEncodingException e) { |
15 | e.printStackTrace(); |
16 | } |
String练习
编写一个程序,要求用户输入一个网站消息
格式可以如下:1www.baidu.com 2www.baidu.con.cn 3http://www.baidu.com
然后经过处理,输出域名,如:baidu
1 | public class StringTest { |
2 | public static void main(String[] args) { |
3 | Scanner scanner = new Scanner(System.in); |
4 | System.out.println("请输入一个网站"); |
5 | String str = scanner.nextLine(); |
6 | //获取第一个字符的位置 |
7 | int start = str.indexOf(".")+1; |
8 | //获取第二个字符的位置 以第一个.开始找下一个.的位置 |
9 | int end = str.indexOf(".", start); |
10 | //截取正方形得到域名 |
11 | System.out.println("域名是:"+str.substring(start, end)); |
12 | } |
13 | } |
字符串拼接方式赋值的对比
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值就在常量池中
StringBuffer And StringBuilder
都是可变字符序列的 底层都是char [] 实现 长度是16
StringBuffer线程安全的 效率慢 多线程使用
StringBuilder 线程不安全的 效率高 单线程或不涉及到安全问题时使用
常用方法:
增加 append()
删除 delete()
查找 charAt()
改变 charSet()
插入 insert
三者转换
String 使用StringBuilder或者StringBuffer构造器转换
StringBuilder或者StringBuffer 使用toString方法转换
对比String、StringBuffer、StringBuilder三者的执行效率
从高到低排列:StringBuilder > StringBuffer > String