1.

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

输出结果:

结论:

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

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

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

java在用“=="比较两个对象时,是比较的这两个对象的地址,不是他们的内容。

2.为什么会有这样的输出结果?从中你又能总结出什么?

.

结论:

java对于简单类型变量的赋值是按值传递。就是说直接把数值存放到变量的存储单元里。对于引用类型的变量,赋值是把原对象的引用(可以理解为入口地址),存放在变量的存储单元里。

equals()是比较内容的函数。

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

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

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

public boolean equals(Object anObject){

  if(this==anObject){

    return true;

  }

  if(anObject instanceof String){

    String anotherString =(String)anObject;

    int n=value.length;

    if(n==anotherString.value.length){

      char v1[]=value;

      char v2[]=anotherString .value;

      int i=0;

      while(n-- !=0){

        if(v1[i] !=v2[i])

        return false;

        i++

      }

      return true;

    }

  }

  return false;

}

(1)判定传入的对象和当前对象是否为同一个对象,如果是就直接返回true.

(2) 判定传入的类型值是否为String,若不是则返回false;

(3)判定传入的String与当前的String的长度都是否一致,若不一致就返回false;

(4)循环对比两个字符串的char[]数组,逐个对比字符是否一致,若存在不一致的情况,则直接返回false;

(5)循环结束都没有找到不匹配的,所以最后返回true;

4.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);

toUpperCase():大小写转换

trim():去除头尾空格:

concat():可以将2个字符串拼接到一块

public class MyCounter {
  int i;
  MyCounter(int n){
    i=n;
  }
  public MyCounter increase(int n) {
    this.i=this.i+n;
    return this;
  }
  public MyCounter decrease(int n) {
    this.i=this.i-n;
    return this;
  }

  public static void main(String[] args) {

    MyCounter counter1=new MyCounter(1);
    MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
    System.out.println("counter2.i="+counter2.i);

  }

}

结果截图:

5.整理String类的Length()、charAt()、 getChars()、replace()、toLowerCase()、toCharArray()

Length():用于获取字符串长度。如:String str = "Hello World Java";int lenStr = str.length();//此处lenStr=16

charAt():返回指定位置的字符。如:String s ="abc";System.out.println(s.charAt(1));//输出b

