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

s0,s1,s2字符串的内容相同,实际占用的是同一空间,引用的是同一个对象,所以前两个为true。而第三个中。两个“Hello”分别开辟了新的空间,引用的不同的对象,所以为false。
总结:
- 在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
- 编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。
- 当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。

为什么会有上述的输出结果?从中你又能总结出什么?
执行完s1+=”b”后,开辟新的空间来存储s1的内容”ab”,但此时s2内容仍然是”a”,所以s1==s2为false;第三句字符串”ab”是一个独立的常量,它与s1引用的字符串无关。
注意:字符串变量只是字符串的管理者,而非字符串本身。所有的字符串都是不可变的,对他们的操作结果都是制造新的字符串出来。
总结:
- 给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!
- String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;
- 代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
- String.equals()方法可以比较两个字符串的内容。
2.请查看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;
}
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 String trim() {
int len = value.length;
int st = 0;
char[] val = value; /* avoid getfield opcode */
while ((st < len) && (val[st] <= ' ')) {
st++;
}
while ((st < len) && (val[len - 1] <= ' ')) {
len--;
}
return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}
public String toUpperCase() {
return toUpperCase(Locale.getDefault());
}
public String concat(String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new String(buf, true);
}
代码:
//信1605-2 王金萱 20163588
public class MyCounter {
private int m;
public MyCounter(int m)
{
this.m=m;
}
public MyCounter increase(int a)
{
System.out.print(m+"+");
this.m=m+a;
System.out.println(a+"="+this.m);
return this;
}
public MyCounter decrease(int a)
{
System.out.print(m+"-");
this.m=m-a;
System.out.println(a+"="+this.m);
return this;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MyCounter counter1=new MyCounter(5);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
} }
执行结果:

课后作业1:字串加密
- 古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

请编写一个程序,使用上述算法加密或解密用户输入的英文字串。
- 设计思想
用户先选择是要加密还是解密。
加密:用户输入英文字串,程序根据密钥key=3将每个字母对应后移三位来达到加密的效果,输出加密后的英文字串。
解密:用户输入已加密的英文字串,程序根据密钥key=3将每个字母对应前移三位来达到解密的效果,输出解密后的英文字串。
2. 程序流程图


3. 源代码
//信1605-2 王金萱 20163588
import java.util.Scanner;
public class password { public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int choose=0;
String mingwen,jiami;
char array1[]=new char[100];
char array2[]=new char[100];
String output="";
do
{
System.out.println("请选择:1-加密 2-解密");
choose=in.nextInt();
if(choose==1)
{
//加密 key=3
System.out.println("请输入要加密的明文:");
mingwen=in.next();
array1=mingwen.toCharArray(); for(int i=0;i<array1.length;i++)
{
if(array1[i]>='a'&&array1[i]<='z'||array1[i]>='A'&&array1[i]<='Z')
{ if(array1[i]>=97&&array1[i]<120||array1[i]>=65&&array1[i]<88)
{
array1[i]+=3;
output+=array1[i];
}
else if(array1[i]>=120&&array1[i]<=122||array1[i]>=88&&array1[i]<=90)
{
array1[i]-=23;
output+=array1[i];
}
}
else
{
System.out.println("请输入英文字母!");
return;
}
}
System.out.println("加密后:");
System.out.println(output);
}
else if(choose==2)
{
//解密 key=3
System.out.println("请输入密文:");
jiami=in.next();
array2=jiami.toCharArray();
for(int i=0;i<array2.length;i++)
{
if(array2[i]>='a'&&array2[i]<='z'||array2[i]>='A'&&array2[i]<='Z')
{ if(array2[i]>=100&&array2[i]<=122||array2[i]>=68&&array2[i]<=90)
{
array2[i]-=3;
output+=array2[i];
}
else if(array2[i]>=97&&array2[i]<100||array2[i]>=65&&array2[i]<68)
{
array2[i]+=23;
output+=array2[i];
}
}
else
{
System.out.println("请输入英文字母!");
return;
} }
System.out.println("解密后的明文:");
System.out.println(output);
}
else
{
System.out.println("输入错误!");
}
}while(choose!=1&&choose!=2);
} }
执行结果:



