![](https://img-blog.csdnimg.cn/a11455fc5e944b93aba5f475ff88081f.png)
我们在test这个程序中,直接去访问demo这个程序的,因为他们在同一个包下
那我们用这个demo来创建一个对象
我们在调他的print方法
2.得加导包代码
![](https://img-blog.csdnimg.cn/3dae9c0478a14abba56675258596b0c6.png)
这个内幕中记住的确实是字符串对象的地址
但是字符串它本身做了一些改进
它会根据这里面的地址去找到内容打印出来的
![](https://img-blog.csdnimg.cn/f981e4eba6c646e3aa309d9a1bbf8cdd.png)
那么它这个字符串对象里面呢
返回的其实就是一个空白的字符串对象
我们用rs一接一接啊
![](https://img-blog.csdnimg.cn/6c8c8ae48f4345f88216e15bc1a363c8.png)
把这个字符数组呢给到这个string的构造器
它是有这个接字符数组的构造器的
然后呢我们在这个左边的定义一个变量
来记一下它这个字符串对象
调它的一个接字节数组的构造器,它就会把这个字节数组转成字符串
abc给到这个字符串对象,然后呢你再定义一个变量,比如说rs 4去接这个字符串对象
![](https://img-blog.csdnimg.cn/42d6fbfe035f4b658ab9f902747bbc63.png)
然后把它交给一个String类型的变量,比如说s记住啊
接着呢我们就可以去通过s调字符串的方法
2.那我们应该定一个恰类型的变量来记住它,接着呢我们把这个c变量打出来再执行一下
3.接着我们可以用s调char的方法,把所i往里面一扔,他就可以根据索引去提取s指向的字符串
每一个字符,都把它交给一个字符类型的变量,比如说ch计一下
![](https://img-blog.csdnimg.cn/fbcfffe60a784eadba15114cf1a42abc.png)
那我们来定义一个字符数组的变量,来记住它返回的字符数组
然后我们就可以去遍历这个字符数组
然后在内部呢我们可以通过chars,然后再根据这个索引提取它里面的每个字符
![](https://img-blog.csdnimg.cn/1009854fd6724515b8b723d7afff6b5e.png)
这个地方呢就应该这样写了s一点equals,然后呢把s2 送到这个方法里面去,让他跟s一进行内容比较
![](https://img-blog.csdnimg.cn/81229c07be6644c3bded9addb3c2e2e6.png)
现在内容不一样
但假如说我调的是equals ignore case的话,因为它是忽略大小写比较的好
![](https://img-blog.csdnimg.cn/e2753c888b534d34a8a2be532d9c2a45.png)
![](https://img-blog.csdnimg.cn/9ab7839a6b7e4874bc408be061cac603.png)
![](https://img-blog.csdnimg.cn/a6032790f1e14a6bbfc9d07d423d7582.png)
7.我应该用s3 调substring,然后填最的索引就行了,那我们呢再定一个变量rs 2来记住
8.他用info调replace方法,接着第一个参数呢填的是你要替换哪个词,第二个参数是你要替换成哪一个新的词,那我们就需要定义一个string类型的变量,记一记
![](https://img-blog.csdnimg.cn/69805abea92e4c3386a544c63793195e.png)
![](https://img-blog.csdnimg.cn/14354a2beef7462586ac0990aac2c078.png)
![](https://img-blog.csdnimg.cn/bdaa61bc729e4399842c9c9a1c3b5786.png)
接着呢我们可以遍历一下这个字符串数组啊
![](https://img-blog.csdnimg.cn/e4ed77c988d64fcc99acbff0b881dfab.png)
我把它交给一个string类型的变量类记住
然后我在这里写这个代码
name加等于这里连一个程序员
那最终这个内肯定会指向黑马程序员啊
右边展示出来的结果是黑马程序员波妞
![](https://img-blog.csdnimg.cn/4aa1f302d40b462ea609ffef8c05ef01.png)
![](https://img-blog.csdnimg.cn/d2c18d95c9b1457c9a6a68ae7995810c.png)
黑马这个对象
![](https://img-blog.csdnimg.cn/2a0f9c43bd5245f9ad6addb0fe77b1e6.png)
![](https://img-blog.csdnimg.cn/a25619cfc4574d2d8b605088b0483d76.png)
那只要不是以双引号的方式给的,他会产生一个新的对象叫黑马程序员放在我们的堆里面的啊
新对象的地址赋给我们的name,由name在来指向它
![](https://img-blog.csdnimg.cn/b6bcce5bcdd440dbb84250182b67dd0b.png)
那这个是加运算,它会产生一个新的对象,叫”黑马程序员波妞“
![](https://img-blog.csdnimg.cn/7228275e06354665b62ce21f5a0c9d15.png)
,然后name会指向新的字符串对象
![](https://img-blog.csdnimg.cn/b7d53de6d1e7493585992e071028745b.png)
![](https://img-blog.csdnimg.cn/0dba807ad55e4ccd947bde3684e1ad7e.png)
他是不是判断的是s一这个变量里面的地址和s2 这个变量里面的地址是不是一样的
说明s1和s2这个变量里面的地址是一样的,只要是双引号给出的字符串对象
那么它其实会存在于常量池中的
![](https://img-blog.csdnimg.cn/97f5ecebc91e4a248a4f6d289e12879c.png)
然后我们来new一个字符串对象,然后把这个字符数组交给这个字符串的构造器
他就把这个字符数组的内容啊,转成了a b c交给了这个字符串对象了
然后我们来定义一个ST类型的变量a来记住这个字符串对象
![](https://img-blog.csdnimg.cn/775eef00b46d4ef5b2d8246334d68f70.png)
![](https://img-blog.csdnimg.cn/52ba458ee2b647ef9e4a97f3b524e243.png)
接着呢他会执行这里的第一行代码
![](https://img-blog.csdnimg.cn/585bc8ad66454e989f41c1f330bbbca5.png)
会在main方法里面开劈 s1变量空间
他会把这个双引号给出的字符串对象
![](https://img-blog.csdnimg.cn/f09aec96ca864a728b547f998a61a925.png)
然后他会把这个对象的地址付给我们的
付给s1来记住由s1来指向abc
![](https://img-blog.csdnimg.cn/1debf251340a4ce1a3b2852e96107e10.png)
![](https://img-blog.csdnimg.cn/f2687f0725a7438c80fb39cbeb4e5fa1.png)
由于是双引号给出的字符串对象
所以他要放常量池的啊
但是他发现常量池中已经有一个
因此它会共用这个对象的
他会把这个对象的地址呢拿过来给s2
![](https://img-blog.csdnimg.cn/ccd4742188984de89440268657244dd7.png)
![](https://img-blog.csdnimg.cn/6e2cd16532a746cfbebdbcb0db1aec5a.png)
![](https://img-blog.csdnimg.cn/920ea31bd7b44b919eb36581ba55ddc5.png)
![](https://img-blog.csdnimg.cn/9d834ec3681a430c8d28324360460c74.png)
s3它不是以双引号给出来的
它是由 s2 a b加c得到a b c的,只要是运算他是不会放常量池的,它会放到我们的堆里面去的
因此上面这个是指向常量池,下面这个是指向堆里面的a b c
![](https://img-blog.csdnimg.cn/4e62b0c219a94435896f9e8063e52afc.png)
我们在编译这个代码的时候,编译器发现a后面这个值,a和b和c是一些确定下来的值
因此呢编译器会把a加b加c,直接帮你转成a b c
s1,s2也会指向常量池的a b c
![](https://img-blog.csdnimg.cn/ace9c0a520ac4fbcbd1d8962d3701129.png)
![](https://img-blog.csdnimg.cn/8ffb379dd8b04831910df89869b48aed.png)
![](https://img-blog.csdnimg.cn/06d2b6c7f1844d2894dc437ad1623ae5.png)
![](https://img-blog.csdnimg.cn/8874ad2305e94ec69c402c9bc8d3c6c8.png)
![](https://img-blog.csdnimg.cn/1e1e11dd1c8d4909893739a10c9fdb1f.png)
2.用Random产生
3.code+=可以连接字符
![](https://img-blog.csdnimg.cn/4c42082d3cf3419c83ccab95f1023b08.png)
比如:createCode(4) 需要4位验证码
执行流程:首先他调这个方法的时候传的是4
![](https://img-blog.csdnimg.cn/145a8cc9d70246468fcefaa70843e228.png)
这样我们就得到了一个earlist的集合对象了
并把这个对象交给了earlist类型的list的变量
我们来看如何往这个集合对象中添加数据
然后去点大家看这里就会出现一个a的方法
这个入仓代表的是可以接收一切类型数据的,好那咱们呢在这里直接调这个a的方法
![](https://img-blog.csdnimg.cn/f717f1e9605b4d1f9378bd131f631416.png)
![](https://img-blog.csdnimg.cn/08226888b7bc445b90799abf65911477.png)
![](https://img-blog.csdnimg.cn/521df9738e424743ade7fb4c0e99c911.png)
![](https://img-blog.csdnimg.cn/43a5b15452034b48b2edd16ce7a8c265.png)
![](https://img-blog.csdnimg.cn/ccd383979fbf44db80b863efcbe331d6.png)
rs来记住它取出来的这个值
![](https://img-blog.csdnimg.cn/7cfd0db2fede471fba1c8032b758429f.png)
list集合对象去调刚刚讲过的get方法,然后用String来记
![](https://img-blog.csdnimg.cn/063ca3d236f04bc5a381e5a709623583.png)
![](https://img-blog.csdnimg.cn/175d689528db4cfd9b2fa135569e47b0.png)
提供无参构造器
![](https://img-blog.csdnimg.cn/8f79b0b3bd84473ea8910f0a5ed37f0c.png)