wordpress网站有多大,wordpress 多久,信邦建设工程有限公司网站,织梦做淘宝客网站视频教程#1024程序员节 | 征文# 下面就让博主带领大家一起解决心中关于String类的疑问吧~~~
1.字符串构造#xff1a;
第一种和第二种#xff08;有一定的区别#xff0c;在常量池上#xff09;
public static void main(String[] args) {
// 使用常量串构造
String s1 h…#1024程序员节 | 征文# 下面就让博主带领大家一起解决心中关于String类的疑问吧~~~
1.字符串构造
第一种和第二种有一定的区别在常量池上
public static void main(String[] args) {
// 使用常量串构造
String s1 hello;
System.out.println(s1);// 直接newString对象
String s2 new String(hello);
System.out.println(s1);// 使用字符数组进行构造
char[] array {h,e,l,l,o};
String s3 new String(array);
System.out.println(s1);
}
其他方法需要用到时大家参考Java在线文档 String类在线文档
每个成员里面都有这两个变量
两个String方法
1和数组的长度属性array.length不一样String的s1.length是一个方法
2isEmpty是判断字符串长度是否为0要是空指针可就要报空指针异常了
public class StringTest {public static void main(String[] args) {
// s1和s2引用的是不同对象 s1和s3引用的是同一对象String s1 new String(hello);String s2 new String(world);String s3 s1;System.out.println(s1.length()); // 获取字符串长度---输出5System.out.println(s1.isEmpty()); // 如果字符串长度为0返回true否则返回falseString s4 null;
// System.out.println(s4.isEmpty());}
}
这样获得长度也可以
// 打印hello字符串(String对象)的长度
System.out.println(hello.length());
2String对象的比较
2.1:equals比较以及常量池的一些知识 public static void main(String[] args) {String s1 new String(hello);String s2 new String(hello);String s3 new String(Hello);
// s1、s2、s3引用的是三个不同对象因此比较结果全部为falseSystem.out.println(s1 s2); // falseSystem.out.println(s1 s3); // false
//String类重写了equals方法只要内容一样就相等System.out.println();System.out.println(s1.equals(s2)); // trueSystem.out.println(s1.equals(s3)); // falseSystem.out.println();
//但是这么比较呢String s4 hello;String s5 hello;System.out.println();}
这就不得不涉及到常量池的概念了现在只能懵懂的了解一下
2.2int compareTo(String s) 方法: 按照字典序进行比较
与equals不同的是equals返回的是boolean类型而compareTo返回的是int类型。具体比较方式
1. 先按照字典次序大小比较如果出现不等的字符直接返回这两个字符的大小差值
2. 如果前k个字符相等(k为两个字符长度最小值)返回值两个字符串长度差值
一个字符大小差值一个长度差值
public static void main(String[] args) {
String s1 new String(abc);
String s2 new String(ac);
String s3 new String(ABc);
String s4 new String(abcdef);
System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同输出长度差值 -3
}2.3int compareToIgnoreCase(String str) 方法
与compareTo方式相同但是忽略大小写比较
public static void main(String[] args) {
String s1 new String(abc);
String s2 new String(ac);
String s3 new String(ABc);
String s4 new String(abcdef);
System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1
System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0
System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同输出长度差值 -3
}3. 字符串查找
字符串查找也是字符串中非常常见的操作String类提供的常用查找的方法
方法功能 char charAt(int index) 返回index位置上字符如果index为负数或者越界抛出 IndexOutOfBoundsException异常 int indexOf(int ch) 返回ch第一次出现的位置没有返回-1 int indexOf(int ch, int fromIndex) 从fromIndex位置开始找ch第一次出现的位置没有返回-1 int indexOf(String str) 返回str第一次出现的位置没有返回-1 int indexOf(String str, int fromIndex) 从fromIndex位置开始找str第一次出现的位置没有返回-1 int lastIndexOf(int ch) 从后往前找返回ch第一次出现的位置没有返回-1 int lastIndexOf(int ch, int fromIndex) 从fromIndex位置开始找从后往前找ch第一次出现的位置没有返 回-1 int lastIndexOf(String str) 从后往前找返回str第一次出现的位置没有返回-1 int lastIndexOf(String str, int fromIndex) 从fromIndex位置开始找从后往前找str第一次出现的位置没有返 回-1 4转换
4.1.字符串和数字转化 public static void main(String[] args) {// 数字转字符串String s1 String.valueOf(1234);String s2 String.valueOf(12.34);String s3 String.valueOf(true);String s4 String.valueOf(new Student(lisi, 18));System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4);System.out.println();
// 字符串转数字
// 注意Integer、Double等是Java中的包装类型这个后面会讲到int data1 Integer.parseInt(1234);double data2 Double.parseDouble(12.34);System.out.println(data1);System.out.println(data2);}
String类对于这些转换字符串的方法进行了重载处理
4.2. 大小写转换
public static void main(String[] args) {
String s1 hello;
String s2 HELLO;
// 小写转大写
System.out.println(s1.toUpperCase());
// 大写转小写
System.out.println(s2.toLowerCase());
}
4.3.字符串和数组的转换 public static void main(String[] args) {String s hello;
// 字符串转数组char[] ch s.toCharArray();for (int i 0; i ch.length; i) {System.out.print(ch[i]);}System.out.println();
// 数组转字符串String s2 new String(ch);//或者你俩不太一样String s3 Arrays.toString(ch);System.out.println(s2);System.out.println(s3);}
4.4格式化输入字符串
public static void main(String[] args) {
String s String.format(%d-%d-%d, 2019, 9,14);
System.out.println(s);
}
4.5字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据可用的方法如下
方法功能 String replaceAll(String regex, String replacement) 替换所有的指定内容 String replaceFirst(String regex, String replacement) 替换首个内容 String str abbbbbababab ;System.out.println(str.replaceAll(ab, ));
//这个替换也是不是在原有的基础上进行替换而是产生了新的对象System.out.println(str.replaceFirst(ab, ));
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串 4.6字符串拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下
方法功能 String[] split(String regex) 将字符串全部拆分 String[] split(String regex, int limit) 将字符串以指定的格式拆分为limit组 String str hello world hello ;String[] result str.split( ) ; // 按照空格拆分for(String s: result) {System.out.println(s);}
将字符串以指定的格式拆分为limit组
String str hello world hello bit ;
String[] result str.split( ,2) ;
for(String s: result) {
System.out.println(s);
}
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.
代码示例: 拆分IP地址
public static void main(String[] args) {String str 192.168.11 ;String[] result str.split(\\.) ;for(String s: result) {System.out.println(s);}}
注意事项: 1. 字符|,*,都得加上转义字符前面加上 \\ . 2. 而如果是 \ 那么就得写成 \\\\ . 3. 如果一个字符串中有多个分隔符可以用|作为连字符. 代码示例: 多次拆分
//多次拆分public static void main(String[] args) {String s1 zhnagsan18lisi19;String []ret s1.split();for (int i 0; i ret.length; i) {//result.length的长度为2String []ret1 ret[i].split();//第一次的字符串为zhangsan18for (int j 0; j ret1.length; j) {System.out.println(ret1[j]);//每一次拆开的两部分打印出来}}}
4.7字符串截取
从一个完整的字符串之中截取出部分内容。可用方法如下
区间左闭右开
方法功能 String substring(int beginIndex 从指定索引截取到结尾 String substring(int beginIndex, int endIndex) 截取部分内容
//区间截取public static void main(String[] args) {String str helloworld ;System.out.println(str.substring(5));System.out.println(str.substring(0, 1));}
如果截取的长度为整个字符串的长度0array.length返回的是原地址
public class previewTest {public static void main(String[] args) {String s hello;String s1 s.substring(0);String s2 s.substring(0,5);System.out.println(s.hashCode());System.out.println(s1.hashCode());System.out.println(s2.hashCode());}
}大家可以看到是三个的哈希值都是一样的
4.8:去掉字符串中的左右空格,保留中间空格
变成了一个新的字符串但是如果不需要去除空格制表符换行等还是本来的引用 public static void main(String[] args) {String str hello world ;System.out.println(str.trim());}
trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等). 5字符串的不可变性
譬如 public static void main(String[] args) { final int array[] {1,2,3,4,5}; array[0] 100; System.out.println(Arrays.toString(array)); // array new int[]{4,5,6}; // 编译报错Error:(19, 9) java: 无法为最终变量array分配值 // 被final修饰了array这个引用就不能指向其他数组了 } 那如果我们要修改字符串的内容要怎么修改呢
6修改字符串效率高点
注意尽量避免直接对String类型对象进行修改因为String类是不能修改的所有的修改都会创建新对象效率非常低下。
譬如直接修改的话
public static void main(String[] args) {
String s hello;
s world;
System.out.println(s); // 输出hello world
}
我们编译一下我们要先build一下生成一个字节码文件
然后cmd
我们发现
竟然有两次StringBuild还有append这都是怎么回事呢
实际上上面hello加上world可以分为以下几步
public class StringTest {public static void main(String[] args) {String s hello;StringBuilder stringBuilder new StringBuilder();stringBuilder.append(s);stringBuilder.append(world);s stringBuilder.toString();System.out.println(s); // 输出hello world}
}
对于StringBuild这个类里面的方法都是在原有的对象上直接进行更改并不会创建新的对象
我们可以测试一下
进行字符串的加法对于StringStringBuffer以及StringBuild三者所需要的时间 public static void main(String[] args) {long start System.currentTimeMillis();//计算开始的时间String s ;for(int i 0; i 10000; i){s i;}long end System.currentTimeMillis();//计算结束的时间System.out.println(end - start);//完成这个加法所需要的时间start System.currentTimeMillis();StringBuffer sbf new StringBuffer();//用StringBuffer不改变对象for(int i 0; i 10000; i){sbf.append(i);}end System.currentTimeMillis();System.out.println(end - start);start System.currentTimeMillis();//用StringBuild不改变对象StringBuilder sbd new StringBuilder();for(int i 0; i 10000; i){sbd.append(i);}end System.currentTimeMillis();System.out.println(end - start);}
很显然后二者都比String快了不止一星半点
可以看出在对String类进行修改时效率是非常慢的因此尽量避免对String的直接需要如果要修改建议尽量使用StringBuffer或者StringBuilder。
7StringBuffer以及StringBuild
由于String的不可更改特性为了方便字符串的修改Java中又提供StringBuilder和StringBuffer类。这两个类大 部分功能是相同的这里介绍 StringBuilder常用的一些方法其它需要用到了大家可参阅 public static void main(String[] args) { StringBuilder sb1 new StringBuilder(hello); StringBuilder sb2 sb1; // 追加即尾插--字符、字符串、整形数字 sb1.append( ); // hello sb1.append(world); // hello world sb1.append(123); // hello world123 每一次append都是在原来的对象上面添加字符只是对象的内容可以改变但是还是这个对象没有创建新的对象 和String的区别就在于String类型的对象内容别人改变不了只能每次都创建新的对象 System.out.println(sb1); // hello world123 System.out.println(sb1 sb2); // true System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h System.out.println(sb1.length()); // 获取字符串的有效长度14 System.out.println(sb1.capacity()); // 获取底层数组的总大小 capacity方法是用来获取这个内部字符数组当前的总大小即这个数组在不进行扩容的情况下可以存储的最大字符数。这个大小并不等同于StringBuilder或类似对象当前实际存储的字符数而是指数组的总容量。 解释 实际存储的字符数可以通过length或size方法获取对于StringBuilder来说是length它表示当前StringBuilder对象中实际包含的字符数量。数组的容量通过capacity()获取它表示StringBuilder内部用于存储字符的数组的大小。这个大小通常大于或等于实际存储的字符数因为当字符序列增长时底层数组可能需要扩容以容纳更多的字符。以下代码 StringBuilder sb1 new StringBuilder();
System.out.println(Initial capacity: sb1.capacity()); // 打印初始容量
sb1.append(Hello, World!);
System.out.println(Capacity after appending: sb1.capacity()); // 打印追加后的容量
System.out.println(Actual length: sb1.length()); // 打印实际长度 这段代码展示了如何查看StringBuilder的初始容量、追加字符后的容量以及实际存储的字符长度。注意实际运行时的初始容量可能因JVM实现和版本而异并且不一定总是16虽然这是Java 8及之前版本中StringBuilder的默认初始容量。 续 sb1.setCharAt(0, H); // 设置任意位置的字符 Hello world123 sb1.insert(0, Hello world!!!); // Hello world!!!Hello world123 System.out.println(sb1); System.out.println(sb1.indexOf(Hello)); // 获取Hello第一次出现的位置 System.out.println(sb1.lastIndexOf(hello)); // 获取hello最后一次出现的位置 sb1.deleteCharAt(0); // 删除首字符 sb1.delete(0,5); // 删除[0, 5)范围内的字符 String str sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回 System.out.println(str); sb1.reverse(); // 字符串逆转 str sb1.toString(); // 将StringBuffer以String的方式返回 System.out.println(str); } 从上述例子可以看出String和StringBuilder最大的区别在于String的内容无法修改而StringBuilder的内容可以修改。 频繁修改字符串的情况考虑使用StringBuilder。 注意String和StringBuilder类不能直接转换。如果要想互相转换可以采用如下原则: String变为StringBuilder: 利用StringBuilder的构造方法或append()方法 StringBuilder变为String: 调用toString()方法 最后问大家一个问题
1. String、StringBuffer、StringBuilder的区别
String的内容不可修改StringBuffer与StringBuilder的内容可以修改.
StringBuffer和StringBuilder
StringBuffer与StringBuilder大部分功能是相似的
StringBuffer采用同步处理属于线程安全操作多线程
而StringBuilder未采用同步处理单线程属于线程不安全操作
如图
上述就是 【JavaSE】认识String类了解进阶到熟练掌握的全部内容了能看到这里相信您一定对小编的文章有了一定的认可今天我们了解String类的各种方法以及StringBuild和StringBuffer的区别我们的Java知识更近一步啦~~~ 有什么问题欢迎各位大佬指出 欢迎各位大佬评论区留言修正您的支持就是我最大的动力