一、字符串

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。

* 关于 HashMap 的底层原理

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 方法

请参考

待更新...

Java 中的字符串与 []byte 字节数组的更多相关文章

  1. (八)二进制文件在webservice中的处理(以byte[]字节数组方式)

    一.介绍 二进制文件在webservice中的处理. A:通过byte[]字节数组的方式来传递.比较适合小文件,字节数组不能太大的情况.(本章所用) B:通过DataHander的方式来进行传递. 1 ...

  2. 理解Java中的字符串类型

    1.Java内置对字符串的支持: 所谓的内置支持,即不用像C语言通过char指针实现字符串类型,并且Java的字符串编码是符合Unicode编码标准,这也意味着不用像C++那样通过使用string和w ...

  3. spring boot 使用WebSocket与前端进行byte字节数组交互

    一.装逼前先热热身 无论是比较传统的 web项目 还是近几年流行的前后端分离,后端只独立提供数据交互接口服务的项目,都避免不了数据之间交互格式的选择. 从很早之前的 xml 格式 到现在最火热的jso ...

  4. java中String\十六进制String\byte[]之间相互转换函数

    java二进制,字节数组,字符,十六进制,BCD编码转换2007-06-07 00:17/** *//** * 把16进制字符串转换成字节数组 * @param hex * @return */ pu ...

  5. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

  6. java中的int与byte的转化

    java中的int与byte的转化 1.基础准备 1.1.原码 就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值 1.2.反码 在原码的基础上,正数反码就是他本身,负数除符号位之 ...

  7. 详解Java中的字符串

    字符串常量池详解 在深入学习字符串类之前, 我们先搞懂JVM是怎样处理新生字符串的. 当你知道字符串的初始化细节后, 再去写String s = "hello"或String s ...

  8. [原创]Java中的字符串比较,按照使用习惯进行比较

    java中的字符串比较一般可以采用compareTo函数,如果a.compareTo(b)返回的是小于0的数,那么说明a的unicode编码值小于b的unicode编码值. 但是很多情况下,我们开发一 ...

  9. Java中的字符串驻留

    转自:http://www.cdtarena.com/javapx/201307/9088.html 最近在工作的时候,一句再正常不过的代码String a = “hello” + “world”;被 ...

随机推荐

  1. 程序通过ReportViewer对象来调用reporting services并导出pdf文件

    ReportViewer tempReportViewer = new ReportViewer(); tempReportViewer.ProcessingMode = ProcessingMode ...

  2. sql 发送邮件

    一.启用Database Mail XPs功能. 查看Database Mail XPs功能是否打开,从返回结果来看,value为0说明没有打开,注意SQL Mail XPs是SQL Server早期 ...

  3. 412 6个题 BOM and DOM 定义计数器 网页跳转 网页前进后退

    AM BOM-JavaScript: 提供一系列对象哟用于和浏览器窗口交互,对象主要有 window.document.location.navigator.screen 统称浏览器对象模型(Brow ...

  4. Stack的相关API

    public class Stack<E> extends Vector<E> : Stack类代表后进先出(LIFO)堆栈的对象. 它扩展了类别Vector与五个操作,允许一 ...

  5. 3D Slicer中文教程(二)—软件功能界面介绍

    1.界面介绍 2.菜单及工具栏介绍 (1)菜单 File-文件菜单 文件菜单包含用于加载MRML场景的选项,用于从互联网下载样本数据集或各种类型的各个数据集.此处还提供了保存场景和数据的选项. Edi ...

  6. liunx系统下调整Swap分区大小

    作者:邓聪聪 添加swap交换空间的步骤如下:第一步:确保系统中有足够的空间来用做swap交换空间,准备在一个独立的文件系统中添加一个swap交换文件,在/tmp中添加1G的swap交换文件第二步:添 ...

  7. oracle用命令创建表空间、用户,并为用户授权、收回权限。

    oracle中如何删除用户? Oracle中使用DROP USER来删除用户,如果使用DROP USER CASCADE那么用户的对象也同时被删除掉.为了达到删除用户的效果而又不影响对用户下的对象的使 ...

  8. sed 使用行号与关键字匹配限定行范围

    1.打印匹配数字4 到最后一行 [111 sed]$ cat input [111 sed]$ sed -n '/4/,$p' input

  9. zabbix3.2使用fping批量监控ip的连通性

    .在zabbix-agent端安装fping wget http://www.fping.org/dist/fping-3.16.tar.gz tar zxvf fping-3.16.tar.gz c ...

  10. Laravel -- 邮箱功能配置问题

    ```` 今天碰到了这块的问题,还是记一下 ```` 关于邮箱: 品牌:腾讯qq.网易163 等 种类:个人.企业 邮箱服务器种类 配置教程 https://jingyan.baidu.com/art ...