String系列-----String
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的更多相关文章
- 实战c++中的string系列--string的替换、查找(一些与路径相关的操作)
今天继续写一些string操作. string给我们提供了非常多的方法,可是每在使用的时候,就要费些周折. 场景1: 得到一个std::string full_path = "D:\prog ...
- 实战c++中的string系列--string与char*、const char *的转换(data() or c_str())
在project中,我们也有非常多时候用到string与char*之间的转换,这里有个一我们之前提到的函数 c_str(),看看这个原型: const char *c_str(); c_str()函数 ...
- String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
本章主要介绍String和CharSequence的区别,以及它们的API详细使用方法. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01. ...
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- Java String系列
String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1) StringBuilder 详解 (String ...
- Java基础知识系列——String
最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...
- String系列
String 简介 String 是java中的字符串,它继承于CharSequence.String类所包含的API接口非常多.为了便于今后的使用,我对String的API进行了分类,并都给出的演示 ...
- C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
前言 这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法.不管怎样,自己还是先把所谓的基础知识加强巩固下吧. 2014年的 ...
- String系列-----AbstractStringBuilder
1. AbstractStringBuilder是StringBuffer和StringBuilder的父类 package com.amazing.jdk.string_2017_12_31; im ...
随机推荐
- 关于new
JS通过new关键字,可以调用相关的 构造方法 生成一个 对象 ,function ---> object
- 网络编程_IP对象_InetAddress
import java.net.InetAddress; import java.net.UnknownHostException; public class IPDemo { public stat ...
- Python基础视频
链接:https://pan.baidu.com/s/1oPiS32sWVysuVAivtdFKnQ 密码私聊我
- Mysql数据库的加密与解密
数据加密.解密在安全领域非常重要.对程序员而言,在数据库中以密文方式存储用户密码对入侵者剽窃用户隐私意义重大. 有多种前端加密算法可用于数据加密.解密,下面我向您推荐一种简单的数据库级别的数据加密.解 ...
- ES6中Object.assign() 方法
ES6中Object.assign() 方法 1. 对象合并Object.assign 方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象上.如下代码演示: var targ ...
- springzuul本地路由和跨服务器路由问题
阿里云服务器在旧新服务迁移过程中,发现路由到认证中心找不到服务 解决办法: 在路由配置里面使用下面的配置 #zuul.routes.claimconf.path=/claimconf/**#zuul. ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)
“传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...
- Luogu4099 HEOI2013 SAO 组合、树形DP
传送门 值得注意的是一般的DAG的拓扑序列数量是NP问题,所以不能直接入手 题目中给出的图可以看做是一个树形图,虽然方向比较迷.考虑使用树形图的性质 不妨任选一个点为根做树形DP,注意到数的位置与方案 ...
- Flask源码解读--所有可扩展点
一.前言 flask中有很多可扩展点(笔者这样称呼),其中包含了信号和请求钩子,这些信号和钩子有什么用呢?其主要作用用于帮助我们进行程序的耦合性,当然还可以让我们自定义一些行为.话不多说,通过阅读源码 ...
- 2-SAT超入门讲解
Preface 说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的 还有一些板子题,由于是暑假的时候学的所以有些我也记不清了 主要学习参考自:Mancher的课件&& ...