20_星仔带你学Java之Java常用类

大家好,我是星仔。一个致力于为大家分享各种Java知识的博主。

✨专栏汇总✨

        《星仔带你部署银河麒麟RAM架构服务器》

        《星仔带你学消息队列(RebbitMQ)》

        《星仔带你学Java》

        《星仔带你学Elasticsearch》

        《星仔带你搞定Java开发小技巧》

        《星仔带你学Java设计模式》

        《星仔带你搞定【软考-系统架构设计师】》

        《星仔带你玩转Java面试》

    本博客收录于《华星详谈-学习中心》。本学习中心收集了Java整个技术体系的所有技术要点。每篇博客后面或者知识点结尾都附带有面试题,提供给大家巩固本章内容。

为各位同胞们能够系统性的掌握整个Java技术体系而建立的学习中心。星仔正在努力的更新学习中心中的内容。望诸君共勉!!!

一、字符串操作

1.1 字符串概述

20_星仔带你学Java之Java常用类_第1张图片

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

字符串:把多个字符串串联起来(好比羊肉串)。

1.2 字符串的分类

        1)不可变的字符串:String。当前对象创建完毕之后,该对象的内容(字符序列是不能改变的,一旦内容改变就是一个新的对象。

        2)可变的字符串:StringBuilder/StringBuffer。当对象创建完毕之后该对象的内容可以发生改变当内容发生改变的时候对象保持不变。

字符串的本质底层是什么其实就是char[])。char表示一个字符数组表示同一种类型的多个数据如何理解char[]

String  str = “ABCDEFG”;    //定义一个字符串对象,等价于

char[] cs = new char[]{'A','B','C','D','E','F','G'};

1.3 String 类

String类:表示不可变的字符串。当前对象创建完毕之后,该对象的内容字符序列是不能改变的,一旦内容改变就是一个新的对象。

1.3.1 String对象的创建

       1)直接赋一个字面量:       String   str1  =  “ABCD”;

       2)通过构造器创建:          String   str2  =  new String(“ABCD”);

1.3.2 两种方式有什么区别?分别在内存中如何分布?

String对象的空值

       1)表示引用为空(null):   String  str 1 = null;      没有初始化,没有分配内存空间.  

       2)内容为空字符串:        String  str2  = “”;         以及初始化,分配内存空间,不过没有内容.

判断字符串非空

        1)引用不能为空(null);

        2)字符内容不能为空字符串(“”);

字符串的比较操作

        1)使用”==”:          只能比较引用的内存地址是否相同。

        2)使用equals方法:   Object类中和”==”号相同,建议子类覆盖equals方法去比较自己的内容

注意:String类覆盖equals方法,比较的是字符内容

20_星仔带你学Java之Java常用类_第2张图片

1.4 常量池

常量池:专门存储常量的地方,都指的方法区中

     编译常量池把字节码加载斤JVM的时候,存储的是字节码的相关信息。

     运行常量池存储常量数据。

1.4.1 面试题1

下列代码分别创建了几个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个对象。

20_星仔带你学Java之Java常用类_第3张图片

1.4.2 面试题2

说说下面String对象,彼此之间是否相等

20_星仔带你学Java之Java常用类_第4张图片

 答:

20_星仔带你学Java之Java常用类_第5张图片

1.5 String对象比较

        1)单独使用""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;

        2)使用new String("")创建的对象会存储到堆内存中,是运行期才创建

        3)使用只包含直接量的字符串连接符如"aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中(str2和str3)

        4)使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作。

1.6 String类中的常用方法

1.6.1 String的创建和转换

  byte[] getBytes():把字符串转换为byte数组

  char[] toCharArray():把字符串转换为char数组

  String(byte[] bytes):把byte数组转换为字符串

  String(char[] value):把char数组转换为字符串

1.6.2 获取字符串信息

  int length() 返回此字符串的长度

  char charAt(int index) 返回指定索引处的 char 值

  int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。

  int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引

1.6.3 字符串比较判断

  boolean equals(Object anObject) 将此字符串与指定的对象比较。

  boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写

  boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 比较

20_星仔带你学Java之Java常用类_第6张图片

20_星仔带你学Java之Java常用类_第7张图片 1.6.4 字符串大小写转换

  String toUpperCase()  当前字符串转换为大写(谁调用该方法,谁就是当前字符)

  String toLowerCase()  把当前字符串转换为小写

