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. docker学习(2)基本命令

    原文地址:http://blog.csdn.net/we_shell/article/details/38368137 1. 查看docker信息(version.info) # 查看docker版本 ...

  2. Luogu 4206 [NOI2005]聪聪与可可

    BZOJ 1415 简单期望 + 记忆化搜索. 发现聪聪每一步走向的地方是在可可的所在位置确定时是确定的,设$nxt_{x, y}$表示聪聪在$x$,可可在$y$时聪聪下一步会走到哪里,我们先预处理出 ...

  3. Entity Framework Tutorial Basics(13):Database First

    Database First development with Entity Framework: We have seen this approach in Create Entity Data M ...

  4. Entity Framework Tutorial Basics(6):Model Browser

    Model Browser: We have created our first Entity Data Model for School database in the previous secti ...

  5. Servlet处理表单数据

    Servlet 表单数据 很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. 使用 ...

  6. 自动化打包资源混淆集成python实践----资源混淆

    前面自动化打包资源混淆集成python实践----打包一文讲述了四种打包方案,以及美团打包方案.apk注释添加渠道号方案的实现.这里讲集成资源混淆. 1.资源混淆带来的好处: 1)对资源文件起一定的保 ...

  7. Chrome Plugin Recommendation

    1.AdBlock 拦截广告神器 2.IPBlade 变更IP地址,使你自由 3.JSON-handle 让接口返回的JSON数据更好看 4.Proxy SwitchyOmega 变更浏览器代理 5. ...

  8. meta常用命令

    sessions -i 1用于查看你控制的电脑

  9. 几款Web服务器性能压力测试工具

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载. 但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般 ...

  10. django中将views.py中的python方法传递给html模板文件

    常规的模板渲染 from django.db import models # Create your models here. class ArticalType(models.Model): cap ...