jdk源码学习之String,手动实现一个String

package com.amazing.jdk.string_2017_12_31;

import java.io.Serializable;
import java.util.Arrays; /**
* Created by yaming on 17-12-31.
*/
public final class MyString implements Serializable{
private final char value[];//数组
private int hash;
private static final long serialVersionUID = -6849794470754667710L; public MyString() {
this.value =new char[];
} public MyString(char[] value) {
this.value = value;
} /**
* 返回String长度
* @return
*/
public int length(){
return value.length;
} /**
* 取得该位置上的char
* @param index
* @return
*/
public char charAt(int index){
if(index<|| index>=value.length)
throw new StringIndexOutOfBoundsException();
return value[index];
} /**
* 实现comparable接口,实现compareTo方法。
* 按词典比较String的内容,结果正,负,零。大小写不等价
* 思想:
* 从第一个字符开始比较。
* 比较次数是长度小的字符串长度
* 如果前面都相同,比较字符串长度
* @param another
* @return
*/ public int compareTo(MyString another) {
int len1=value.length;
char[] str1=value;
int len2=another.value.length;
char[] str2=another.value; int min=Math.min(len1,len2);
int k=;//从第一个字符开始比较
while (k<min){
char c1=str1[k];
char c2=str2[k];
if (c1!=c2){
/*
字符类型可以比较大小,返回值int类型
char a='a';
char b='b';
System.out.println(a-b);
*/
return c1-c2;
}
}
return len1-len2;
} /**
* String重写了equals方法。
* 比较的是两个的值是否相同
* 步骤:
* 1.用==比较是不是同一个字符串。如果是那字符串的值肯定相同
* 2.判断要比较的类型是否相同,不相同的话。肯定不同
* 3.类型相同后,判断字符串的长度是否相同.不相同肯定不同
* 4.从第一个字符开始比较,直到把原字符串比较完,只要有一个不相同,就不相同
* @return
*/
public boolean equals(Object object){
//如果是同一个对象,值肯定相同
if (this==object){
return true;
}
//判断类型是否相同
if(object instanceof MyString){
MyString str= (MyString) object;
int len=value.length;
//判断字符串长度是否相同
if(len==str.value.length){
char v1[]=value;
char v2[]=str.value;
int k=;
while (k<=len){
if(v1[k]!=v2[k]){
return false;
}
k++;
}
return true;
}
}
return false;
} /**
* 从dstBegin开始,将这个字符串中的字符复制到dst中。
* @param dst
* @param dstBegin
*/
private void getChars(char dst[], int dstBegin) {
System.arraycopy(value, , dst, dstBegin, value.length);
}
/**
* 链接字符串,功能相当于 + 号
* 返回的是新创建的字符串
* 步骤:
* 1.定义一个新的字符数组,长度是两个字符串长度之和
* 2.把原来字符串中数据复制到新的数组中
* 3.再把要拼接的字符串加在数组后半段
* @param string
* @return
*/
public MyString concat(MyString string){
int otherLen=string.length();
if(otherLen==){
return this;
}
int len=value.length;
/*
复制指定数组到新数组中
*/
char[] buf= Arrays.copyOf(value,otherLen+len);
/*
把string里的字符串从len位置开始放到buf里
*/
string.getChars(buf,len);
return new MyString(buf);
} /**
* 返回此字符串的hash码
* @return
*/
public int hashCode(){
int h = hash;
if (h == && value.length > ){
char val[] = value;
for (int i = ; i <value.length ; i++) {
h= *h + val[i];
}
hash = h;
}
return h;
}
public void toMyString(){
for (int i = ; i <value.length ; i++) {
System.out.print(value[i]);
}
}
}

分析:

1.该类被final修饰,所以不可以被继承

2.为什么每次修改字符串都new String()?

final char [] value;   //String的底层是字节数组。被final修饰,该字节数组不可以被修改。所以每次修改都new一个String

3.该类重写了equals方法。

Object类里的方法是比较两个字符串的引用是否相同,String类重写了equals方法,比较的是两个字符串的值。

[ 注: == 号比较基本数据类型时,比较的是数据的值是否相同。比较引用类型的时候,比较的引用是否相同

String系列-----String的更多相关文章

  1. 实战c++中的string系列--string的替换、查找(一些与路径相关的操作)

    今天继续写一些string操作. string给我们提供了非常多的方法,可是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\prog ...

  2. 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())

    在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数 ...

  3. String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)

    本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...

  4. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  5. Java String系列

    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1) StringBuilder 详解 (String ...

  6. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  7. String系列

    String 简介 String 是java中的字符串,它继承于CharSequence.String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示 ...

  8. C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)

    前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...

  9. String系列-----AbstractStringBuilder

    1. AbstractStringBuilder是StringBuffer和StringBuilder的父类 package com.amazing.jdk.string_2017_12_31; im ...

随机推荐

  1. ActivityThread main

    public static void main(String[] args) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Ac ...

  2. PHP中使用Elasticsearch

    PHP中使用Elasticsearch composer require elasticsearch/elasticsearch 会自动加载合适的版本!我的php是5.6的,它会自动加载5.3的ela ...

  3. Arduino IDE for ESP8266 项目(1) 点亮灯+按键LED+pwm

    官方文档 http://esp8266.github.io/Arduino/versions/2.1.0/doc/libraries.html 引脚口说明 http://yfrobot.com/thr ...

  4. Cookie、sessionStorage与localStorage的区别

    (1) sessionStorage 保存数据的方法: SessionStor.setItem(“key”,”value”) 或者写成 sessionStorage.key=”value” 读取数据的 ...

  5. yarn出现“There are no scenarios ; must have at least one"

    错误信息:“There are no scenarios ; must have at least one" 背景:在将vscode自动化构建编译打包时出现这种情况,主要是执行yarn这一步 ...

  6. Android学习之基础知识五—编写聊天界面

    第一步:在app/build.grandle添加RecyclerView依赖库 第二步:在activity_main.xml文件中编写主界面:聊天.发送框.发送按钮三个部分 第三步:编写Message ...

  7. 关于LED效率,这4点你应该知道

    关于LED效率,这4点你应该知道 发布时间:2017-08-22 12:09:35 原创:中国LED网 内容概要: 1. 这些灯的一些光通过转换器或磷光体转换成较长波长(绿色.黄色和红色光)的光,将所 ...

  8. Redis命令总结 (转)

    Redis命令总结   连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 持久化 save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsa ...

  9. Luogu P3953 逛公园

    不管怎么说,这都是一道十分神仙的NOIp题 你可以说它狗,但不可以否认它就是NOIp的难度 首先这道题很显然是道图论题还是一道图论三合一(最短路+拓扑+图上DP) 先考虑最短路,我们分别以\(1\)和 ...

  10. ElasticSearch实践系列(一):安装

    Elasticsearch简介 Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎.它允许您快速,近实时地存储,搜索和分析大量数据.它通常用作底层引擎/技术,为具有复杂搜索功能和要求的 ...