首页 > 编程语言 >Java数组&字符串

Java数组&字符串

时间:2023-02-19 02:11:41浏览次数:45  
标签:Java String Arrays 数组 字符串 cmowers anArray

Java数组

数组是一个对象,它包含了一组固定数量的元素,并且这些元素的类型是相同的。数组会按照索引的方式将元素放在指定的位置上,意味着我们可以通过索引来访问这些元素。在 Java 中,索引是从 0 开始的。

“哥,能说一下为什么索引从 0 开始吗?”三妹突然这个话题很感兴趣。

“哦,Java 是基于 C/C++ 语言实现的,而 C 语言的下标是从 0 开始的,所以 Java 就继承了这个良好的传统习惯。C语言有一个很重要概念,叫做指针,它实际上是一个偏移量,距离开始位置的偏移量,第一个元素就在开始的位置,它的偏移量就为 0,所以索引就为 0。”此刻,我很自信。

“此外,还有另外一种说法。早期的计算机资源比较匮乏,0 作为起始下标相比较于 1 作为起始下标,编译的效率更高。”

 

在 Java 中,可变参数用于将任意数量的参数传递给方法,来看 varargsMethod() 方法:

void varargsMethod(String... varargs) {}

该方法可以接收任意数量的字符串参数,可以是 0 个或者 N 个,本质上,可变参数就是通过数组实现的。为了证明这一点,我们可以看一下反编译一后的字节码:

public class VarargsDemo
{

   public VarargsDemo()
  {
  }

   transient void varargsMethod(String as[])
  {
  }
}

所以,我们其实可以直接将数组作为参数传递给该方法:

VarargsDemo demo = new VarargsDemo();
String[] anArray = new String[] {"沉默王二", "一枚有趣的程序员"};
demo.varargsMethod(anArray);

也可以直接传递多个字符串,通过逗号隔开的方式:

demo.varargsMethod("沉默王二", "一枚有趣的程序员");

 

在 Java 中,数组与 List 关系非常密切。List 封装了很多常用的方法,方便我们对集合进行一些操作,而如果直接操作数组的话,有很多不便,因为数组本身没有提供这些封装好的操作,所以有时候我们需要把数组转成 List。

“怎么转呢?”三妹问到。

最原始的方式,就是通过遍历数组的方式,一个个将数组添加到 List 中。

int[] anArray = new int[] {1, 2, 3, 4, 5};

List<Integer> aList = new ArrayList<>();
for (int element : anArray) {
   aList.add(element);
}

更优雅的方式是通过 Arrays 类的 asList() 方法:

List<Integer> aList = Arrays.asList(anArray);

但需要注意的是,该方法返回的 ArrayList 并不是 java.util.ArrayList,它其实是 Arrays 类的一个内部类:

private static class ArrayList<E> extends AbstractList<E>
       implements RandomAccess, java.io.Serializable{}

如果需要添加元素或者删除元素的话,需要把它转成 java.util.ArrayList

new ArrayList<>(Arrays.asList(anArray));

Java 8 新增了 Stream 流的概念,这就意味着我们也可以将数组转成 Stream 进行操作。

String[] anArray = new String[] {"沉默王二", "一枚有趣的程序员", "好好珍重他"};
Stream<String> aStream = Arrays.stream(anArray);

 

如果数组提前进行了排序,就可以使用二分查找法,这样效率就会更高一些。Arrays.binarySearch() 方法可供我们使用,它需要传递一个数组,和要查找的元素。

