动手动脑

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

s0,s1,s2字符串的内容相同,实际占用的是同一空间,引用的是同一个对象,所以前两个为true。而第三个中。两个“Hello”分别开辟了新的空间,引用的不同的对象,所以为false。

总结:

  • Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0s1s2实际上引用的是同一个对象。
  • 编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。
  • 当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。

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

执行完s1+=”b”后,开辟新的空间来存储s1的内容”ab”,但此时s2内容仍然是”a”,所以s1==s2为false;第三句字符串”ab”是一个独立的常量,它与s1引用的字符串无关。

注意:字符串变量只是字符串的管理者,而非字符串本身。所有的字符串都是不可变的,对他们的操作结果都是制造新的字符串出来。

总结:

  • 给字串变量赋值意味着:两个变量(s1s2)现在引用同一个字符串对象“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:字串加密

  • 古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

请编写一个程序,使用上述算法加密或解密用户输入的英文字串。

  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的更多相关文章

  1. java笔记04: String的理解与运用

    一,“==”与equals() 运行以下代码,如何解释其输出结果? public class StringPool { public static void main(String args[]) { ...

  2. 【转】string.Format对C#字符串格式化

    转自:http://blog.csdn.net/samsone/article/details/7556781 1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) str ...

  3. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  4. string.Format格式化用法详解

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  5. C#中string.format的格式和用法

    String.Format 方法的几种定义: String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的文本等效项. Str ...

  6. string.Format之你不知道的事

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  7. C# String.Format大全 去 decimal 后面的 0

    转 http://kwon.iteye.com/blog/1068255  http://blog.csdn.net/tvvbbb/article/details/47256943 public st ...

  8. c# string.Format用法总结

    文章出处:http://www.cnblogs.com/7788/archive/2009/05/13/1455920.html 先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默 ...

  9. string.Format 格式化时间,货币

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  10. Java String Class Example--reference

    reference:http://examples.javacodegeeks.com/core-java/lang/string/java-string-class-example/ 1. Intr ...

随机推荐

  1. RabbitMQ-工作原理

    使用场景 在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中,而不是像几年前一样页面卡死或报错给用户. 像这种排队结算就用到了消息队列机制,放入通道里面一个一个结算处理,而不是某个时间断突然涌入大批量 ...

  2. Linux 内核接口

    USB 端点被绑在接口中. USB 接口只处理一类 USB 逻辑连接, 例如一个鼠标, 一个键盘, 或者一个音频流. 一些 USB 设备有多个接口, 例如一个 USB 扬声器可能有 2 个接口: 一个 ...

  3. CF809D Hitchhiking in the Baltic States

    CF809D Hitchhiking in the Baltic States CF809D 长度为n的序列{xi},n<=3e5,范围在(li,ri)之间,求LIS最长是多长g(i,l)表示前 ...

  4. 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明(转)

    1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...

  5. Keras cnn 手写数字识别示例

    #基于mnist数据集的手写数字识别 #构造了cnn网络拟合识别函数,前两层为卷积层,第三层为池化层,第四层为Flatten层,最后两层为全连接层 #基于Keras 2.1.1 Tensorflow ...

  6. centos7靶机获取不到ip

    尝试了好多方法都获取不到靶机ip: 1.首先检查网络链接是否正常 2.重启网卡  /etc/init.d/network restart 3.修改网卡ONBOOT=yes vi /etc/syscon ...

  7. 服务发现之eureka

    一.什么是服务发现? 问题: 我们现在有多少个服务? 服务越来越多时,服务 URL 配置管理变得非常乱 服务对外的地址变了,其他所有有使用到的服务都要改地址 增加服务,增加服务实例等,都要做运维工作 ...

  8. DOCKER学习_005:Flannel网络配置

    一 简介 Flannel是一种基于overlay网络的跨主机容器网络解决方案,也就是将TCP数据包封装在另一种网络包里面进行路由转发和通信, Flannel是CoreOS开发,专门用于docker多机 ...

  9. 如何利用腾讯云COS为静态博客添加动态相册

    前言 本文首发于个人网站Jianger's Blog,欢迎访问订阅.个人博客小站刚建站不久,想着除了主题里的功能外再添加上相册模块,于是半搜索半摸索把相册模块搞出来了,最后采用了利用腾讯云对象存储作图 ...

  10. lintcode入门37-算法实现

    lintcode入门级算法题37 一.题目 反转一个3位整数 反转一个只有3位数的整数. 样例          样例 1: 输入: number = 123 输出: 321         样例 2 ...