大家好,我是星仔。一个致力于为大家分享各种Java知识的博主。
✨专栏汇总✨
《星仔带你部署银河麒麟RAM架构服务器》
《星仔带你学消息队列(RebbitMQ)》
《星仔带你学Java》
《星仔带你学Elasticsearch》
《星仔带你搞定Java开发小技巧》
《星仔带你学Java设计模式》
《星仔带你搞定【软考-系统架构设计师】》
《星仔带你玩转Java面试》
本博客收录于《华星详谈-学习中心》。本学习中心收集了Java整个技术体系的所有技术要点。每篇博客后面或者知识点结尾都附带有面试题,提供给大家巩固本章内容。
为各位同胞们能够系统性的掌握整个Java技术体系而建立的学习中心。星仔正在努力的更新学习中心中的内容。望诸君共勉!!!
字符序列:把多个字符按照一定得顺序排列起来。
字符串:把多个字符串串联起来(好比羊肉串)。
1)不可变的字符串:String。当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象。
2)可变的字符串:StringBuilder/StringBuffer。当对象创建完毕之后,该对象的内容可以发生改变,当内容发生改变的时候对象保持不变。
字符串的本质(底层是什么其实就是char[])。char表示一个字符,数组表示同一种类型的多个数据如何理解char[]。
String str = “ABCDEFG”; //定义一个字符串对象,等价于
char[] cs = new char[]{'A','B','C','D','E','F','G'};
String类:表示不可变的字符串。当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象。
1)直接赋一个字面量: String str1 = “ABCD”;
2)通过构造器创建: String str2 = new String(“ABCD”);
String对象的空值
1)表示引用为空(null): String str 1 = null; 没有初始化,没有分配内存空间.
2)内容为空字符串: String str2 = “”; 以及初始化,分配内存空间,不过没有内容.
判断字符串非空
1)引用不能为空(null);
2)字符内容不能为空字符串(“”);
字符串的比较操作
1)使用”==”号: 只能比较引用的内存地址是否相同。
2)使用equals方法: 在Object类中和”==”号相同,建议子类覆盖equals方法去比较自己的内容
注意:String类覆盖equals方法,比较的是字符内容。
常量池:专门存储常量的地方,都指的方法区中。
编译常量池: 把字节码加载斤JVM的时候,存储的是字节码的相关信息。
运行常量池: 存储常量数据。
下列代码分别创建了几个String对象.
String str1 = “ABCD”;
String str2 = new String(“ABCD”);
答:
①、String str1 = “ABCD”; 最多创建一个String对象,最少不创建String对象。如果常量池中已经存在”ABCD”,那么str1直接引用,此时不创建String对象。否则先在常量池先创建”ABCD”内存空间,再引用。
②、String str2 = new String(“ABCD”); 最多创建两个String对象,至少创建一个String对象。new关键字绝对会在堆空间创建内存区域,所以至少创建一个String个对象。
说说下面String对象,彼此之间是否相等
答:
1)单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;
2)使用new String("")创建的对象会存储到堆内存中,是运行期才创建;
3)使用只包含直接量的字符串连接符如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中(str2和str3);
4)使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作。
byte[] getBytes():把字符串转换为byte数组
char[] toCharArray():把字符串转换为char数组
String(byte[] bytes):把byte数组转换为字符串
String(char[] value):把char数组转换为字符串
int length() 返回此字符串的长度
char charAt(int index) 返回指定索引处的 char 值
int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。
int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引
boolean equals(Object anObject) 将此字符串与指定的对象比较。
boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写
boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 比较
String toUpperCase() 把当前字符串转换为大写(谁调用该方法,谁就是当前字符)
String toLowerCase() 把当前字符串转换为小写
分别使用String/StringBuilder/StringBuffer来拼接30000次字符串,对比各自损耗的时间:
经过测试:
String做字符串拼接的时候,性能极低(耗时),原因是Sting是不可变的,每次内容改变都会在内存中创建新的对象.
String耗时:1964ms
StringBuffer耗时:3ms
StringBuilder耗时:1ms
结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String.
相同点:
StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的。
唯一的区别:
StringBuffer:StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,但在保证线程安全的时候性能(速度)较低。
StringBuilder:StringBuilder中的方法都没有使用了synchronized修饰符。是线程不安全的,但是性能较高。
使用StringBuilder无参数的构造器在底层创建了一个长度为16的char数组
char[] value = new char[16];
此时该数组只能存储16个字符,如果超过了就得自动扩容。自动扩容(创建长度更大的数组,再把之前的数组拷贝到新数组)。 此时性能极低,一般的我们事先知道大概需要存储多少字符,在构造器中就应该设置好。如下
//创建一个长度为80的char数组.
new StringBuilder(80);
append(Object val):表示追加任意类型数据
StringBuilder deleteCharAt(int index):删除字符串中,指定位置的字符
随机数:随机地生成的任意的一个数(理论上讲具有不可预知性)。
Random类
ThreadLocalRandom类
UUID类
Random类用于生产一个伪随机数(通过相同的种子,产生的随机数是相同的)。
public Random():使用默认的种子(以当前系统时间作为种子)。
public Random(long seed):根据指定的种子。
ThreadLocalRandom是Java7新增类,是Random类的子类,在多线程并发情况下,ThreadLocalRandom相对于Random可以减少多线程资源竞争,保证了线程的安全性。
因为构造器是默认访问权限,只能在java.util包中创建对象。故提供了一个方法ThreadLocalRandom.current()用于返回当前类对象。
UUID通用惟一识别:Universally Unique Identifier; 在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。UUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成UUID。
日期相关类
Date类: java.util.Date类,不是java.sql.Date. 类 Date 表示特定的瞬间,精确到毫秒.
DateFormat/SimpleDateFormat类:
Calendar类:
Java8中重新为日期定义了新的API。Date类中的大量方法都已经过时了(过时不代表不存在),依然可以使用,只不过不建议使用,官方建议我们使用Calendar类。
DateFormat:可以完成日期的格式化操作.
格式化(format):Date类型对象------->String类型:String format(Date date)
解析(parse):String类型时间------>Date类型:Date parse(String source)
DateFormar转换的格式是固定的,我想根据自己的风格来做转换。比如说自定义格式:2016-04-16 15:50:48,或者2016/04/16 15:50:48。这个时候就需要用到SimpleDateFormat类了。SimpleDateFormat类是DateFormat的子类,支持自定义格式模式。
日历类(Calendar):是抽象类,表示日历,比Date更强大。
创建日历对象:
Calendar c = Calendar.getInstance();
int get(int field) 返回给定日历字段(年,月,日,时,分,秒)的值。
需求:查询最近一周.......的信息,如何表示最近这一周。
正则表达式(Regex)表示表达式正确的规则:主要用于(匹配判断、分割操作、替换操作、网络爬虫(Lucene))
案例:判断一个字符串全部由数字组成
正则表达式语法: