【Java 基础】字符串,最新BAT大厂面试者整理的Java面试题目

String str = “hello123”;

// 由于String是不可变字符串, 必须用变量接收

str = str.replace(“123”, “666”); // hello666




穿插个知识点,Eclipse 中 **抽取代码块**的快捷键:先选中代码块,ALT + SHIFT + M  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420123523942.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  

**字符串截取**:



String str = “abcdea”;

// 字符串的截取区间: [2, 4)

str.substring(2, 4); // cd

str.substring(2); // cdea

str.indexOf(“a”); // 0

str.lastIndexOf(“a”); // 5

str.indexOf(“z”); // -1




![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420130039356.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)



[]( )可变字符串(StringBuilder)

=======================================================================================



在进行大量字符串的改动操作时(比如拼接、替换)



*   使用 `String` 会非常消耗内存、降低程序性能

*   使用 `StringBuilder` 可以节省内存、提高程序性能



String s1 = “”;

s1 += “123”;

s1 += “456”;

StringBuilder s2 = new StringBuilder();

s2.append(“123”).append(“456”);




`String` 与 `StringBuilder` 性能对比:**50000 次字符串拼接操作**



public static void main(String[] args) {

testString(); 	// 2511ms

testStringBuilder(); // 2ms

}

static void testString() {

long begin = System.currentTimeMillis();

String str = "";

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

	str += i;

}

long end = System.currentTimeMillis();

System.out.println("String ->" + (end - begin) + "ms");

}

static void testStringBuilder() {

long begin = System.currentTimeMillis();

StringBuilder str = new StringBuilder();

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

	str.append(i);

}

long end = System.currentTimeMillis();

System.out.println("StringBuilder ->" + (end - begin) + "ms");

}


String -> 2511ms

StringBuilder -> 2ms 

```



`StringBuilder` 的常用方法有:`append`、`insert`、`delete`、`replace`、`reverse`等;



注意:



*   `StringBuilder` 并不是 `String` 的子类 或者 父类

*   `StringBuilder`、`String` 都实现了 `CharSequence` 接口



[]( )StringBuilder 的 append 原理

--------------------------------------------------------------------------------------------



`StringBuilder` 的原理类似动态数组 `ArrayList`:底层会自动扩容;  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420132746632.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)  

源码中可以看到扩容的算法:`(value.length << 1) + 2` 即 新容量是原来容量的 2 倍 + 2  

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420132824462.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)



[]( )日期

=====================================================================



[]( )Date

-----------------------------------------------------------------------



`java.util.Date` 是开发中经常用到的**日期处理类**(注意:不是 `java.sql.Date`)



*   包含了年、月、日、时、分、秒等信息



```

// date1 代表当前时间

Date date1 = new Date();

// System.currentTimeMillis 表示 1970-01-01 00:00:00 GMT 到现在时间的毫秒数

// date2 也代表当前时间

Date date2 = new Date(System.currentTimeMillis());

// date3 代表 1970-01-01 00:00:00 GMT 

Date date3 = new Date(0);



// Mon Apr 20 13:44:49 CST 2020

System.out.println(date1);

// Mon Apr 20 13:44:49 CST 2020

System.out.println(date2);

// Thu Jan 01 08:00:00 CST 1970

System.out.println(date3); 

```



`System.currentTimeMillis` 返回的是从 1970-01-01 00:00:00 GMT 开始到现在经历的毫秒数



*   1970-01-01 **00:00:00 GMT**、1970-01-01 **08:00:00 CST** 代表的是同一个时间

    *   **GMT**(Greenwich Mean Time):格林尼治时间

    *   **CST**(China Standard Time UT+8:00):中国标准时间



`Date` 常用方法:



```

Date d1 = new Date();

Date d2 = new Date();



// 设置毫秒数, d1比d2早(d2经历的时间比d1大)

d1.setTime(1000);

d2.setTime(2000);



// 获取毫秒数

d1.getTime(); // 1000

d2.getTime(); // 2000



// 比较时间

d2.after(d1);  // true

d1.before(d2); // true

d1.compareTo(d2); // -1(d2经历的时间比d1大) 

```



[]( )SimpleDateFormat

-----------------------------------------------------------------------------------



`java.text.SimpleDateFormat` 常用来进行**日期的格式化处理**



```

SimpleDateFormat fmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

// 利用日期对象生成字符串

String str = fmt.format(new Date());

// 2020年04月20日 13:57:13

System.out.println(str); 



// 解析字符串为日期对象

Date date = fmt.parse(str);

// Mon Apr 20 13:57:13 CST 2020

System.out.println(date); 

```



`SimpleDateFormat` 的模式字母:  

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020042013593859.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)



[]( )Calendar

---------------------------------------------------------------------------



`java.util.Calendar` 也是开发中经常用到的**日期处理类**



*   功能比 `Date` 更加丰富,`Date` 中很多过期的方法都迁移到了 `Calendar` 中



示例:目前是 2020年4月20日 星期一 下午 14:16:33



```

// 表示当前时间

Calendar c = Calendar.getInstance();

c.getTime(); // Mon Apr 20 14:16:33 CST 2020



c.get(Calendar.YEAR); // 年: 2020



// 月(取值范围[0, 11], 0是1月, 11是12月)

c.get(Calendar.MONTH); // 3



// 一月中的第几天(取值范围[1, 31])

c.get(Calendar.DAY_OF_MONTH); // 20



// 一周中的第几天(取值范围[1, 7], 1是星期天, 2是星期一...,7是星期六)

c.get(Calendar.DAY_OF_WEEK); // 2



// 一年中的第几天(取值范围[1, 366])

c.get(Calendar.DAY_OF_YEAR); // 111



c.get(Calendar.HOUR);   // 时: 2

c.get(Calendar.MINUTE); // 分: 16

c.get(Calendar.SECOND); // 秒: 33

c.get(Calendar.MILLISECOND); // 毫秒: 330 

```



`Calendar` 的常用方法:



```

Calendar c = Calendar.getInstance();

// 设置时间为 2019年7月6日

c.set(2019, 06, 06);

// 2019年7月11日

c.add(Calendar.DAY_OF_MONTH, 5);

// 2019年9月11日

c.add(Calendar.MONTH, 2);



// 设置Date对象

c.setTime(new Date());

// 获得Date对象

c.getTime();



// 设置毫秒数

c.setTimeInMillis(System.currentTimeMillis());

// 获得毫秒数

c.getTimeInMillis(); 

```



### []( )打印格式化(很少用)



![在这里插入图片描述](https://img-blog.csdnimg.cn/20200420142245924.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzczNDA5NQ==,size_16,color_FFFFFF,t_70)





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值