getChars(int start,int end,char c[],int offset): 将当前字符串从start到end-1位置上的字符复制到字符数组c中,并从c的offset处开始存放。如:  String s=new String("巴西        足球队击败德国足球队";char[] c=new char[s.length()];s.getChars(7,12,c,0);System.out.println(c);//输出结果是德国足球队。

replace(char oldChar,char newChar):替换后生成的新字符串。如:String str=new String("hello");System.out.println(str.replace('o','T'));//输出hellT

toLowerCase():大写的换小写,小写的换大写。如:String  cc = “aBc123”.toUpperCase();//cc是:ABC123。

toCharArray():字符串转换为字符数组。如:String s1=new String("我是中国人");char[] c=s1.toCharArray();

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

(1)设计思想:

输入一个String型字符串,用toCharArray()转化成字符数组,利用循环字符数组中的每个字符ASSCII值加3,然后再转换成String型字符串。输出字符串。

(2)程序流程图

(3)程序源代码

import java.util.Scanner;
public class Jiami {

  public static void main(String[] args) {
    System.out.print("请输入邮件内容:");
    Scanner scanner=new Scanner(System.in);
    String s=scanner.nextLine();
    char[] l=s.toCharArray();
    System.out.print("加密后的邮件内容为:");
    for(int i=0;i<l.length;i++) {
    int temp=l[i];
    temp=temp+3;
    l[i]=(char)temp;
    System.out.print(l[i]);
    }

  }

}

结果截图:


 

java课后思考题(四)的更多相关文章

  1. Java课后思考题

    1.简述path和classpath的区别. path:path环境变量是系统环境变量中的一种,它用于保存一系列可执行文件的路径,每个路径之间以分号分隔.当在命令行窗口运行一个可执行文件时,操作系统首 ...

  2. java课后思考题(三)

    1.以下代码为何无法通过编译?哪儿出错了? 因为在Foo类中已经有了一个Foo类的有参构造函数,所以Foo类中已经不默认Foo()的无参构造函数,所以在new Foo()时无法调用构造函数.所以在无法 ...

  3. java课后思考题(五)

    1.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件. import java.io.IOException;import java.nio.fil ...

  4. java课后思考题(六)

    1.使用Files. walkFileTree()找出指定文件夹下所有扩展名为.txt和.java的文件. import java.io.IOException;import java.nio.fil ...

  5. Java线程间通信方式剖析——Java进阶(四)

    原创文章,同步发自作者个人博客,转载请在文章开头处以超链接注明出处 http://www.jasongj.com/java/thread_communication/ CountDownLatch C ...

  6. JAVA基础学习之throws和throw的区别、Java中的四种权限、多线程的使用等(2)

    1.throws和throw的区别 throws使用在函数外,是编译时的异常,throw使用在函数内,是运行时的异常 使用方法 public int method(int[] arr) throws ...

  7. JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

    简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...

  8. 九天学会Java,第四天,循环结构

    变量和数据类型,赋值和输出 算术运算 选择结构 循环结构 函数定义,函数调用 变量作用域 栈,程序运行的基石 面向对象 异常处理 语言提供的公用包 这次我们讲Java的循环结构.循环结构在编程中广泛使 ...

  9. java面向对象中四种权限(private,protected,public,友好型)详解

    转自http://blog.csdn.net/a1237871112/article/details/50926975 及http://blog.csdn.net/blackmanren/articl ...

随机推荐

  1. R: 关于 ggplot2 的初探

    生活还很长,别急,慢慢来.亲爱的 require(ggplot2)p1 <- ggplot(mpg, aes(displ, hwy)) + geom_point() ; p1p1 + scale ...

  2. Luogu 3626 [APIO2009]会议中心

    很优美的解法. 推荐大佬博客 如果没有保证字典序最小这一个要求,这题就是一个水题了,但是要保证字典序最小,然后我就不会了…… 如果一条线段能放入一个区间$[l', r']$并且不影响最优答案,那么对于 ...

  3. Luogu 3193 [HNOI2008]GT考试

    BZOJ1009 妙! 推荐这篇题解: https://www.luogu.org/blog/Edgration/solution-p3193 考虑设计dp,设$f_{i, j}$表示长串匹配到i,短 ...

  4. java的import关键字的使用

    在java中如何使用Java包中自带的类呢? 方法一: 在使用时可以用Java.(包名).(方法名).(包中的类名): 例如:Java.util.Arrays.toString(某个要排序数组); 具 ...

  5. idea中解决Error:java: Compilation failed: internal java compiler error的问题

    项目中,使用gradle做项目构建,当我们想更改JDK的版本时,报以下错误: Information:Using javac 1.8.0_111 to compile java sourcesInfo ...

  6. Linux中的sed解析

    简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...

  7. JSP或者说是JSP翻译引擎

    JSP最终输出就是底层去继承Servlet,然后输出JSP页面上的内容而已,不明白了看第六条. 页面java脚本,也就是JSP页面上写JAVA代码如下:  

  8. VMWare虚拟机无法打开内核设备"\\.\Global\vmx86"的解决方法

    cmd执行: 1.net start vmci 2.net start vmx86 3.net start VMnetuserif

  9. ASP.NET网页之间传递参数与值

    ASP.NET网页之间传递参数与值,方法很多,可以使用Application,Cookie,Session,或是Querystring等等.由于Insus.NET开发的程序中,多数是在后台之间进行参数 ...

  10. 十天入门java教程 Day02

    1,常量,变量的理解 常量,程序运行过程中,不能改变的,叫常量. 变量,程序运行过程中,改变的,叫变量. 2,变量的理解 变量,用来存储数据的,数据类型,存放哪种数据的种类. 变量的概念:程序运行期间 ...