由于1.8的rt.jar打开报错, 此番查看的是基于1.7
java.lang.String 是一个final类.
一, 接口
实现三个接口: Serializable, Comparable<String>, CharSequence
二, 属性
private final char[] value; private int hash; private static final long serialVersionUID = -6849794470754667710L; private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator(null); private static final int HASHING_SEED = i; private transient int hash32 = 0;
重要的属性有value和hash. 其中value是final,char数组存储的.
三, 构造器
java.lang.String的构造器比较多. 有个线程安全的构造器值得注意.
public String(StringBuffer paramStringBuffer) { synchronized (paramStringBuffer) { this.value = Arrays.copyOf(paramStringBuffer.getValue(), paramStringBuffer.length()); } }
四,方法
1, equals
第一步:比较2个对象是否同一个对象,若是,直接返回true
第二步: 判断比较类型是否是java.lang.String,若否, 直接false
第三步: 判断字符长度是否相等, 若否, 直接false
第四步: 从第一个字符开始进行比较,若发现不相等,直接返回false.
细节: 当中判断用的是i++ !=0, 而不是我们平时j<this.value.length. 性能更佳.
public boolean equals(Object paramObject) { if (this == paramObject) return true; if ((paramObject instanceof String)) { String str = (String)paramObject; int i = this.value.length; if (i == str.value.length) { char[] arrayOfChar1 = this.value; char[] arrayOfChar2 = str.value; for (int j = 0; i-- != 0; j++) if (arrayOfChar1[j] != arrayOfChar2[j]) return false; return true; } } return false; }
2, equalsIgnoreCase
直接比较地址是否相等,没有值比较.
public boolean equalsIgnoreCase(String paramString) { return this == paramString; }
3, contentEquals
有2种, StringBuffer参数的调用CharSequence, 因为是线程安全的,所以加了synchronized.
boolean contentEquals(StringBuffer paramStringBuffer)
boolean contentEquals(CharSequence paramCharSequence)
3, compareTo
字符串集合进行排序的基础。 此方法比较2个字符串的大小。
第一步: 从2个字符串中取出最小字符长度。
第二步: 从0到最小字符串长度进行比较,若不相等,返回str1[i]-str[2]
第三步: 其它, 返回str1.length -str2.length
public int compareTo(String paramString) { int i = this.value.length; int j = paramString.value.length; int k = Math.min(i, j); char[] arrayOfChar1 = this.value; char[] arrayOfChar2 = paramString.value; for (int m = 0; m < k; m++) { int n = arrayOfChar1[m]; int i1 = arrayOfChar2[m]; if (n != i1) return n - i1; } return i - j; }
4, startsWith
判断字符串是否以指定字符串开头.
boolean startsWith(String paramString): 默认从起始位置开始比较
boolean startsWith(String paramString, int paramInt): paramInt 开始比较的位置
public boolean startsWith(String prefix, int toffset) { char ta[] = value; int to = toffset; char pa[] = prefix.value; int po = 0; int pc = prefix.value.length; // Note: toffset might be near -1>>>1. if ((toffset < 0) || (toffset > value.length - pc)) { return false; } while (--pc >= 0) { if (ta[to++] != pa[po++]) { return false; } } return true; }
5, endsWith
提现了方法的重用性.
public boolean endsWith(String suffix) { return startsWith(suffix, value.length - suffix.value.length); }
6, hashCode
当hash为0的时候,会进行计算,
计算方法是遍历每个字符进行 当前hash值*31+当前字符值 赋予hash
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 = h; } return h; }
7, indexOf
找出目标字符串第一次出现的位置
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, 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; }
8, substring
截取字符串,主要是调用构造器String(val,beginIndex,subLen),
而这个构造器用的是Arrats.copyOfRange(value, offset, offset+count);
substring(int benginIndex,int endIndex);
substring(int beginIndex);
public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen); }
9, concat
拼接字符串,使用的是getChars方法
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); }
10, 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; }
11, replace
替换,没有使用正则表达式, replaceAll使用的是正则表达式
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; }
12, getBytes
用的是StringCoding.encode方法,使用的是ISO-8859-1编码.
public byte[] getBytes() { return StringCoding.encode(value, 0, value.length); } static byte[] encode(char[] ca, int off, int len) { String csn = Charset.defaultCharset().name(); try { // use charset name encode() variant which provides caching. return encode(csn, ca, off, len); } catch (UnsupportedEncodingException x) { warnUnsupportedCharset(csn); } try { return encode("ISO-8859-1", ca, off, len); } catch (UnsupportedEncodingException x) { // If this code is hit during VM initialization, MessageUtils is // the only way we will be able to get any kind of error message. MessageUtils.err("ISO-8859-1 charset not available: " + x.toString()); // If we can not find ISO-8859-1 (a required encoding) then things // are seriously wrong with the installation. System.exit(1); return null;
相关推荐
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....
commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE....
commons-lang.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE.txtMETA-INF/NOTICE.txtorg.apache....
java获取客户端ip(经过多次代理)提示StringUtils cannot be resolved 需要先 import org.apache.commons.lang3.StringUtils; /* 内含 common-lang3.jar commons-lang3-3.9-bin.zip commons-lang3-3.9-src.zip ...
解决 java.lang.NoSuchFieldError: STRING at org.jbpm.identity.hibernate.PermissionUserType. 不用jbpm的jbpm-identity.jar 用这个就好
1. **字符串操作**: Commons Lang 提供了 `StringUtils` 类,它包含了一系列静态方法,用于执行复杂的字符串操作,如空白字符处理、分割、连接、替换、比较等,这些方法比Java内置的String类功能更加强大。...
2. **拼接操作**:`StringUtils.join()` 方法允许你将多个对象或数组元素用特定分隔符连接成一个字符串,比使用 `String.concat()` 或 `StringBuilder` 更简洁。 3. **分割操作**:`StringUtils.split()` 可以按照...
标题 "java.lang.Exception: java.lang.IllegalArgumentException: firstMovedIndex, lastMove" 描述了一个Java编程中的异常情况。这个异常通常发生在尝试执行一个不合法的操作时,例如数组或集合操作超出了其边界。...
在Java编程中,`java.lang.NumberFormatException`是一个常见的运行时异常,它通常发生在尝试将一个字符串转换为数值类型(如int、long、float或double)时,但该字符串无法被解析为有效的数值。"For input string: ...
boolean delete(java.lang.String sql, java.util.Map<java.lang.Integer,java.lang.Object> elements) 根据传入的参数删除单条记录的方法 boolean delete(java.lang.String sql, java.lang.Object[] elements)...
boolean delete(java.lang.String sql, java.util.Map<java.lang.Integer,java.lang.Object> elements) 根据传入的参数删除单条记录的方法 boolean delete(java.lang.String sql, java.lang.Object[] elements)...
在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...
标题“Springmvc : Failed to convert property value of type 'java.lang.String' to int”涉及的是一个在使用Spring MVC框架时常见的错误。这个错误通常出现在尝试将一个字符串类型(String)的属性值转换为整型...
1. java.lang.String -> String:Java的字符串转换为ActionScript的字符串。 2. java.lang.Boolean, boolean -> Boolean:布尔值在两种语言中都有相应的类型。 3. java.lang.Integer -> int:Java的Integer转换为...
java.lang.NoSuchMethodError: redis.clients.jedis.ScanResult.getStringCursor()Ljava/lang/String; at org.crazycake.shiro.WorkAloneRedisManager.keys(WorkAloneRedisManager.java:149) at org.crazycake....
在Java编程中,`java.lang.NoSuchMethodError`异常是一个运行时异常,通常发生在程序试图执行一个不存在的方法时。这个异常的出现通常意味着编译时和运行时的类版本不匹配,或者是在编译期间存在而运行时不存在的...
Fastjson是Java语言编写的高性能功能完备的JSON库,广泛应用于各种Java项目中,尤其在大数据量、高并发场景下表现出色。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也...
Type 异常报告 消息 Failed to convert ... nested exception is java.lang.IllegalStateException: Cannot convert value of type 'java.lang.String' to required type 'java.util.Date': no matching editors or co
args)`则类似于`String.format()`,支持格式化的字符串构建。 10. **编码与解码**:`StringUtils.newStringUtf8(byte[] bytes)`和`StringUtils.getBytesUtf8(String str)`分别用于从字节数组创建UTF-8编码的字符串...
Java 中 String 类型转换方法 Java 中 String 类型转换方法是一种常见的编程操作,涉及到各种数据类型之间的转换,包括整型、浮点型、长整型、浮点型等。本文将详细介绍 Java 中 String 类型转换方法的各种形式。 ...