• Java课堂练习5


    动手动脑1:

    请运行以下示例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?

    结果:

    true
    true
    false

    结论:

    1.在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。

    2.编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。

    3.当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。

    再看……

    为什么会有上述的输出结果?从中你又能总结出什么?

    1.给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!

    2.String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;

    3.代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。

    4.String.equals()方法可以比较两个字符串的内容。

    动手动脑2:

    请查看String.equals()方法的实现代码,注意学习其实现方法。



    public class StringEquals {


    /**
    * @param args the command line arguments
    */

    public static void main(String[] args) {

    String s1=new String("Hello");

    String s2=new String("Hello");


    System.out.println(s1==s2);

    System.out.println(s1.equals(s2));


    String s3="Hello";

    String s4="Hello";


    System.out.println(s3==s4);

    System.out.println(s3.equals(s4));
    }

    }

    结果:

    false
    true
    true
    true

         首先为s1寻找String缓冲池内是否有与"Hello"相同值的String对象存在,此时String缓冲池内是空的,没有相同值的String对象存在,所以虚拟机会在String缓冲池内创建此String对象,其动作就是new String("Hello");。然后把此String对象的引用赋值给s1。
         接着为s2寻找String缓冲池内是否有与"Hello"相同值的String对象存在,此时虚拟机找到了一个与其相同值的String对象,这个String对象其实就是为s1所创建的String对象。既然找到了一个相同值的对象,那么虚拟机就不在为此创建一个新的String对象,而是直接把存在的String对象的引用赋值给s2。
     
    针对String作为一个基本类型来使用:
     
    1。如果String作为一个基本类型来使用,那么我们视此String对象是String缓冲池所拥有的。
    2。如果String作为一个基本类型来使用,并且此时String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。
    3。如果String作为一个基本类型来使用,并且此时String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。
     
    针对String作为一个对象来使用:
     
    1。如果String作为一个对象来使用,那么虚拟机将为此创建一个新的String对象,即为此对象分配一块新的内存堆,并且它并不是String缓冲池所拥有的,即它是独立的。

    动手动脑3:

    String类的方法可以连续调用: String str="abc"; String result=str.trim().toUpperCase().concat("defg");

    请阅读JDK中String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为: MyCounter counter1=new MyCounter(1); MyCounter counter2=counter1.increase(100).decrease(2).increase(3);

    public class Stringlianxi {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String str="abc";
    String result=str.trim().toUpperCase().concat("defg");
    System.out.println(result);
    }

    }

    结果:

    ABCdefg

    package text3;

    public class Stringpool {

    public static void main(String[] args) {
    // TODO Auto-generated method stub

    MyCounter counter1=new MyCounter();
    MyCounter counter2=new MyCounter();
    counter1.set(1);
    counter2=counter1.increase(100).decrease(2).increase(3);
    System.out.println(counter2.data);//注意此处不能写成counter2,否选择输出结果为哈希值


    }

    }
    class MyCounter
    {
    int data;
    public void set(int d)
    {
    data=d;
    }
    public MyCounter increase(int i)
    {
    MyCounter a=new MyCounter();
    a.data=data+i;
    return a;
    }
    public MyCounter decrease(int d)
    {
    MyCounter a=new MyCounter();
    a.data=data-d;
    return a;
    }
    }

    结果:

    102

    整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明。

    Length():获取字串长度,字符串是一个对象,在这个对象中包含length属性,它是该字符串的长度,使用String类中的length()方法可以获取该属性值。

    charAt():获取指定位置的字符

    getChars():获取从指定位置起的子串复制到字符数组中(它有四个参数,1.被拷贝字符在字串中的起始位置 2.被拷贝的最后一个字符在字串中的下标再加1 3.目标字符数组 4.拷贝的字符放在字符数组中的起始下标)

    replace():子串替换,通过String类的replace()方法,可以将原字符串中的某个字符替换为指定的字符,并得到一个新的字符串,该方法的具体定义如下:public String replace(char oldChar,char newChar)

    toUpperCase()、 toLowerCase():大小写转换,在String类中提供了两个用来实现字母大小写转换的方法,它们的返回值均为转换后的字符串,其中toLowerCase()用来将字符串中的所有大写字母改为小写字母,,方法toUpperCase()用来将字符串中的所有小写字母改为大写字母。

    trim():去除头尾空格,通过String类的trim()方法,可以通过去掉字符串的首尾空格得到一个新的字符串,该方法的具体定义如下:public String trim()

    toCharArray():将字符串对象转换为字符数组

    古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

    请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想、程序流程图、源代码、结果截图。

    程序设计思想:

    输入要加密的子串str,定义字符串长度,将字符串转化为单个字符,每个字符+3,向后移3个,每个字符-3,向前移3个,定义str1,将新得到的每个字符加到str1后,得到加密后的英文子串str1,输出加密后的子串str1。

    程序流程图:

    源代码:

    package text3;
    import java.util.Scanner;
    public class Stringpool {

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    Scanner input=new Scanner(System.in);
    System.out.println("请输入英文子串:");
    String str;
    int n=0;
    str=input.nextLine();//nextLine接受一行数据
    n=str.length();
    char a;
    int n1=0;
    String str1=new String();

    for(int i=0;i<n;i++)
    {
    a=str.charAt(i);//获取指定位置的字符串


    a=(char)(a+3);

    str1=str1+a;



    }
    System.out.println("加密后的子串是: "+str1);


    }

    }

    结果截图:

  • 相关阅读:
    黑盒测试用例设计方法
    摄像头--用例设计
    单元测试框架unittest
    ES集群启动流程
    ES 系统模型
    HBase 体系结构
    HBase 数据模型
    引用中间件导致的OOM问题调查
    BeanDefinition注册逻辑解析
    spring xml 解析bean配置文件为beanDefinition过程
  • 原文地址:https://www.cnblogs.com/xxdcxy/p/6006993.html
Copyright © 2020-2023  润新知