资讯专栏INFORMATION COLUMN

(Thinking in Java)第13章 字符串

feng409 / 2240人阅读

摘要:四上的操作看五格式化输出运用和语言很相似和是等价的哟类格式化说明符转换六正则表达式网上教程学七扫描输入新增了类。

一、不可变String

String类型的对象是不可变的,所有的改变实际上都是创建了一个新的String对象,另外当String作为传入参数的时候,其实实际上传入的是这个引用的一个拷贝,这个方法结束了之后这个传入的引用也就消失了,原来的那个String不会受到方法内的影响而改变。

package tij.string;

public class Test {
    String s = "field";
    Object o = "123";
    void change(String change_s) {
        System.out.println(this.s == change_s);
        System.out.println(this.s.hashCode() + "---" + change_s.hashCode());
        change_s = "change";
        System.out.println(this.s == change_s);
        System.out.println(this.s.hashCode() + "---" + change_s.hashCode());
    }

    public static void main(String[] args) {
        Test t = new Test();

        t.change(t.s);
        System.out.println(t.s);

        System.out.println("--------");

        t.change(t.o);
        System.out.println(t.o);

    }

    void change(Object o) {
        o = 123;
        System.out.println(this.o == o);
        System.out.println(this.s.hashCode() + "---" + o.hashCode());
    }
}

这个例子是我自己想的,在接收string参数的change方法(就叫暂时就change1啦)里,传入的的确是t.s,在未对change_s进行操作的时候,传入的change_s与t.s也的确完全相同,但是当改变了传入参数change_s后,可以发现t.s并没有改变。这就证实了,传入的其实并不是t.s这个引用本身,而传入的其实是这个引用的拷贝,为了对比,我还加入了传入参数为object类型的change方法,对比可以发现,在接收Object方法的change中,传入的就是引用本身。
另外还发现= =,change方法存在重写,但是string是Object的子类,当传递string或string的子类的时候,优先调用传递参数是String的,没有的话再去调用传递参数是object的方法。就是跟谁更亲调用谁。

这句话说的挺好。

二、重载“+”与StringBuilder

String是不可变对象,但是String对象可以适用“+”这个运算符,由于String的不可变性,当String类型对象会变化的时候,推荐适用StringBuilder

三、无意识的递归

有时候你不小心就会用递归了,比如ArrayList类型对象的toString方法就会遍历一圈,只不过你以为没有遍历而已。如果你真的想打印这个对象的地址,请用他父类Object的toString方法。

四、String上的操作

看API

五、格式化输出 1.运用printf()
System.out.printf("%d",x);

和C语言很相似

2.System.out.format()
public class Test {
    public static void main(String[] args) {
        int x = 5;
        double y = 5.332542;
        System.out.printf("%d  %f", x, y);
        System.out.format("%d  %f", x, y);
    }
}

format和printf是等价的哟

3.Formatter类

import java.io.PrintStream;
import java.util.Formatter;

public class Test {

    public static void main(String[] args) {
        PrintStream outAlias = System.out;
        Turtle tommy = new Turtle("Tommy", new Formatter(outAlias));
        Turtle terry = new Turtle("Terry", new Formatter(outAlias));
        tommy.move(0, 0);
        terry.move(4, 0);
    }
}

class Turtle {
    private String name;
    private Formatter f;

    public Turtle(String name, Formatter f) {
        this.name = name;
        this.f = f;
    }

    public void move(int x, int y) {
        f.format("%s The Turetle is ad (%d,%d)
", name, x, y);
    }
}

4.格式化说明符

import java.io.PrintStream;
import java.util.Formatter;

public class Test {

    public static void main(String[] args) {
        Receipt receipt = new Receipt();
        receipt.printTitle();
        receipt.print("Princess Peas", 3, 5.1);
    }
}

class Receipt {
    private double total = 0;
    private Formatter f = new Formatter(System.out);

    public void printTitle() {
        f.format("0123456789012345678901234567890
");
        f.format("%-15s %5s %10s
", "Item", "Qty", "Price");
        f.format("%-15s %5s %10s
", "----", "---", "-----");
    }

    public void print(String name, int qty, double price) {
        f.format("%-15.15s %5d %10.2f
", name, qty, price);
        total += price;
    }

}
5.Formatter转换


6.String.format

public class Test {

    public static void main(String[] args) {
        int x = 3;
        double y = 5.1231315;
        String result = String.format("[%d %.2f]", x, y);
        System.out.println(result);
    }
}
六、正则表达式

网上教程学

七、扫描输入

Java SE5新增了Scanner类。
看书

八、StringTokenizer

废弃

end

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67578.html

相关文章

  • Thinking in Java11 持有对象

    摘要:迭代器解决了这个问题。删除后于是我们可以写一个方法,接受一个类型,然后让他调用方法,这就不需要考虑这个是个还是了,也就是说,可以将遍历容器的操作与序列底层的结构分离,迭代器统一了对容器类的访问方式。十二和两种遍历的方法,与迭代器方法。 一、泛型和类型安全的容器 package tij.hoding; import java.util.ArrayList; public class ...

    v1 评论0 收藏0
  • Thinking in Java14 类型信息

    摘要:通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。编程应该尽量面向接口编程,应该对类型信息尽量的少了解二对象看书,书上写得好静态语句块在这个类被加载的时候运行。 一、为什么需要RTTI Run-Time Type Information。通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。编程应该尽量...

    tomorrowwu 评论0 收藏0
  • Thinking in Java10 内部类

    摘要:内部类中也可以取得这个外部类对象引用。创建成员内部类对象的时候需要外部类对象。另外在方法中的内部类不能加等权限修饰符,只能加和修饰符。可以在接口内部定义内部类,而且他们即使没有修饰,也会自动变成的。 Thinking in Java捞干货,写笔记 一、成员内部类 1.最基本使用 public class Demo { class Contents{ privat...

    Brenner 评论0 收藏0
  • Thinking in Java9 接口

    摘要:但如果导出类还有抽象方法,那这个类还应该加上声明为抽象类。并且接口具有继承的一系列特点,如向上转型等等。接口中的方法是自动是的。 Thinking in Java 好书全是干货 一、抽象类和抽象方法 抽象方法:这种方法只有声明而没有方法体,下面是抽象方法生命所采用的语法 abstract void f(); 包含抽象方法的类叫做抽象类,如果一个类包含一个或多个抽象方法,该类必须被限定为...

    CoorChice 评论0 收藏0
  • Thinking in Java12 通过异常处理错误

    摘要:异常处理程序抛出的异常必须在异常处理程序中得到处理。终止与恢复异常处理有两种模型,支持终止模型,一旦异常被抛出,表明错误无法挽回,无法退回来继续执行之前出错的代码。对于异常来说,最重要的部分就是类名。 一、概念 使用异常能降低处理错误代码的复杂程度,并且将错误在一个地方进行处理,于是将描述在正常行为过程中做过什么事的代码和出了问题怎么办的代码相分离 二、基本异常 异常情形指的是当前环境...

    miguel.jiang 评论0 收藏0

发表评论

0条评论

feng409

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<