Java字符串操作系列(2)

1、字符串性能比较测试

以下实例演示了通过两种方式创建字符串,并测试其性能:

public class StringComparePerformance{public static void main(String[] args){      long startTime = System.currentTimeMillis();for(int i=0;i<50000;i++){String s1 = "hello";String s2 = "hello"; }long endTime = System.currentTimeMillis();System.out.println("通过 String 关键词创建字符串" + " : "+ (endTime - startTime) + " 毫秒" );       long startTime1 = System.currentTimeMillis();for(int i=0;i<50000;i++){String s3 = new String("hello");String s4 = new String("hello");}long endTime1 = System.currentTimeMillis();System.out.println("通过 String 对象创建字符串" + " : " + (endTime1 - startTime1)+ " 毫秒");}
}

以上代码实例输出结果为:

通过 String 关键词创建字符串 : 6 毫秒 
通过 String 对象创建字符串 : 14 毫秒

用关键字创建对象时,由于JAVA堆中常量池的存在,在第一个字符串字面值常量"hello"被加入到常量池之后,,后续字符串的创建就无需重新开辟空间了,只需要另引用变量指向常量池中的"hello"即可完成。

用new关键字创建对象时,由于每次都需要在堆空间中开辟空间,因此浪费的时间比第一种要多得多

2、字符串优化

以下实例演示了通过 String.intern() 方法来优化字符串:

public class StringOptimization {public static void main(String[] args){String variables[] = new String[50000];      for( int i=0;i <50000;i++){variables[i] = "s"+i;}long startTime0 = System.currentTimeMillis();for(int i=0;i<50000;i++){variables[i] = "hello";}long endTime0 = System.currentTimeMillis();System.out.println("直接使用字符串: "+ (endTime0 - startTime0)  + " ms" );long startTime1 = System.currentTimeMillis();for(int i=0;i<50000;i++){variables[i] = new String("hello");}long endTime1 = System.currentTimeMillis();System.out.println("使用 new 关键字:" + (endTime1 - startTime1) + " ms");long startTime2 = System.currentTimeMillis();for(int i=0;i<50000;i++){variables[i] = new String("hello");variables[i] = variables[i].intern();          }long endTime2 = System.currentTimeMillis();System.out.println("使用字符串对象的 intern() 方法: " + (endTime2 - startTime2)+ " ms");}
}

以上代码实例输出结果为:

直接使用字符串: 3 ms
使用 new 关键字:5 ms
使用字符串对象的 intern() 方法: 10 ms

3、字符串格式化

以下实例演示了通过 format() 方法来格式化字符串,还可以指定地区来格式化:

import java.util.*;public class StringFormat {public static void main(String[] args){// 获取数学常数e的值double e = Math.E;// 以浮点数形式打印出e的值System.out.format("%f%n", e);// 指定本地为中国(CHINA),并以浮点数形式打印出e的值System.out.format(Locale.CHINA, "%-10.4f%n%n", e);}
}

以上代码实例输出结果为:

2.718282
2.7183  

4、连接字符串

以下实例演示了通过 "+" 操作符和StringBuffer.append() 方法来连接字符串,并比较其性能:

    public static void main(String[] args){long startTime = System.currentTimeMillis();for(int i=0;i<50000;i++){String result = "";result += "This is";result += "testing the";result += "difference";result += "between";result += "String";result += "and";result += "StringBuffer";}long endTime = System.currentTimeMillis();System.out.println("字符串连接"+ " - 使用 + 操作符 : "+ (endTime - startTime)+ " ms");long startTime1 = System.currentTimeMillis();for(int i=0;i<50000;i++){StringBuffer result = new StringBuffer();result.append("This is");result.append("testing the");result.append("difference");result.append("between");result.append("String");result.append("and");result.append("StringBuffer");}long endTime1 = System.currentTimeMillis();System.out.println("字符串连接"+ " - 使用 StringBuffer : "+ (endTime1 - startTime1)+ " ms");long startTime2 = System.currentTimeMillis();for(int i=0;i<50000;i++){StringBuilder result = new StringBuilder();result.append("This is");result.append("testing the");result.append("difference");result.append("between");result.append("String");result.append("and");result.append("StringBuffer");}long endTime2 = System.currentTimeMillis();System.out.println("字符串连接"+ " - 使用 StringBuilder : "+ (endTime2 - startTime2)+ " ms");}

以上代码实例输出结果为

测试结果如下,可以看出就拼接效率而言,String < StringBuffer < StringBuilder。

字符串连接 - 使用 + 操作符 : 90 ms

字符串连接 - 使用 StringBuffer : 20 ms

字符串连接 - 使用 StringBuilder : 10 ms

对于“+”来说,会在常量池中创建了多个String对象,占用内存

首先第一种测试”+“号,每次相加的过程String类由于是不可变序列,都会默认在堆中new了一个新对象来存放相加之后的字符串,这个过程是时间差的主要原因。而StringBuilder & StringBuffer有时间差的主要原因在于,一个是线程不安全的类,一个是线程安全的类,Buffer要保证方法的线程安全自然效率会变低。

5、数组排序及元素查找

以下实例演示了如何使用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素, 这边我们定义了 printArray() 方法来打印数组:

import java.util.Arrays;public class MainClass {public static void main(String args[]) throws Exception {int array[] = { 2, 5, -2, 6, -3, 8, 0, -7, -9, 4 };Arrays.sort(array);printArray("数组排序结果为", array);int index = Arrays.binarySearch(array, 2);System.out.println("元素 2  在第 " + index + " 个位置");}private static void printArray(String message, int array[]) {System.out.println(message+ ": [length: " + array.length + "]");for (int i = 0; i < array.length; i++) {if(i != 0){System.out.print(", ");}System.out.print(array[i]);}System.out.println();}
}

以上代码运行输出结果为:

数组排序结果为: [length: 10] -9, -7, -3, -2, 0, 2, 4, 5, 6, 8
元素 2 在第 5 个位置

7、数组添加元素

以下实例演示了如何使用sort()方法对Java数组进行排序,及如何使用 insertElement () 方法向数组插入元素, 这边我们定义了 printArray() 方法来打印数组:

import java.util.Arrays;public class MainClass {public static void main(String args[]) throws Exception {int array[] = { 2, 5, -2, 6, -3, 8, 0, -7, -9, 4 };Arrays.sort(array);printArray("数组排序", array);int index = Arrays.binarySearch(array, 1);System.out.println("元素 1 所在位置(负数为不存在):"+ index);  int newIndex = -index - 1;array = insertElement(array, 1, newIndex);printArray("数组添加元素 1", array);}private static void printArray(String message, int array[]) {System.out.println(message + ": [length: " + array.length + "]");for (int i = 0; i < array.length; i++) {if (i != 0){System.out.print(", ");}System.out.print(array[i]);         }System.out.println();}private static int[] insertElement(int original[],int element, int index) {int length = original.length;int destination[] = new int[length + 1];System.arraycopy(original, 0, destination, 0, index);destination[index] = element;System.arraycopy(original, index, destination, index+ 1, length - index);return destination;}
}

以上代码运行输出结果为:

数组排序: [length: 10] -9, -7, -3, -2, 0, 2, 4, 5, 6, 8 
元素 1 所在位置(负数为不存在):-6 
数组添加元素 1: [length: 11] -9, -7, -3, -2, 0, 1, 2, 4, 5, 6, 8

System.arraycopy()是Java中的一个方法,用于将一个数组的一部分复制到另一个数组中。它的基本语法如下:

System.arraycopy(源数组, 源数组开始位置, 目标数组, 目标数组开始位置, 复制长度);
 

 

参数说明:

  • 源数组:要复制的数组。
  • 源数组开始位置:从源数组的哪个位置开始复制。
  • 目标数组:将复制的内容放入的目标数组。
  • 目标数组开始位置:从目标数组的哪个位置开始放置复制的内容。
  • 复制长度:要复制的元素数量。

示例代码:

public class ArrayCopyDemo {public static void main(String[] args) {int[] srcArray = {1, 2, 3, 4, 5};int[] destArray = new int[5];System.arraycopy(srcArray, 1, destArray, 2, 3);for (int i : destArray) {System.out.print(i + " ");}}
}
 

输出结果

0 0 2 3 4
 

8、获取数组长度

本文我们将为大家介绍如何使用数组的属性 length 来获取数组的长度。

以下实例中我们定义了二维数组,并获取数组的长度:

public class Main {public static void main(String args[]) {String[][] data = new String[2][5];System.out.println("第一维数组长度: " + data.length);System.out.println("第二维数组长度: " + data[0].length);}
}

以上代码运行输出结果为:

第一维数组长度: 2 
第二维数组长度: 5

9、数组反转

以下实例中我们使用 Collections.reverse(ArrayList) 将数组进行反转:

import java.util.ArrayList;
import java.util.Collections;public class Main {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<String>();arrayList.add("A");arrayList.add("B");arrayList.add("C");arrayList.add("D");arrayList.add("E");System.out.println("反转前排序: " + arrayList);Collections.reverse(arrayList);System.out.println("反转后排序: " + arrayList);}
}

