A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

一、常用类

(一) 字符串

1.字符串介绍

字符序列: 把多个字符按照一定的顺序排列起来。

字符串: 把多个字符串连起来。

字符串分类:
① 不可变的字符串: String:当前对象创建完毕之后,该对象的内容(字符串序列)是不能改变的,一旦内容改变就是一个新的对象。
② 可变的字符串: StringBuilder/StringBuffer:当对象创建完毕之后,该对象的内容可以发生改变,当内容发生改变时,对象保持不变。

字符串的本质:
字符串的底层其实是char[],char表示一个字符,数组表示同一种类型的多个数据。

String str = "ABCDEFG"; // 定义一个字符串对象
Char[] cs = new char[]{'A','B','C','D','E','F','G'}; // 等价于上面
1
2
String对象的创建:
① 直接赋一个字面量:String str1 = “ABCD”;
② 通过构造器创建:String str2 = new String(“ABCD”);

String对象的空值:
① 表示引用为空(null):String str1 = null; 没有初始化,没有分配内存空间。
② 内容为空字符串:String str2 = “”; 已经初始化,分配了内存空间,但是没有内容。

判断字符串非空:
① 引用不能为空(null)。
② 字符内容不能为空字符串(”“)。

字符串的比较操作:
① 使用“==”号:只能比较引用的内存地址是否相同。
② 使用equals方法:在Object类中和“==”相同,建议子类覆盖equals方法比较自己的内容。
String类覆盖euqals方法比较的是字符内容。

2.String面试题

面试题一:
下列代码分别创建了几个String对象?

String str1 = "ABCD";
String str2 = new String("ABCD");
1
2
第一行:最多创建一个String对象,最少不创建String对象。如果常量池中,已经存在”ABCD”,那么str1直接引用,此时不创建String对象。否则,先在常量池先创建”ABCD”内存空间,再引用。

第二行:最多创建两个String对象,至少创建一个String对象。new 关键字:绝对会在堆空间,创建内存区域,所以至少创建一个String对象。

面试题二:
下面String对象,彼此之间是否相等?

private static String getXx(){
    return "AB";
}

public static void main(String[] args){
    String str1 = "ABCD";

    String str2 = "A" + "B" + "C" + "D"; // true
    String str3 = "AB" + "CD"; // true
    String str4 = new String("ABCD"); // false
    String temp = "AB";
    String str5 = temp + "CD"; // false
    String str6 = getXx() + "CD"; // false
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
String对象比较:
① 单独使用”“引号创建的字符串都是直接量,编译期就已经确定,存储到常量池中。
② 使用new String(“”)创建的对象会存储到堆内存中,是运行时期才创建。
③ 使用只包含直接量的字符串连接,符合如:”aa” + “bb”。创建的也是直接量编译期就能确定。
④ 使用包含String直接量(无final修饰符)的字符串表单式(如”aa” + s1)创建的对象是运行期才创建的,存在堆中。
⑤通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值。不存在编译优化操作。

3.String方法

String类中的常用方法(从API中去找下列方法):

1).String的创建和转换:
① byte[] getBytes():把字符串转换为byte数组。
② char[] tocharArray():把字符串转换为char数组。
③ String(byte[] bytes):把byte数组转换为字符串。
④ String(char[] value):把char数组转换为字符串。

2).获取字符串信息:
① int length():返回字符串的长度。
② char charAt(int index):返回指定索引处的char值。
③ int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。
④ int lastIndexOf(String str):返回指定字符串在此字符串中最右边出现处的索引。

3).字符串比较判断:
① boolean equals(Object anObject):将字符串与指定对象进行比较。
② boolean equalslgnoreCase(String anotherString):将此String与另一个String比较,不考虑大小写。
③ boolean contentEquals(charSequence cs):将此字符串与指定的charSequence比较

4).字符串大小写转换:
① String toUpperCase():将字符串转换为大写
② String toLowerCase():将字符串转换为小写