20_星仔带你学Java之Java常用类_第8张图片

1.7  String/StringBuilder/StringBuffer 拼接字符串性能比较

分别使用String/StringBuilder/StringBuffer来拼接30000次字符串,对比各自损耗的时间

经过测试:

String做字符串拼接的时候,性能极低(耗时),原因是Sting是不可变的,每次内容改变都会在内存中创建新的对象.

String耗时:1964ms

StringBuffer耗时:3ms

StringBuilder耗时:1ms

结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String.

1.8 String和StringBuilder以及StringBuffer的区别(建议使用StringBuilder)

相同点:

        StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的。

唯一的区别:

        StringBuffer:StringBuffer中的方法都使用了synchronized修饰符表示同步的,在多线程并发的时候可以保证线程安全,但在保证线程安全的时候性能(速度)较低

        StringBuilder:StringBuilder中的方法都没有使用了synchronized修饰符。是线程不安全的,但是性能较高

1.9 StringBuilder 无参构造器

20_星仔带你学Java之Java常用类_第9张图片

使用StringBuilder无参数的构造器在底层创建了一个长度为16char数组

    char[] value   = new  char[16];

        此时该数组只能存储16个字符,如果超过了就自动扩容。自动扩容(创建长度更大的数组,再把之前的数组拷贝到新数组)。 此时性能极低,一般的我们事先知道大概需要存储多少字符,在构造器中就应该设置好。如下

//创建一个长度为80的char数组.

new StringBuilder(80);

1.10 StringBuilder/StringBuffer常用方法

append(Object val):表示追加任意类型数据

StringBuilder deleteCharAt(int index):删除字符串中,指定位置的字符

二、随机数

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

Random

ThreadLocalRandom

UUID

Random类用于生产一个随机数(通过相同的种子,产生的随机数是相同的)。

public Random():使用默认的种子(以当前系统时间作为种子)。

public Random(long seed):根据指定的种子。

20_星仔带你学Java之Java常用类_第10张图片

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

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

UUID通用惟一识别:Universally Unique Identifier; 在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。UUID是一个128位长的数字,一般用16进制表示。算法的核心思想是结合机器的网卡、当地时间、一个随即数来生成UUID。

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

20_星仔带你学Java之Java常用类_第11张图片

三、日期类

日期相关类

Date: java.util.Date,不是java.sql.Date.  类 Date 表示特定的瞬间,精确到毫秒.

DateFormat/SimpleDateFormat:

Calendar:

Java8中重新为日期定义了新的API。Date类中的大量方法都已经过时了过时不代表不存在),依然可以使用,只不过不建议使用,官方建议我们使用Calendar

3.1 日期格式化操作

DateFormat:可以完成日期的格式化操作.

格式化(format):Date类型对象------->String类型:String format(Date date)

解析(parse):String类型时间------>Date类型:Date parse(String source) 

20_星仔带你学Java之Java常用类_第12张图片

20_星仔带你学Java之Java常用类_第13张图片

DateFormar转换的格式是固定的,我想根据自己的风格来做转换。比如说自定义格式:2016-04-16  15:50:48,或者2016/04/16  15:50:48。这个时候就需要用到SimpleDateFormat类了。SimpleDateFormatDateFormat的子类,支持自定义格式模式。 

20_星仔带你学Java之Java常用类_第14张图片

3.2 日历类(Calendar)

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

创建日历对象:

Calendar c = Calendar.getInstance();

int get(int field) 返回给定日历字段(年,,,,,)的值。

20_星仔带你学Java之Java常用类_第15张图片

3.3 日期操作练习(日期转换方法):StringDate之间的相互转换

20_星仔带你学Java之Java常用类_第16张图片

3.4 日历操作练习(计算起止时间)

需求:查询最近一周.......的信息,如何表示最近这一周。

20_星仔带你学Java之Java常用类_第17张图片

四、正则表达式

正则表达式(Regex)表示表达式正确的规则:主要用于(匹配判断分割操作替换操作、网络爬虫(Lucene))

案例:判断一个字符串全部由数字组成

 20_星仔带你学Java之Java常用类_第18张图片

正则表达式语法:

20_星仔带你学Java之Java常用类_第19张图片

 20_星仔带你学Java之Java常用类_第20张图片

你可能感兴趣的:(星仔带你学Java,java,面试,开发语言,java-ee)