大家好,我是星仔。一个致力于为大家分享各种Java知识的博主。
✨专栏汇总✨
《星仔带你部署银河麒麟RAM架构服务器》
《星仔带你学消息队列(RebbitMQ)》
《星仔带你学Java》
《星仔带你学Elasticsearch》
《星仔带你搞定Java开发小技巧》
《星仔带你学Java设计模式》
《星仔带你搞定【软考-系统架构设计师】》
《星仔带你玩转Java面试》
本博客收录于《华星详谈-学习中心》。本学习中心收集了Java整个技术体系的所有技术要点。每篇博客后面或者知识点结尾都附带有面试题,提供给大家巩固本章内容。
为各位同胞们能够系统性的掌握整个Java技术体系而建立的学习中心。星仔正在努力的更新学习中心中的内容。望诸君共勉!!!
字符序列:把多个字符按照一定得顺序排列起来。
字符串:把多个字符串串联起来(好比羊肉串)
字符串的分类
不可变的字符串:String。当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象。
可变的字符串:StringBuilder/StringBuffer。当对象创建完毕之后,该对象的内容可以发生改变,当内容发生改变的时候,对象保持不变。
字符串的本质(底层是什么其实就是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”);
两种方式有什么区别,分别在内存中如何分布? 如果所示
1)、表示引用为空(null): String str 1 = null; 没有初始化,没有分配内存空间.
2)、内容为空字符串: String str2 = “”; 以及初始化,分配内存空间,不过没有内容.
1)、引用不能为空(null);
2)、字符内容不能为空字符串(“”);
1)、使用”==”号: 只能比较引用的内存地址是否相同。
2)、使用equals方法: 在Object类中和”==”号相同,建议子类覆盖equals方法去比较自己的内容。在String类中覆盖了equals方法,比较的是字符内容。
常量池:专门存储常量的地方,指的方法区中。
编译常量池: 把字节码加载进JVM的时候,存储的是字节码的相关信息;
运行常量池:存储常量数据;
面试题1
下列代码分别创建了几个String对象.
String str1 = “ABCD”;
最多创建一个String对象,最少不创建String对象。如果常量池中已经存在“ABCD”,那么str1直接引用,此时不创建String对象。否则先在常量池先创建“ABCD”内存空间,再引用。
String str2 = new String(“ABCD”);
最多创建两个String对象,至少创建一个String对象。new关键字:绝对会在堆空间创建内存区域,所以至少创建一个String个对象。
1)单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;
2)使用new String("")创建的对象会存储到堆内存中,是运行期才创建;
3)使用只包含直接量的字符串连接符,如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中;
4)使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;
5)通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作;
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 equalsIgnoreCase(String anotherString):将此 String 与另一个 String 比较,不考虑大小写
boolean contentEquals(CharSequence cs):将此字符串与指定的 CharSequence 比较
4)、字符串大小写转换
String toUpperCase():把当前字符串转换为大写(谁调用该方法,谁就是当前字符)
String toLowerCase():把当前字符串转换为小写
相同点:
StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的。
唯一的区别:
StringBuffer:StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低。
StringBuilder:StringBuilder中的方法都没有使用了synchronized修饰符,不安全。但是性能较高。
分别使用String、StringBuilder、StringBuffer来拼接30000次字符串,对比各自损耗的时间。
经过测试:String做字符串拼接的时候,性能极低(耗时)原因是Sting是不可变的,每次内容改变都会在内存中创建新的对象。
String耗时:1964ms
StringBuffer耗时:3ms
StringBuilder耗时:1ms
结论:以后拼接字符串,统统使用StringBuffer、StringBuilder,不要使用String。
使用StringBuilder无参数的构造器,在底层创建了一个长度为16的char数组
char[] value = new char[16];
此时该数组只能存储16个字符,如果超过了得自动扩容。自动扩容指的是创建长度更大的数组,再把之前的数组拷贝到新数组。 此时性能极低,一般的我们事先知道大概需要存储多少字符,在构造器中就应该设置长度。
//创建一个长度为80的char数组.
new StringBuilder(80);
常用方法:
append(Object val):表示追加任意类型数据
StringBuilder deleteCharAt(int index) :删除字符串中指定位置的字符
随机数:随机地生成的任意的一个((理论上讲具有不可预知性),随机数在Java中主要有以下三个类
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。
我们一般用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更强大,功能gen。
Calendar c = Calendar.getInstance();
int get(int field) 返回给定日历字段(年,月,日,时,分,秒)的值。
需求:查询最近一周.......的信息,如何表示最近这一周。
正则表达式(Regex)表示表达式正确的规则。主要用于(匹配判断、分割操作、替换操作、网络爬虫(Lucene)。
案例:判断一个字符串全部由数字组成