stringbuilder打印杨辉三角(打印stringbuilder的内容)

http://www.itjxue.com  2023-01-27 12:42  来源:未知  点击次数: 

String和StringBuilder作为参数的区别

你好:

当用String作为形参时

1. 引用str指向new String("hello")对象。

2. 调用appendStr时,形参s复制了实参str的值,此时形参,实参指向同一个对象,即均指向"hello"这个对象。

3. 在appendStr方法内部,将对象“world”的引用被赋给形参s,但并未对实参str产生影响,即实参str依旧指向"hello"这个对象。

4. appendStr方法结束后,形参s在栈内存中释放,对象"world"因不存在被引用,在后续gc中会被回收。

5. 打印str执行的对象内容,依旧是"hello".

当用StringBuilder作为形参时、

1. 引用str指向new StringBuilder("hello")对象。

2. 调用appendSb时,形参s复制了实参str的值,此时形参,实参指向同一个对象,即均指向"hello"这个对象。

3. 在appendSb方法内部,调用了append的方法,该方法会找到形参所指向的对象,即"hello"这个对象,然后修改了该对象,往后面追加了字符串“world”,即修改了

他所指向的对象内容。

4. appendSb方法结束后,形参s在栈内存中释放,对象"helloworld"因还被实参str引用,不会被回收。

5. 打印str执行的对象内容,内容已经改变为"helloworld".

区别:在appendStr方法内部,给形参赋予了一个新的对象的引用,即形参与实参指向了不同的对象,二者之间没有了关系。

而appendSb方法内部,是操作形参所指向的对象,改变该对象的内容,而形参和实参依旧是指向同一个对象,故实参所指向的对象也就变了。

总结:在java中都是值传递,基本类型即是传递原始值,而引用类型则是传递引用所指向的对象的地址。

希望对你有帮助,请采纳下,谢谢!

Java中StringBuilder

public class Reverse {

public static void main(String[] args) {

String[][] arr = {{"010"},{"3223"},{"666"},{"7890987"},{"123123"}};

int sum = 0;

for (String[] str1 : arr)

{

StringBuilder s = new StringBuilder();

for (String str : str1)

{

s.append(str);

}

if (s.toString().equals(s.reverse().toString()))

{

sum += 1;

System.out.println(s + "是对称的");

}

}

System.out.println("共有" + sum + "个是对称的");

}

}

1、编写一个含有一个整型形式参数的方法,此方法打印杨辉三角形,求大神帮助

private void button1_Click(object sender, System.EventArgs e) { //为杨辉三角形赋值 if(cb.Text!="-请选择-") { int n=Convert.ToInt16(cb.Text.Trim()); int [][] arr=new int[n][]; //打印杨辉三角形 for(int i=0;in;i++) { //初始化二维数组 arr=new int[i+1]; for(int j=0;j=i;j++) { //说明是第一个元素和最后一个元素 if(i==0 || j==0 || i==j) { arr[j]=1; continue;//跳出最近的循环 } //说明是第三行以上,可以实现杨辉三角形定义 if(i1 ) { //实现三角形算法 arr[j]=arr[i-1][j-1]+arr[i-1][j]; } } } //显示杨辉三角形 StringBuilder str=new StringBuilder(); string ss=""; for(int i=0;in;i++) { for(int j=0;j=i;j++) { ss=arr[j].ToString(); //格式控制 switch(ss.Length) { case 1: ss+=" "; break; case 2: ss+=" "; break; case 3: ss+=" "; break; } str.Append(ss+" "); } str.Append("\n"); } label1.Text=str.ToString(); } }

听说你有一个null要打印?

其实 null 这个东西,真是让人又爱又恨,悲喜参半的东西。

用的好了,能表征很多状态,并在程序中很好实现状态的传递,用的不好了,各种NPE问题可以把你烦死……

好吧,以上是题外话,那么这次问题的主旨在于,鉴于null这种关键字很大程度上丰富了我们的语义,并且随着JDK5之后装箱和拆箱的自动进行,null的出场概率更是越来越多。

但是随之而来一个问题就是,当我们想要打印一个null来表示该对象为null的时候,什么操作去处理才是安全可靠的呢?

本文的主旨主要就是对此做一个简单的备忘,以防之后模棱两可的时候又要去看很久,毕竟好记性不如烂笔头嘛,那么首先先把备忘的表格写上(希望大家补充和指教~ :D)

以上就是一个简单的表格总结,那么为什么会产生这种原因呢?

其实通过源码来看,就会发现,其实问题都非常的清晰了,以下对每个操作类型都给出了实现的片段,来佐证实际程序中的操作结果。

可以发现,该函数内部对null做了特殊处理,如果是null对象则处理成一个“null”的字符串,从而不会造成NPE问题。

虽然StringBuilder的append方法有比较多的重载方法,但是总体来说,都对null对象做了特殊的处理,方式主要有两种:1.调用String.valueOf方法(具体实现原理如上所示);2.对null的字符串对象直接调整为打印“null”

如果没有主动的重写Object的toString方法,则会调用Object(所有类的父类)中的toString方法,可见这种方法是没有对null做特殊处理的,所以如果如Java中鼓励的那样,我们最好针对自己的对象重写toString来避免这种NPE的问题。

其次,我们可以挑选装箱类型来看一下,也会发现,因为有自动拆箱的过程存在,也会存在NPE问题,所以这种场景下也需要注意。

参考这篇文章《 在java中,字符串的加法是如何实现的? 》,可以发现实际上这种加号的实现原理其实就是基于StringBuilder的,也就很好理解为什么加号会有这种表现了。

因此,使用toString的方式来打印null是存在问题的,而其它的几种方式都得益于方法内部的兼容处理,可以正常的处理null的打印。

特别有意思的是,+号的处理,实际上是通过StringBuilder来实现的,不得不感慨一下这种复用思想的使用,结合java中string在堆中的实际处理情况来理解,感觉也是一个非常有意思的处理方式。

(责任编辑:IT教学网)

更多

推荐CMS技巧文章