以上代码运行输出结果为:

反转前排序: [A, B, C, D, E] 
反转后排序: [E, D, C, B, A] 

10、数组输出

以下实例演示了如何通过循环输出数组:

public class Welcome {public static void main(String[] args){String[] nowcoders = new String[3];nowcoders[0] = "牛客教程";nowcoders[1] = "牛客工具";nowcoders[2] = "牛客笔记";for (int i = 0; i < nowcoders.length; i++){System.out.println(nowcoders[i]);}}
}

以上代码运行输出结果为:

牛客教程
牛客工具
牛客笔记

11、数组获取最大和最小值

以下实例演示了如何通过 Collections 类的 Collections.max() 和 Collections.min() 方法来查找数组中的最大和最小值:

import java.util.Arrays;
import java.util.Collections;public class Main {public static void main(String[] args) {Integer[] numbers = { 8, 2, 7, 1, 4, 9, 5};int min = (int) Collections.min(Arrays.asList(numbers));int max = (int) Collections.max(Arrays.asList(numbers));System.out.println("最小值: " + min);System.out.println("最大值: " + max);}
}

以上代码运行输出结果为:

最小值: 1
最大值: 9

12、数组合并

以下实例演示了如何通过 List 类的 Arrays.toString () 方法和 List 类的 list.Addall(array1.asList(array2) 方法将两个数组合并为一个数组:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Main {public static void main(String args[]) {String a[] = { "A", "E", "I" };String b[] = { "O", "U" };List list = new ArrayList(Arrays.asList(a));list.addAll(Arrays.asList(b));Object[] c = list.toArray();System.out.println(Arrays.toString(c));}
}

以上代码运行输出结果为:

[A, E, I, O, U]

13、数组填充

以下实例我们通过 Java Util 类的 Arrays.fill(arrayname,value) 方法和Arrays.fill(arrayname ,starting index ,ending index ,value) 方法向数组中填充元素:

import java.util.*;public class FillTest {public static void main(String args[]) {int array[] = new int[6];Arrays.fill(array, 100);for (int i=0, n=array.length; i < n; i++) {System.out.println(array[i]);}System.out.println();Arrays.fill(array, 3, 6, 50);for (int i=0, n=array.length; i< n; i++) {System.out.println(array[i]);}}
}

以上代码运行输出结果为:

100
100
100
100
100
100

100
100
100
50
50
50

14、数组扩容

以下实例演示了如何在数组初始化后对数组进行扩容:

public class Main {public static void main(String[] args) {String[] names = new String[] { "A", "B", "C" };String[] extended = new String[5];extended[3] = "D";extended[4] = "E";System.arraycopy(names, 0, extended, 0, names.length);for (String str : extended){System.out.println(str);}}
}

以上代码运行输出结果为:

A
B
C
D
E

15、查找数组中的重复元素

以下实例演示了如何在 java 中找到重复的元素:

public class MainClass {public static void main(String[] args) {int[] my_array = {1, 2, 5, 5, 6, 6, 7, 2, 9, 2};findDupicateInArray(my_array);}public static void findDupicateInArray(int[] a) {int count=0;for(int j=0;j<a.length;j++) {for(int k =j+1;k<a.length;k++) {if(a[j]==a[k]) {count++;}}if(count==1)System.out.println( "重复元素 : " +  a[j] );count = 0;}}
}

以上代码运行输出结果为:

重复元素 : 5
重复元素 : 6
重复元素 : 2

16、删除数组元素

以下实例演示了如何使用 remove () 方法来删除数组元素:

import java.util.ArrayList;public class Main {public static void main(String[] args)  {ArrayList<String> objArray = new ArrayList<String>();objArray.clear();objArray.add(0,"第 0 个元素");objArray.add(1,"第 1 个元素");objArray.add(2,"第 2 个元素");System.out.println("数组删除元素前:"+objArray);objArray.remove(1);objArray.remove("第 0 个元素");System.out.println("数组删除元素后:"+objArray);}
}

以上代码运行输出结果为:

数组删除元素前:[第 0 个元素, 第 1 个元素, 第 2 个元素]
数组删除元素后:[第 2 个元素]

17、数组差集

以下实例演示了如何使用 removeAll () 方法来计算两个数组的差集:

import java.util.ArrayList;public class Main {public static void main(String[] args)  {ArrayList objArray = new ArrayList();ArrayList objArray2 = new ArrayList();objArray2.add(0,"common1");objArray2.add(1,"common2");objArray2.add(2,"notcommon");objArray2.add(3,"notcommon1");objArray.add(0,"common1");objArray.add(1,"common2");objArray.add(2,"notcommon2");System.out.println("array1 的元素" +objArray);System.out.println("array2 的元素" +objArray2);objArray.removeAll(objArray2);System.out.println("array1 与 array2 数组差集为:"+objArray);}
}

以上代码运行输出结果为:

array1 的元素[common1, common2, notcommon2]
array2 的元素[common1, common2, notcommon, notcommon1]
array1 与 array2 数组差集为:[notcommon2]

18、数组交集

以下实例演示了如何使用 retainAll () 方法来计算两个数组的交集:

import java.util.ArrayList;public class Main {public static void main(String[] args)  {ArrayList objArray = new ArrayList();ArrayList objArray2 = new ArrayList();objArray2.add(0,"common1");objArray2.add(1,"common2");objArray2.add(2,"notcommon");objArray2.add(3,"notcommon1");objArray.add(0,"common1");objArray.add(1,"common2");objArray.add(2,"notcommon2");System.out.println("array1 数组元素:"+objArray);System.out.println("array2 数组元素:"+objArray2);objArray.retainAll(objArray2);System.out.println("array2 & array1 数组交集为:"+objArray);}
}

以上代码运行输出结果为:

array1 数组元素:[common1, common2, notcommon2]
array2 数组元素:[common1, common2, notcommon, notcommon1]
array2 & array1 数组交集为:[common1, common2]

19、在数组中查找指定元素

以下实例演示了如何使用 contains () 方法来查找数组中的指定元素:

import java.util.ArrayList;public class Main {public static void main(String[] args)  {ArrayList<String> objArray = new ArrayList<String>();ArrayList<String> objArray2 = new ArrayList<String>();objArray2.add(0,"common1");objArray2.add(1,"common2");objArray2.add(2,"notcommon");objArray2.add(3,"notcommon1");objArray.add(0,"common1");objArray.add(1,"common2");System.out.println("objArray 的数组元素:"+objArray);System.out.println("objArray2 的数组元素:"+objArray2);System.out.println("objArray 是否包含字符串common2? : "+objArray.contains("common2"));System.out.println("objArray2 是否包含数组 objArray? :"+objArray2.contains(objArray) );}
}

以上代码运行输出结果为:

objArray 的数组元素:[common1, common2]
objArray2 的数组元素:[common1, common2, notcommon, notcommon1]
objArray 是否包含字符串common2? : true
objArray2 是否包含数组 objArray? :false

为什么objArray2 是否包含数组 objArray?

结果为false

同学,需要使用containsAll()方法,就可以判断的

20、判断数组是否相等

以下实例演示了如何使用 equals ()方法来判断数组是否相等:

import java.util.Arrays;public class Main {public static void main(String[] args) throws Exception {int[] ary = {1,2,3,4,5,6};int[] ary1 = {1,2,3,4,5,6};int[] ary2 = {1,2,3,4};System.out.println("数组 ary 是否与数组 ary1相等? :"+Arrays.equals(ary, ary1));System.out.println("数组 ary 是否与数组 ary2相等? :"+Arrays.equals(ary, ary2));}
}

以上代码运行输出结果为:

数组 ary 是否与数组 ary1相等? :true
数组 ary 是否与数组 ary2相等? :false

今天到这里,持续更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux硬链接和软连接是什么?

在Linux操作系统中&#xff0c;文件管理是一个基本且重要的概念。其中&#xff0c;软链接&#xff08;Symbolic Link&#xff09;和硬链接&#xff08;Hard Link&#xff09;是文件系统中两种不同类型的链接方式&#xff0c;它们在文件管理和操作中扮演着重要的角色。软链接 软…

有效解决wordpress的502 Bad Gateway错误提示

摘要&#xff1a;最近有客户反映使用阿里云虚拟云主机&#xff0c;wordpress常提示502 Bad Gateway错误&#xff0c;网关错误是网站上遇到的常... wordpress的502 Bad Gateway错误如何修复&#xff1f; 第1步&#xff1a;偶发错误可尝试重新加载网站 偶尔出现流量突发爆增或是服…

Sql Server关于表的建立、修改、删除

表的创建&#xff1a; &#xff08;1&#xff09;在“对象资源管理器”面板中展开“数据库”节点&#xff0c;可以看到自己创建的数据库&#xff0c;比如Product。展开Product节点&#xff0c;右击“表”节点&#xff0c;在弹出的快捷菜单中选择“新建表”项&#xff0c;进入“…

mysql中information_schema.tables字段说明

第一篇 1. 获取所有表结构(TABLES) SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA数据库名; TABLES表&#xff1a;提供了关于数据库中的表的信息&#xff08;包括视图&#xff09;。详细表述了某个表属于哪个schema&#xff0c;表类型&#xff0c;表引擎&…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion简介

Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如

K-means算法通俗原理及Python与R语言的分别实现

K均值聚类方法是一种划分聚类方法&#xff0c;它是将数据分成互不相交的K类。K均值法先指定聚类数&#xff0c;目标是使每个数据到数据点所属聚类中心的总距离变异平方和最小&#xff0c;规定聚类中心时则是以该类数据点的平均值作为聚类中心。 01K均值法原理与步骤 对于有N个…

Java8流操作

Java8流操作 1. 双层Map一层List 1. 双层Map一层List 代码片 // 开始分组Map<String, Map<Object, List<ProjectGeographyVO>>> collect4 vos.stream()// 注释了下行没用市级项目,只有区// .filter(data -> String.valueOf(data.getCode()).length() …

[HITCON 2017]SSRFme perl语言的 GET open file 造成rce

这里记录学习一下 perl的open缺陷 这里首先本地测试一下 发现这里使用open打开 的时候 如果通过管道符 就会实现命令执行 然后这里注意的是 perl 中的get 调用了 open的参数 所以其实我们可以通过管道符实现命令执行 然后这里如果file可控那么就继续可以实现命令执行 这里就…

JavaSE基础50题:12. 编写代码模拟三次密码输入的场景。

概述 编写代码模拟三次输入的场景&#xff0c;最多能输入三次密码&#xff0c;密码正确&#xff0c;提示 “登录成功” &#xff0c;密码错误&#xff0c;可重新输入&#xff0c;最多输入三次&#xff0c;三次均错&#xff0c;则提示退出程序。 代码 import java.util.Scann…

Redission分布式锁原理初探

什么是分布式锁&#xff0c;为什么需要分布式锁 在多线程并发请求当中&#xff0c;为了保证我们的资源同一时刻只有一个线程进行操作&#xff08;如商品超卖问题、购票系统等&#xff09;&#xff0c;我们通常要添加锁机制&#xff0c;如ReentrantLock&#xff0c;也就是可重入…

企业微信小群发公告的接口和功能测试

企业微信小群发公告的接口和功能测试&#xff0c;可以从以下几个方面进行&#xff1a; 功能测试&#xff1a; 1.验证发送公告的基础功能。例如&#xff0c;发送公告是否能够被成功发送到小群中&#xff0c;公告内容是否能够被所有群成员看到。 2.验证公告的多种设置功能&…

C# 使用FluentScheduler触发定时任务

写在前面 FluentScheduler是.Net平台下的一个自动任务调度组件&#xff0c;以前经常用的是Quarz.Net&#xff0c;相对而言FluentScheduler的定时配置更为直观&#xff0c;可直接用接口进行参数化设置&#xff0c;对Cron表达式有恐惧症的人来说简直就是福音&#xff0c;使用起来…

对于技术人员实力的判断

技术实力的迷思 俗话说“文无第一&#xff0c;武无第二”&#xff0c;技术就是一种“文”的能力&#xff0c;很多时候我们很难直观看出一个技术人员的实力&#xff0c;但不管是公司招聘的面试&#xff0c;还是公司内部的晋升面评&#xff0c;都需要在较短时间内快速判断一个技…

Linux——进程状态

我们都知道进程信息被放到了PCB&#xff08;task_struct&#xff09;中&#xff0c;可以理解为进程属性的集合。 PCB中包含了进程的ID&#xff0c;时间片&#xff0c;pc指针&#xff0c;所有的寄存器&#xff0c;进程状态、优先级、I/O状态信息等等...有兴趣的可以去看看源码&…

excel xla文件怎么导入到excel

在Excel中导入XLA文件&#xff08;Excel Add-In&#xff09;的步骤如下&#xff1a; 1. **打开Excel&#xff1a;** 启动 Microsoft Excel 应用程序。 2. **选择“文件”选项卡&#xff1a;** 点击Excel窗口左上角的“文件”选项卡。 3. **选择“选项”&#xff1a;** 在文件…

【计算机网络笔记】物理层——频带传输基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

LAMP和分离式LNMP部署

目录 一.什么是LAMP&#xff1f; 二.安装LAMP 先安装apache&#xff0c;httpd网页服务&#xff1a; 接着安装mysql&#xff1a; 安装php&#xff1a; 创建论坛&#xff1a; 三.安装分布式LNMP&#xff1a; 先安装nginx&#xff1a; 到另一台主机安装php&#xff1a; …

Android 默认打开应用的权限

有项目需要客户要安装第三方软件&#xff0c;但是要手动点击打开权限&#xff0c;就想不动手就打开。 //安装第三方软件&#xff0c;修改方式 frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java //找到如下源码&#xff1a; //有三种方…

整数二分的建模

当题目能够使用整数二分法建模时&#xff0c;主要有整数二分法思想进行判定&#xff0c;它的基本形式如下&#xff1a; while(left < right) {int ans;//记录答案 int mid left (right - left) / 2;//二分if(check(mid)){//检查条件&#xff0c;如果成立 ans mid;//记录…

Python实现的二叉树的先序、中序、后序遍历示例

一、先序、中序、后序遍历的次序&#xff1a; 创建好一棵二叉树后&#xff0c;可以按照一定的顺序对树中所有的元素进行遍历。按照先左后右&#xff0c;树 的遍历方法有三种&#xff1a;先序遍历、中序遍历和后序遍历。 其中&#xff0c;先序遍历的次序是&#xff1a;如果二叉…