Java-字符串

1. 不可变String

String是不可变的,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动

public class Immutable {
   public static String upcase(String s){
       return s.toUpperCase();
   }

   public static void main(String[] args) {
       String q = "howdy";
       System.out.println(q);
       String qq = upcase(q);
       System.out.println(qq);
       System.out.println(q);
   }
}

当把q传给upcase()方法时,实际传递的是引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未动过。

回到upcase()的定义,传入其中的引用有了名字s,只有upcase()运行的时候,局部引用s才存在。一旦upcase()运行结束,s就消失了。当然了,upcase()的返回值,其实只是最终结果的引用。这足以说明,upcase()返回的引用已经指向了一个新的对象,而原本的q则还在原地

2. 重载“+” 和StringBuilder

重载的意思是,一个操作符在引用于特定的类时,被赋予了特殊的意义(用于String的“+”与“+=”是Java中仅有的两个重载过的操作符,而Java并不允许成员重载任何操作符)

操作符“+”可以用来连接String:

public class Contatenation {
    public static void main(String[] args) {
        String mango = "mango";
        String s = "abc" + mango + "def" + 47;
        System.out.println(s);
    }
}
public class UsingStringBuilder {
    public static Random rand = new Random(47);
    public String toString(){
        StringBuilder result = new StringBuilder("[");
        for(int i = 0; i < 25;i++){
            result.append(rand.nextInt(100));
            result.append(", ");
        }

        result.delete(result.length()-2,result.length());
        result.append("]");
        return result.toString();
    }

    public static void main(String[] args) {
        UsingStringBuilder usb = new UsingStringBuilder();
        System.out.println(usb);
    }
}

StringBuilder提供了丰富而全面的方法,包括insert()、replace()、substring()甚至reverse(),但最常用的还是append()和toString()。还有delete()方法。

3.格式化输出

JavaSE5引入的format方法可用于PrintStream或PrintWriter对象,其中也包括System.out对象。

public class SimpleFormat {
    public static void main(String[] args) {
        int x = 5;
        double y = 5.332542;
        System.out.println("Row 1: [ " + x + " " + y + "]");
        System.out.format("Row 1: [%d %f]\n" ,x,y);
        System.out.printf("Row 1: [%d %f]\n" ,x,y);
    }
}

format()与printf()是等价的,它们只需要一个简单的格式化字符串,加上一串参数即可,每个参数对应一个格式化修饰符

在Java中,所有新的格式化功能都由java.util.Formatter 类处理。可以将Formatter看作一个翻译器,它将你的格式化字符串与数据翻译称需要的结果,当你创建一个Formatter对象的时候,需要向其构造器传递一些信息,告诉它最终的结果将向哪里输出

public 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 Turtle is at (%d,%d)\n",name,x,y);
    }

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

4. 扫描输入

从文本或标准输入读取数据还是一件相当痛苦的事情。一般的解决之道就是读入一行文本,对其进行分词,然后使用Integer、Double等类的各种解析方法来解析数据

public class SimpleRead {
    public static BufferedReader input = new BufferedReader(new StringReader("Sir Robin of Camelot\n 22 1.61803"));

    public static void main(String[] args) {
        try {
            System.out.println("What is your name?");
            String name = input.readLine();
            System.out.println(name);
            System.out.println("How old are you ? what is your favorite double?");
            System.out.println("(input:<age> <double>");
            String numbers = input.readLine();
            System.out.println(numbers);
            String[] numArray = numbers.split(" ");
            int age = Integer.parseInt(numArray[0]);
            double favorite = Double.parseDouble(numArray[1]);
            System.out.format("Hi %s.\n",name);
            System.out.format("In 5 years you will be %d.\n",age+5);
            System.out.format("My favorite double is %f.",favorite/2);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Scanner的构造器可以接受任何类型的输入对象,包括File对象、InputStream、String或者下面例子中的Readable对象。

public class BetterRead {
    public static void main(String[] args) {
        Scanner stdin = new Scanner(SimpleRead.input);
        System.out.println("What is your name?");

        String name = stdin.nextLine();
        System.out.println(name);
        System.out.println("How old are you ? what is your favorite double?");
        System.out.println("(input:<age> <double>");

        int age = stdin.nextInt();
        double favorite = stdin.nextDouble();
        System.out.println(age);
        System.out.println(favorite);
        System.out.format("Hi %s.\n",name);
        System.out.format("In 5 years you will be %d.\n",age+5);
        System.out.format("My favorite double is %f.",favorite/2);
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring - 泛型依赖注入(9)

    桑鱼
  • Spring - 通过注解配置Bean(8)

    特定组件包括: Component:基本注解,标识了一个受Spring管理的组件 Respository:标识持久层组件 Service: 标识服务层(业...

    桑鱼
  • TestNG用法概括

    应用场景:将通用的功能抽取并封装起来,在方法中使用注解@BeforeSuite和@AfterSuite,在测试类中继承这个类,测试类在运行前会先运行@Befor...

    桑鱼
  • Java之面向对象例子(一)

    定义一个人类,给这个类定义一个从身份证获取生日的方法,输入身份证,获取出生年月日 //主方法 package com.hanqi.maya.model; imp...

    二十三年蝉
  • java_String类、StringBuilder类、Arrays类、Math类的使用

    java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例

    咕咕星
  • Java反射知识

    (2)Class类对象阶段:*.class字节码文件被类加载器加载进内存,并将其封装成Class对象(用于在内存中描述字节码文件),Class对象将原字节码文件...

    乐心湖
  • 看懂今天这个!你就是个真正的javaer!

    在过去的几天里,你已经学会了一些java的语言特性以及面向对象思想,今天猿人工厂君,要带你完成一个华丽的转身变成一个——

    山旮旯的胖子
  • 有点干货 | Jdk1.8新特性实战篇(41个案例)

    一直想把jdk1.8的新特性整理下,恰好看到老外的git(文后有链接),在这个结构上继续完善了说明和功能,做了41个单元测试案例,方便新人学习。以下内容很干,对...

    小傅哥
  • 【原创】万字长文带你了解 JDK8 - JDK13 的新特性

    某次面试中,面试官问到我这个问题,只勉强说出了 JDK 8 的部分特性,今天就来盘一盘!

    良月柒
  • 简化Java编程的法宝,让工作更高效

    上篇文章介绍到了HuTool项目中提供的一些组件,但HuTool的功能可远不止如此,接下来,我将介绍HuTool为我们提供的一些便捷工具。

    wangweijun

扫码关注云+社区

领取腾讯云代金券