**
2020.3.20
**
**
第一题:
**
这一题主要是对二维数组进行遍历,主要是要获取到二维数组的行数和列数。
后续只需要遍历二维数组,取出对应的位置上的值然后和需要比较的数进行比较即可。至于有没有效率高的解法,我没有去过多了解。
*第二题:
**
这一题是将StringBuffer中的空格转换为%20,并且返回一个string字符串。
由此衍生出String、StringBuffer、StringBuilder之间的关系,以及这三种对象的操作。
首先我们先了解这三个对象之间的关系。
String:
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。需要注意的是,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:
首先我们通过str指向hello,这是堆内存中开辟空间存储hello。然后我们执行str=str+“world”,此时需要新开辟堆内存存放world,然后再开辟对内存存放hello world,最后让str指向hello world。这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,谷歌引入了两个新的类——StringBuffer类和StringBuild类来对此种变化字符串进行处理。
StringBuffer、StringBuilder:
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
附三者的继承关系:
小结:
1.String不适合应用于字符串需要经常改变的场景,这种场景下需要使用StringBuffer和StringBuilder;
2.多线程操作字符串缓冲区下操作大量数据使用 StringBuffer,因为StringBuffer是线程安全的,但是其效率较低;
3.单线程操作字符串缓冲区下操作大量数据 StringBuilder,因为StringBuilder是线程不安全的,不过效率较高。
String基本操作方法
首先说一下基本操作方法,字符串的基本操作方法中包含以下几种:
(1)获取字符串长度length()
格式:int length = str.length();
(2)获取字符串中的第i个字符charAt(i)
格式:char ch = str.charAt(i); //i为字符串的索引号,可得到字符串任意位置处的字符,保存到字符变量中
(3)获取指定位置的字符方法getChars(4个参数)
格式:char array[] = new char[80]; //先要创建以一个容量足够大的char型数组,数组名为array
str.getChars(indexBegin,indexEnd,array,arrayBegin);
解释一下括号中四个参数的指向意义:
1、indexBegin:需要复制的字符串的开始索引
2、 indexEnd: 需要复制的字符串的结束索引,indexEnd-1
3、array: 前面定义的char型数组的数组名
4、arrayBegin:数组array开始存储的位置索引号
这样我们就可以将字符串中想要的范围内的字符都复制到字符数组中,将字符数组打印输出即可。
StringBuffer、StringBuilder的基本操作(两者方法基本一模一样,在这里一起给出)
附:
第三题
这道题是简单地将链表的中存储的值取出并且反转存储到一个ArrayList集合里面。即链表中最后一个元素值存储到ArrayList集合中第一个位置。
链表的数据结构:
算法实现:LinkList和ArrayList:
附两者的底层实现:
https://blog.csdn.net/xiaocai9999/article/details/78650497?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task