分别使用String、StringBuilder、StringBuffer来拼接30000次字符串,对比各自损耗的时间:
经过测试:
String做字符串拼接的时候,性能极低(耗时),原因是String是不可变的,每次内容改变都会在内存中创建新的对象。
String耗时:1964ms。
StringBuffer耗时:3ms。
StringBuilder耗时:1ms。
结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String。

String和StringBuilder以及StringBuffer的区别:
StringBuilder和StringBuffer都是表示可变的字符串,功能方法相同。

唯一的区别:
StringBuffer:StringBuffer中的方法都使用了synchronized修饰符,表示同步的。在多线程并发的时候可以保证线程安全,但是性能降低。
StringBuilder:StringBuilder中的方法都没有使用synchronize修饰符,线程不安全,但性能最高。

使用了StringBuilder无参的构造器,在底层创建了一个长度为16的char数组:
char[] value = new char[16];
此时该数组只能存储16个字符,如果超过了就要自动扩容,自动扩容(创建长度更大的数组,再把之前的数组拷贝到新的数组)。
此时性能极低,一般我们事先知道大概要存储多少个字符,在构造器中就应该设置。

// 创建一个长度为80的char数组
new Stringbuilder(80);
1
2
append(Object val):表示追加任意类型的数据。
StringBuilder deleteCharAt(int index):删除字符串中,指定位置的字符。

(二) 随机数

随机的生成任意一个数(理论上具有不可预见性)

Random类: 用于产生一个伪随机数(通过相同的种子,产生的随机数是相同的)。
ThreadLocalRandom类: 使用默认的种子(以当前系统时间作为种子)。
UUID类: 根据指定的种子。

ThreadLocalRandom:是Java7新增类,是Random类的子类,在多线程并发的情况下,ThreadLocalRandom相对于Random可以减少多线程资源的竞争,保证了线程的安全性。

public class ThreadLocalRandom extends Random{}

因为构造器是默认的访问权限,只能在java.util包中创建对象,故提供了一个方法ThreadLocalRandom.current()用于返回当前类对象。

ThreadLocalRandom random = ThreadLocalRandom.current();
// 生成[34,213)之间的随机数
System.out.println(random.nextInt(34,213));
1
2
3
UUID:通用唯一识别:Universally Unique Identifier,在一台机器上生成的数字,它保证对同一时空中所有的机器都是唯一的。

UUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡,当地时间,一个随机数来生成UUID。

我们一般用来表示:随机的唯一字符串。

String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
1
2
(三) 日期

日期相关类:
Date类:java.util.Date类,不是java.sql.Date类!表示特定的瞬间,精确到毫秒。
DateFormat/SimpleDateFormat类:日期格式化类。
Calendar类:Java8中重新为日期定义的新的API。

Date类中大量的方法都已经过时了,但过时不代表不能使用,只是不建议使用,官方建议使用Calendar类。

日期格式化操作:
DateFormat:可以完成日期的格式化操作。
格式化(format):Date类型对象–>String对象:String format(Date date)
解析(Parse):String类型时间–>Date类型:Date parse(String source)

DateFormat转换的格式是固定的。

SimpleDateFormat类:是DateFormat的子类,支持自定义格式模式。

日历类(Calendar): 是抽象类,表示日历,比Date更强大。

// 创建日历对象
Calendar c = Calendar.getInstancel();
1
2
int get(int field) 返回给定日历字段(年,月,日,时,分,秒)的值。

// Calendar转换为Date类型
Date d = c.getTime();

// void add(int field,int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量
System.out.println("日="+c.get(Calendar.DAY_OF_MONTH));
c.add(Calendar.DAY_OF_MONTH,1000)
System.out.println(c.getTime().toLocaleString())
1
2
3
4
5
6
7
(四) 正则表达式

主要用于(匹配判断,分割操作,替换操作)
---------------------
【转载】
作者:PengTDY
原文:https://blog.csdn.net/yougoule/a ... 435?utm_source=copy


3 个回复

倒序浏览
奈斯
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马