设计一个Stringl类
设计一个String类,要求该类不可被继承,可以存放字符串(多个字符),不可修改存放的字符。重载构造器,可以用字符数组来实例化一个String类的对象。该类需要具备以下功能,查询字符串长度,和某个字符串比较是否相等,查找某个字符是否包含在字符串中,将字符串转换为字符数组,并返回。 并编写一个测试类,对String类的功能进行测试。
提示知识点:final关键字、数组用法、重载(构造方法和普通方法),访问修饰符,字符串常量
public final class FuckString { private final char[] data; /** * 构造一个字符串 * * @param data 字符数组 */ public FuckString(final char... data) { this.data = null == data ? new char[0] : data.clone(); } /** * 获取字符串长度 * * @return 字符串长度 */ public int getLength() { return data.length; } // 判断两个字符数组是否相等 private boolean isCharArrayEquals(final char[] src, final char[] dst) { if (src == dst) { return true; } if (null == src) { return false; } if (src.length != dst.length) { return false; } for (int i = 0; i < src.length; i++) { if (src[i] != dst[i]) { return false; } } return true; } @Override public boolean equals(Object obj) { if (null == obj) { return false; } if (obj instanceof FuckString) { return isCharArrayEquals(data, ((FuckString) obj).data); } else if (obj instanceof String) { return isCharArrayEquals(data, ((String) obj).toCharArray()); } else { return false; } } /** * 转换为字符数组 * * @return 字符数组 */ public char[] toCharArray() { return data.clone(); } @Override public String toString() { return new String(data); } /** * 判断目标字符是否出现在当前字符串中 * * @param targetChar 目标字符 * @return TRUE:出现;FALSE:不出现 */ public boolean containChar(char targetChar) { for (final char c : data) { if (c == targetChar) { return true; } } return false; } // 随便写一些测试用例,覆盖上边的所有场景 public static void main(String... args) { assertTrue(new FuckString(new char[]{'F', 'U', 'C', 'K', ' ', 'Y', 'O', 'U'}).getLength() == 8); assertTrue(new FuckString(null).getLength() == 0); assertTrue(new FuckString('F', 'U', 'C', 'K', ' ', 'Y', 'O', 'U').equals(new String("FUCK YOU"))); assertFalse(new FuckString('F', 'U', 'C', 'K', ' ', 'Y', 'O', 'U').equals(new String("FUCK ME"))); assertTrue(new FuckString('F', 'U', 'C', 'K', ' ', 'Y', 'O', 'U').equals(new FuckString('F', 'U', 'C', 'K', ' ', 'Y', 'O', 'U'))); assertFalse(new FuckString('F', 'U', 'C', 'K', ' ', 'Y', 'O', 'U').equals(new FuckString('F', 'U', 'C', 'K', ' ', 'M', 'E'))); { final char[] data = {'F', 'U', 'C', 'K'}; final FuckString fString = new FuckString(data); data[1] = 'S'; assertTrue(fString.equals("FUCK")); } { final FuckString fString = new FuckString('F', 'U', 'C', 'K'); final char[] data = fString.toCharArray(); data[1] = 'S'; assertTrue(fString.equals("FUCK")); } assertTrue(new FuckString('F', 'U', 'C', 'K').toString().equals("FUCK")); assertTrue(new FuckString('F', 'U', 'C', 'K').containChar('U')); assertFalse(new FuckString('F', 'U', 'C', 'K').containChar('X')); } // 用于测试用的简单断言 private static void assertTrue(boolean expect) { if (!expect) { throw new IllegalStateException("assert fail!"); } } private static void assertFalse(boolean expect) { assertTrue(!expect); } }
[此贴子已经被作者于2017-12-22 19:22编辑过]