课后作业二
整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明、阅读笔记。
Length():获取字串长度
charAt():获取指定位置的字符
getChars():获取从指定位置起的子串复制到字符数组中(它有四个参数)
replace():子串替换
toUpperCase()、 toLowerCase():大小写转换
trim():去除头尾空格:
toCharArray():将字符串对象转换为字符数组
04-String的更多相关文章
- java笔记04: String的理解与运用
一,“==”与equals() 运行以下代码,如何解释其输出结果? public class StringPool { public static void main(String args[]) { ...
- 【转】string.Format对C#字符串格式化
转自:http://blog.csdn.net/samsone/article/details/7556781 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) str ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- string.Format格式化用法详解
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- C#中string.format的格式和用法
String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. Str ...
- string.Format之你不知道的事
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- C# String.Format大全 去 decimal 后面的 0
转 http://kwon.iteye.com/blog/1068255 http://blog.csdn.net/tvvbbb/article/details/47256943 public st ...
- c# string.Format用法总结
文章出处:http://www.cnblogs.com/7788/archive/2009/05/13/1455920.html 先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默 ...
- string.Format 格式化时间,货币
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- Java String Class Example--reference
reference:http://examples.javacodegeeks.com/core-java/lang/string/java-string-class-example/ 1. Intr ...
随机推荐
- Activiti工作流引擎学习(一)
1.部署对象和流程定义相关表:RepositoryService act_re_deployment: 部署对象表:一次部署的多个文件的信息,对于不需要的流程可以删除和修改 act_re_procde ...
- Linux 内核PCI去除一个驱动
去除一个驱动是一个非常容易的动作. 对于一个 PCI 驱动, 驱动调用 pci_unregister_driver 函数. 这个函数只调用驱动核心函数 driver_unregister, 使用 一个 ...
- jedis 连接池工具类
maven <properties> <jedis.version>3.0.1</jedis.version> <junit.verion>4.12&l ...
- Android Library的依赖方式及发布(转)
还是那句老话,好记性不然烂笔头,在此整理 Android Studio 依赖相关 以及 如何发布项目到 JCenter Android Studio 添加依赖Module 依赖module 依赖是指在 ...
- 基于MIG IP核的DDR3控制器(二)
上一节中,记录到了ddr控制器的整体架构,在本节中,准备把ddr控制器的各个模块完善一下. 可以看到上一节中介绍了DDR控制器的整体架构,因为这几周事情多,又要课设什么的麻烦,今天抽点时间把这个记录完 ...
- 使用Gson中的JsonElement所遇到的坑
使用Gson中的JsonElement所遇到的坑 原文链接: https://blog.csdn.net/weixin_30326515/article/details/98196013 声明:此博客 ...
- 0016 CSS 背景:background
目标 理解 背景的作用 css背景图片和插入图片的区别 应用 通过css背景属性,给页面元素添加背景样式 能设置不同的背景图片位置 [插入图片,不用设置img元素的父元素.自身元素大小,即可见,但是背 ...
- TCP/IP||UDP广播和多播
1.概述 广播和多播应用于UDP,TCP是一个面向连接协议,意味着分别运行与两个主机内的两进程间存在一个连接,在考虑多个主机内的共享通信网络,每个以太网帧包含源主机和目的主机以太网地址(48bit), ...
- 使用svndumpfilter exclude来清理svn库的废弃文件实现差别备份
先啰嗦下为什么要使用svndumpfilter… svn库用久了以后就会越来越大,进行整体文件打包备份的时候,发现压力山大…尤其是美术团队也在使用svn进行重要美术资源管理的时候…….几百g的资源 ...
- IntelliJ IDEA使用说明
1.IntelliJ IDEA简介: IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提 ...