java 字符字节数组_Java 中的字符串与 []byte 字节数组

一、字符串

1.比较 String、HashSet、List 中的 contains 方法

其中, String、List 都使用了 indexOf 方法,本质是遍历,时间效率为 O(n)。而 HashSet 使用了计算 hash值的方式,时间效率为 O(1) 级别。

2.String 中为什么需要 hashCode 方法?

从String 源码可以看到其底层实现是 char[],即本质是字符数组。包括索引(indexOf)及大部分功能(比如 equals 方法)实现都是使用数组。

public final class String implements xxx {

private final char value[];

/** Cache the hash code for the string */

private int hash; // Default to 0

public String() {

this.value = "".value;

}

public String(String original) {

this.value = original.value;

this.hash = original.hash;

}

为什么还需要 hash 值呢?原因是 String 常作为 HashSet、HashMap 容器的 key,因此需要获取 key的哈系值,貌似 switch case 方法也是根据 hash 来判别,而不是用 equals。

3.compareTo

实现了 Comparable 接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。String 里是通过数组索引实现的字典序。

实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

4. []char 数组的打印语句与普通数组的打印语句

public void test() {

String str = "Good Java";

char[] chars = str.toCharArray();

System.out.println(chars);

System.out.println(Arrays.toString(chars));

byte[] bytes = str.getBytes();

System.out.println(bytes);

System.out.println(Arrays.toString(bytes));

int[] intArr = new int[]{3, 4, 2, 5};

System.out.println(intArr);

System.out.println(Arrays.toString(intArr));

}

输出结果

Good Java

[G, o, o, d, , J, a, v, a]

[B@47089e5f

[71, 111, 111, 100, 32, 74, 97, 118, 97]

[I@4141d797

[3, 4, 2, 5]

说明:字符数组 print 是字符串,而非字符数组 print 一般是数组地址。

5.获取字节数组与获取字符数组

//使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。

byte[] getBytes(String charsetName)

//将字符从此字符串复制到目标字符数组。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

//将此字符串转换为一个新的字符数组。

public char[] toCharArray()

6. 其它方法

boolean endsWith(String suffix)

boolean startsWith(String prefix, int toffset)

boolean matches(String regex)

String trim() // 返回字符串的副本,忽略前导空白和尾部空白。

String replaceAll(String regex, String replacement)

String[] split(String regex, int limit)

static String format(String format, Object... args)

byte[] getBytes(String charsetName)

char[] toCharArray()

/* StringBuilder 的相关方法 */

StringBuilder(int capacity)//默认容量为 16

StringBuilder append(double d)

int length()

int capacity()

StringBuilder reverse()

7 “重载符号”+、+=   与 concat

str1 += str2 :底层用的 StringBuilder 效率更高,但是不够灵活,在某些情况下效率反而较低。

str1 = new StringBuilder().append(str1).append(str2).toString();

concat:返回一个新的字符串,在字符串很少时,效率稍高。

StringBuilder:使用 append 拼接,在多段字符串拼接时效率高。

@org.junit.Test

public void test() {

int times = 100000;

String s1 = "";

String s2 = "";

StringBuilder s3 = new StringBuilder("");

long a = System.currentTimeMillis();

for(int i = 0 ;i < times ; i ++){

s1 += "a";

}

long b = System.currentTimeMillis();

for(int i = 0 ;i < times ; i ++){

s2 = s2.concat("a");

}

long c = System.currentTimeMillis();

for(int i = 0 ;i < times ; i ++){

s3.append("a");

}

long d = System.currentTimeMillis();

System.out.print((b-a) + " | " + (c-b) + " | " + (d-c));

}

输出结果

7289 | 1593 | 5

8. 字面量与 intern 方法

待更新...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值