int[] anArray = new int[] {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(anArray, 4);

打印Java数组

“首先,我们来看一下,为什么不能直接打印数组,直接打印的话,会出现什么问题。”

来看这样一个例子。

String [] cmowers = {"沉默","王二","一枚有趣的程序员"};
System.out.println(cmowers);

程序打印的结果是:

[Ljava.lang.String;@3d075dc0

[Ljava.lang.String; 表示字符串数组的 Class 名,@ 后面的是十六进制的 hashCode——这样的打印结果太“人性化”了,一般人表示看不懂!为什么会这样显示呢?查看一下 java.lang.Object 类的 toString() 方法就明白了。

public String toString() {
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

再次证明,数组虽然没有显式定义成一个类,但它的确是一个对象,继承了祖先类 Object 的所有方法。

方法一:Stream流

第一种形式:

Arrays.asList(cmowers).stream().forEach(s -> System.out.println(s));

第二种形式:

Stream.of(cmowers).forEach(System.out::println);

第三种形式:

Arrays.stream(cmowers).forEach(System.out::println);

打印的结果如下所示。

沉默
王二
一枚有趣的程序员

没错,这三种方式都可以轻松胜任本职工作,并且显得有点高大上,毕竟用到了 Stream,以及 lambda 表达式open in new window。

“当然了,也可以使用比较土的方式,for 循环。甚至 for-each 也行。”

for(int i = 0; i < cmowers.length; i++){
   System.out.println(cmowers[i]);
}

for (String s : cmowers) {
   System.out.println(s);
}

方法二:Arrays.toString()

“当然没有了,我认为 Arrays.toString() 是打印数组的最佳方式,没有之一。”我的情绪有点激动。

Arrays.toString() 可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组。该方法有多种重载形式。

img

String [] cmowers = {"沉默","王二","一枚有趣的程序员"};
System.out.println(Arrays.toString(cmowers));

程序打印结果:

[沉默, 王二, 一枚有趣的程序员]

 

“哥,那如果我想打印二维数组呢?”

“可以使用 Arrays.deepToString() 方法。”

String[][] deepArray = new String[][] {{"沉默", "王二"}, {"一枚有趣的程序员"}};
System.out.println(Arrays.deepToString(deepArray));

打印结果如下所示。

[[沉默, 王二], [一枚有趣的程序员]]

阿里巴巴规约

“说到打印,三妹,哥给你提醒一点。阿里巴巴的 Java 开发手册上有这样一条规约,你看。”

img

“什么是 POJO 呢,就是 Plain Ordinary Java Object 的缩写,一般在 Web 应用程序中建立一个数据库的映射对象时,我们称它为 POJO,这类对象不继承或不实现任何其它 Java 框架的类或接口。”

“对于这样的类,最好是重写一下它的 toString() 方法,方便查看这个对象到底包含了什么字段,好排查问题。”

“如果不重写的话,打印出来的 Java 对象就像直接打印数组的那样,一串谁也看不懂的字符序列。”

“可以借助 Intellij IDEA 生成重写的 toString() 方法,特别方便。”

标签:Java,String,Arrays,数组,字符串,cmowers,anArray
From: https://www.cnblogs.com/chaosssock/p/17134133.html

相关文章

  • JavaWeb基本概念
    JavaWeb1、基本概念1.1、前言web开发:web,网页的意思,www.baidu.com静态webhtml,css提供给所有人看的数据始终不会发生变化动态web提供给所有人看的数......
  • javascript & Uncaught TypeError: arr is not iterable bug All In One
    javascript&UncaughtTypeError:arrisnotiterablebugAllInOnefunctioncompute(arr){const[left,symbol,right]=arr;switch(symbol){......
  • PAT-basic-1026 程序运行时间 java
    一、题目要获得一个C语言程序的运行时间,常用的方法是调用头文件time.h,其中提供了clock()函数,可以捕捉从程序开始运行到clock()被调用时所耗费的时间。这个时间单......
  • 为了实现客服系统关键词分隔符切分,封装js实现根据多个分隔符分隔字符串为数组
    需求用户可以设置关键词回复,默认是以英文逗号分隔,但是很多人会打成中文逗号,需要能兼容处理解决为了实现客服系统关键词分隔符切分,封装js实现根据多个分隔符分隔字符串为......
  • 2月18日的java学习
    2月18日的java学习java的类型原则基本类型(除浮点型)逐渐变大之后先float后double,容器逐渐变大低到高为自动,高到低为强制转换过程中会发生内存泄漏,或者精度丢失......
  • 漏洞分析-存储型XSS-JAVA篇
    0x00原理分析存储型XSS:用户在浏览器传入的数据未做校验,导致一些恶意的前端代码被插入至数据库中,前端再次读取数据时,数据被当成前端代码,或与前端代码拼接并执行。0x01效......
  • 【LeeCode】151. 反转字符串中的单词
    【题目描述】给你一个字符串 ​​s​​ ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。​​s​​ 中使用至少一个空格将字符串中的 单词 分隔开......
  • 【LeeCode】344. 反转字符串
    【题目描述】编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 ​​s​​ 的形式给出。不要给另外的数组分配额外的空间,你必须​​原地​​修改输入数......
  • java面向对象
    java面向对象以类的方式组织代码,以对象的组织(封装)程序。一个类里面只有方法和属性一个项目至多只有一个main方法创建对象类是抽象的,需要进行实例化publicclass......
  • 算法刷题-字符串排序-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......