String 源码
来源:互联网 发布:萤火虫算法基本思想 编辑:程序博客网 时间:2024/05/01 00:58
java.lang.Stringfinal class String implements java.io.Serializable, Comparable<String>, CharSequence
1.类变量&常量
private final char value[]; //用于存储值的char型数组
private int hash; // 默认为0
//新建一个CaseInsensitiveComparator类,用于调用其compareTo方法 public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
2.构造函数
//默认构造方式 public String() { this.value = "".value; } //下面是对byte[]数组的编码的构造方式 public String(byte bytes[]) { this(bytes, 0, bytes.length); } public String(byte bytes[], String charsetName) throws UnsupportedEncodingException { this(bytes, 0, bytes.length, charsetName); } public String(byte bytes[], Charset charset) { this(bytes, 0, bytes.length, charset); } public String(byte bytes[], int offset, int length) { checkBounds(bytes, offset, length); //检查边界条件 //以默认的编码方式进行编码,若无则以ISO-8859-1编码 this.value = StringCoding.decode(bytes, offset, length); } //以charsetName的编码方式对bytes[]数组进行编码 public String(byte bytes[], int offset, int length, String charsetName) throws UnsupportedEncodingException { if (charsetName == null) throw new NullPointerException("charsetName"); checkBounds(bytes, offset, length); this.value = StringCoding.decode(charsetName, bytes, offset, length); } public String(byte bytes[], int offset, int length, Charset charset) { if (charset == null) throw new NullPointerException("charset"); checkBounds(bytes, offset, length); this.value = StringCoding.decode(charset, bytes, offset, length); } //下面是输入char[]数组的构造方式 public String(char value[]) { this.value = Arrays.copyOf(value, value.length); //对value[]进行拷贝 } //为了更快的对String进行构造 String(char[] value, boolean share) { // assert share : "unshared not supported"; this.value = value; } //有边界范围的拷贝 public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count <= 0) { if (count < 0) { throw new StringIndexOutOfBoundsException(count); } if (offset <= value.length) { this.value = "".value; return; } } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.value = Arrays.copyOfRange(value, offset, offset+count); } //下面是以String参数的构造方法 public String(String original) { this.value = original.value; this.hash = original.hash; } //同步的构造方法,以StringBuffer作为参数 public String(StringBuffer buffer) { synchronized(buffer) { this.value = Arrays.copyOf(buffer.getValue(), buffer.length()); } } //非同步的构造方法,以StringBuilder作为参数 public String(StringBuilder builder) { this.value = Arrays.copyOf(builder.getValue(), builder.length()); }
3.内部类
CaseInsensitiveComparator implements Comparator<String>, java.io.Serializable 继承了Comparator接口,实现了compareTo方法,对String类型的数进行比较,忽略大小写 public int compare(String s1, String s2) { int n1 = s1.length(); int n2 = s2.length(); int min = Math.min(n1, n2); //只比较到二者最小的长度 for (int i = 0; i < min; i++) { char c1 = s1.charAt(i); char c2 = s2.charAt(i); if (c1 != c2) { c1 = Character.toUpperCase(c1); c2 = Character.toUpperCase(c2); if (c1 != c2) { c1 = Character.toLowerCase(c1); c2 = Character.toLowerCase(c2); if (c1 != c2) { // 不会发生逸出,以为char类型为16位 return c1 - c2; } } } } return n1 - n2; }
4.重要方法
1.indexOf方法,返回某个char或者String子串在源字符串中首次出现的位置、 public int indexOf(int ch) { return indexOf(ch, 0); } public int indexOf(int ch, int fromIndex) { //注意这里的输入参数类型是int final int max = value.length; if (fromIndex < 0) { fromIndex = 0; } else if (fromIndex >= max) { // Note: fromIndex might be near -1>>>1. return -1; } if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) { // handle most cases here (ch is a BMP code point or a // negative value (invalid code point)) final char[] value = this.value; for (int i = fromIndex; i < max; i++) { if (value[i] == ch) { return i; } } return -1; } else { return indexOfSupplementary(ch, fromIndex); } } public int indexOf(String str) { return indexOf(str, 0); } public int indexOf(String str, int fromIndex) { return indexOf(value, 0, value.length, str.value, 0, str.value.length, fromIndex); } static int indexOf(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex) { return indexOf(source, sourceOffset, sourceCount, target.value, 0, target.value.length, fromIndex); } //查找指定子串的位置 static int indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex) { if (fromIndex >= sourceCount) { return (targetCount == 0 ? sourceCount : -1); } if (fromIndex < 0) { fromIndex = 0; } if (targetCount == 0) { return fromIndex; } char first = target[targetOffset]; int max = sourceOffset + (sourceCount - targetCount); for (int i = sourceOffset + fromIndex; i <= max; i++) { /* Look for first character. */ if (source[i] != first) { while (++i <= max && source[i] != first);//一直循环直到找到第一个字符 } /* Found first character, now look at the rest of v2 */ if (i <= max) { int j = i + 1; int end = j + targetCount - 1; for (int k = targetOffset + 1; j < end && source[j] == target[k]; j++, k++); if (j == end) { /* Found whole string. */ return i - sourceOffset; //返回第一个字符串的位置 } } } return -1; }
2.valueOf函数,静态且返回类型为一个新的String字符串 public static String valueOf(boolean b) { return b ? "true" : "false"; } public static String valueOf(char c) { char data[] = {c}; return new String(data, true); } public static String valueOf(int i) { return Integer.toString(i); } public static String valueOf(long l) { return Long.toString(l); } public static String valueOf(float f) { return Float.toString(f); } public static String valueOf(double d) { return Double.toString(d); }
3.返回指定的位置上的charpublic char charAt(int index) { if ((index < 0) || (index >= value.length)) { throw new StringIndexOutOfBoundsException(index); } return value[index]; }
4.compareTo,继承自Comparable接口,比较两个字符串的大小 public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { //只要有不相同的字符出现,立即比较并返回 return c1 - c2; } k++; } return len1 - len2; }
5.连接两个字符串concat 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); } void getChars(char dst[],int dstBegin){//将value的值拷贝到dst数组(dstBegin处开始) System.arraycopy(value, 0, dst, dstBegin, value.length); }
6.求hash值&equals方法&toString方法,继承自Object类 public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; //求hash值得表达式 } hash = h; } return h; } 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; } public String toString() { return this; }
7.替换函数replace,将oldChar替换成newChar,完全返回一个new String public String replace(char oldChar, char newChar) { if (oldChar != newChar) { int len = value.length; int i = -1; char[] val = value; /* avoid getfield opcode */ while (++i < len) { if (val[i] == oldChar) { break; } } if (i < len) { char buf[] = new char[len]; for (int j = 0; j < i; j++) { buf[j] = val[j]; } while (i < len) { char c = val[i]; buf[i] = (c == oldChar) ? newChar : c; i++; } return new String(buf, true); } } return this; }
8.变换成char数组 public char[] toCharArray() { //因为class文件的初始化顺序问题,不能用Arrays.copyOf方法 char result[] = new char[value.length]; System.arraycopy(value, 0, result, 0, value.length); return result; }
9.trim方法,返回一个新的字符串,其首部和尾部均不能为空格,其它和源字符串无区别 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; }
0 0
- String 源码
- String源码
- String 源码
- 【源码】String
- JAVA源码解析-String源码
- string函数源码
- string.h源码
- java 源码 String
- jdk源码学习------String
- 【Java源码】String类
- JDK源码-String
- String源码分析
- JAVA源码String学习
- c语言string源码
- string - strlen源码
- string - strncpy源码
- string - strncmp源码
- string - strrchr源码
- js只保留整数,向上取整,四舍五入,向下取整等函数
- GitHub企业版xxx
- remove删除元素
- iOS开发之NSString字符串去掉首尾空格、去除空格
- Qt简单编辑--编辑器控件Text Edit程序选择与修改
- String 源码
- Linux 服务器部署标准搭建biscuz论坛的环境准备
- gcc
- 直流电动机的调速 用单片机产生PWM控制
- Linux RPM VS yum
- 高效程序员的7个习惯
- 16进制转化为颜色
- 【leetcode】263. Ugly Number
- jQuery+ajax操作大全