• 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);


    }

    }

    结果截图:

  • 相关阅读:
    [LeetCode] Power of Three 判断3的次方数
    [LeetCode] 322. Coin Change 硬币找零
    [LeetCode] 321. Create Maximum Number 创建最大数
    ITK 3.20.1 VS2010 Configuration 配置
    VTK 5.10.1 VS2010 Configuration 配置
    FLTK 1.3.3 MinGW 4.9.1 Configuration 配置
    FLTK 1.1.10 VS2010 Configuration 配置
    Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别
    [LeetCode] Bulb Switcher 灯泡开关
    [LeetCode] Maximum Product of Word Lengths 单词长度的最大积
  • 原文地址:https://www.cnblogs.com/xxdcxy/p/6006993.html
Copyright © 2020-2023  润新知