首页 > 代码库 > 作业05 string

作业05 string

思考问题一:

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

技术分享

 

运行结果:

true

true

false

 

原因:

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

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

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

 

技术分享

 

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

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

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

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

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

思考问题2:

请查看String.equals()方法,学习其实现方法。

 

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {                      //判断anObject是不是String类的一个实例
String anotherString = (String)anObject;        //把anObject赋值给anotherString
int n = count;                                             //count是String的成员代表原始字符串长度
if (n == anotherString.count) { 
char v1[] = value;                                      //把原来的字符串和要比较的字符串以字符形式存入数组
char v2[] = anotherString.value; 
int i = offset;                                          //分别取数组下标
int j = anotherString.offset; 
while (n-- != 0) {                                   //遍历数组,比较 数组元素是否相同
if (v1[i++] != v2[j++])                          //在遍历的过程中如果有不同的就返回false
return false;


return true;                              //相等返回true
}
}
return false;                            //不是String实例返回false
}

 

思考问题3:

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

 

length():求字符串长度

public int length()

         String s=”asfsdfwfsadf”;

         System.out.println(s.length());

结果:12

charAt():

public charAt(int index)//index 是字符下标,返回字符串中指定位置的字符

        String s=”Hello”;

        System.out.println(s.charAt(3));

结果:l

 

getChars()获取从指定位置起的字串复制到字符数组中。

四个参数的含义
1.被拷贝字符在字串中的起始位置
2.被拷贝的最后一个字符在字串中的下标再加1
3.目标字符数组
4.拷贝的字符放在字符数组中的起始下标

getChars():public int getChars()//将字符从此字符串复制到目标字符数组

        String str = "abcdefghikl";

        Char[] ch = new char[8];

        str.getChars(2,5,ch,0);

      for(int=0;i<ch.length;i++)

         System.out.print(ch[i]);

结果:cd

 

replace():替换字符串

public int replace()

        String s=”\\\”;

        System.out.println(s.replace(“\\\”,”///”));

结果///;

toUpperase():将字符串全部转换成大写

public String toUpperCase()

         System.out.println(new String(“hello”).toUpperCase());

toLowerCse():将字符串全部转换成小写

public String toLowerCase()//将字符串全部转换成小写

         System.out.println(new String(“HELLO”).toLowerCase());

trim():去两边空格

public String trim()

         String x=”ax  c”;

         System.out.println(x.trim());//是去两边空格的方法

toCharArray():将字符串对象中的字符转换为一个字符数组

            String x=”abcd”;

           char myChar[]=x.toCharArray();

          System.out.println(“myChar[1]”+myChar[1]);

结果:b

 

程序题

古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:请编写一个程序,使用上述算法加密或解密用户输入的英文字串。

技术分享

 

1 程序设计思想

1)定义BufferedReader的对象reader并初始化;

2)输入字符串给aa;

3)字符串转化为字符数组给arr;

4)分情况加密:(1)字符是英文字母中的最后三个时,减23并赋值给字符数组;

                     (2)不是最后三个时加3并赋值给字符数组;

5)输出字符数组

 

2 流程图

技术分享

 

3 源代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Jiami {

@SuppressWarnings("null")
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
int i=0,n=0;
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));//定义BufferedReader对象

System.out.println("请输入一个字符串:");        
String aa=reader.readLine();//输入字符串
n=aa.length();

char arr[]=aa.toCharArray();//转化为字符数组

for( i=0;i<n;i++)

{
if((arr[i]>=88&&arr[i]<=90)||(arr[i]>=120&&arr[i]<=122)) //如果是 x,y,z时,减23

arr[i]=(char) (arr[i]-23);
else
arr[i]=(char)(arr[i]+3);         //加3
}


for( i=0;i<n;i++)               //输出
System.out.print(arr[i]);
}

}

 

4结果截图

技术分享技术分享技术分享

 

作业05 string