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. Spring AOP 和 AspectJ

    现如今有许多个可用的 AOP 库,使用这些库需要能够回答以下问题: 是否与现有的或新的应用程序兼容? 在哪里可以使用 AOP ? 如何迅速与应用程序集成? 性能开销是多少? 在本文中,我们将回答这些问 ...

  2. [TJOI2018]教科书般的亵渎

    嘟嘟嘟 题面挺迷的,拿第一个样例说一下: 放第一次亵渎,对答案产生了\(\sum_{i = 1} ^ {10} i ^ {m + 1} - 5 ^ {m + 1}\)的贡献,第二次亵渎产生了\(\su ...

  3. dns与wins的区别

    将主机名字解析称为ip地址有四种办法: dns.winds.hosts文件.lmhosts文件 dns和hosts是很多系统cout采用的一个名称解析的方法,wins和lmhosts是微软的操作系统此 ...

  4. solidity ecrecover

    https://solidity.readthedocs.io/en/latest/units-and-global-variables.html#mathematical-and-cryptogra ...

  5. python3 练习题(多级菜单)

    '''多级菜单需求:1.现有省/市/县3级结构,要求程序启动后,允许用户可依次选择进入各子菜单2.可在任意一级菜单返回上一级3.可以在任意一级菜单退出程序所需新知识点: 列表/字典'''menu = ...

  6. Linux系统--命令行安装weblogic10.3.6

    Linux下命令行安装weblogic10.3.6 一.安装前准备工作: 1.创建用户useradd weblogic;创建用户成功linux系统会自动创建一个和用户名相同的分组,并将该用户分到改组中 ...

  7. 市场不相信眼泪:AI第一股暴力裁员 惨了

    近日,有网友在社交平台匿名爆料称,科大讯飞准备优化30%的正式员工. 还有人匿名爆料,科大讯飞无补助报销出差加班,迫使员工离职,并将矛头指向了一个叫“黄狗子”“黄国庆”的角色. 有媒体猜测,科大讯飞采 ...

  8. 剑指offer.在O(1)时间内删除链表节点

    给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点.假设链表一定存在,并且该节点一定不是尾节点. 样例 输入:链表 1->4->6->8 删掉节点:第2个节点即6(头节 ...

  9. Luogu1979 NOIP2013D2T3 华容道 搜索、最短路

    题目传送门 题意:给出一个$N \times M$的棋盘,棋盘上有一些块可以移动,有一些块无法移动.$Q$次询问,每一次询问给出三个块$a,b,c$,将$a$块变为空格,空格旁边可移动的块可以与空格交 ...

  10. Git .gitignore文件的使用

    本文转载自 http://blog.csdn.net/xmyzlz/article/details/8592302 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .giti ...