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 ...
随机推荐
- Properties集合_list方法与store方法
Properties集合和流对象结合的功能 list()方法: import java.util.Properties; public class PropertiesDemo { public st ...
- NOIP2018爆零退役滚粗记
\(Day\ -1\) 非常的颓废 上午考了loli\(\ \ oi\)的最后一轮,\(mhr\)一个小时十五分钟怒切\(260\)分,吊打生爷 发现自己\(T2\)树的直径写怪了,不明觉厉 怕不是要 ...
- 「PKUWC2018」随机游走
题目 我暴力过啦 看到这样的东西我们先搬出来\(min-max\)容斥 我们设\(max(S)\)表示\(x\)到达点集\(S\)的期望最晚时间,也就是我们要求的答案了 显然我们也很难求出这个东西,但 ...
- PHP的运行机制与原理(底层)
原文:http://www.jb51.net/article/74907.htm 说到php的运行机制还要先给大家介绍php的模块,PHP总共有三个模块:内核.Zend引擎.以及扩展层:PHP内核用来 ...
- .Net修改网站项目调试时的虚拟目录(未验证)
有些项目需要在IIS发布的时候,将网站发布到虚拟目录,为了保持调试和发布的路径同一,一般会修改VS调试的虚拟目录 一.Web应用程序 Web应用程序的修改方式非常简单,在解决方案资源管理器->项 ...
- enq: FB - contention
Troubleshooting 'enq: FB - contention' Format Block Enqueues. (Doc ID 1379986.1) In this DocumentPur ...
- 安装docker后访问外网失败
服务器网段是(172.17)与docker默认桥接的网桥号段相同 docker version 17.03.2-ce 1.centOS6 原文链接 http://www.bubuko.com/info ...
- blob 对象 实现分片上传 及 显示进度条
blob对象介绍 一个 Blob对象表示一个不可变的, 原始数据的类似文件对象.Blob表示的数据不一定是一个JavaScript原生格式 blob对象本质上是js中的一个对象,里面可以储存大量的二进 ...
- linux下文件共享的几种常用方式
1. python方式,做一个简单的服务器.默认是开启8000端口. > python -m SimpleHTTPServer 执行命令后,在浏览器上输入该机器IP+8000端口即可 2. sc ...
- Luogu3793 由乃救爷爷 分块、ST表
传送门 因为昨天写暴力写挂在UOJ上用快排惨遭卡常,所以今天准备写一个卡常题消遣消遣,然后时间又垫底了QAQ 这道题显然需要支持一个\(O(N)\)预处理\(O(1)\)查询的ST表,显然普通的ST表 ...