大数据—javase基础—day12

  • Post author:
  • Post category:java




数组工具类



java.util.Arrays类

java.util.Arrays数组工具类,提供了很多静态方法来对数组进行操作,而且如下每一个方法都有各种重载形式,以下只列出int[]和Object[]类型的,其他类型的数组依次类推:


  • 数组元素拼接


    • static String toString(int[] a)

      :用于将一个int类型的数组转换为字符串表示形式。字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 “, “(逗号加空格)分隔。形式为:[元素1,元素2,元素3。。。]

      在这里插入图片描述

    • static String toString(Object[] a)

      :用于将一个Object类型的数组转换为字符串表示形式。字符串表示形式由数组的元素列表组成,括在方括号(“[]”)中。相邻元素用字符 “, “(逗号加空格)分隔。

      在这里插入图片描述


注意

:toString方法对于快速查看数组内容非常有用,特别是在调试和输出数组时。请注意,Arrays.toString()方法不会修改原始数组,它只是返回一个表示数组内容的字符串


  • 数组排序


    • static void sort(int[] a)

      :将a数组按照从小到大进行排序

    • static void sort(int[] a, int fromIndex, int toIndex)

      :将a数组的[fromIndex, toIndex)部分按照升序排列

    • static void sort(Object[] a)

      :根据元素的自然顺序对指定对象数组按升序进行排序。

    • static <T> void sort(T[] a, Comparator<? super T> c)

      :根据指定比较器产生的顺序对指定对象数组进行排序。

  • 数组元素的二分查找


    • static int binarySearch(int[] a, int key)

    • static int binarySearch(Object[] a, Object key)

      :要求数组有序,在数组中查找key是否存在,如果存在返回第一次找到的下标,不存在返回负数

  • 数组的复制


    • static int[] copyOf(int[] original, int newLength)

      :根据original原数组复制一个长度为newLength的新数组,并返回新数组,新数组中空位置为null

      请添加图片描述


    • static <T> T[] copyOf(T[] original,int newLength)

      :根据original原数组复制一个长度为newLength的新数组,并返回新数组


    • static int[] copyOfRange(int[] original, int from, int to)

      :复制original原数组的[from,to)构成新数组,并返回新数组


    • static <T> T[] copyOfRange(T[] original,int from,int to)

      :复制original原数组的[from,to)构成新数组,并返回新数组


  • 比较两个数组是否相等


    • static boolean equals(int[] a, int[] a2)

      :比较两个数组的长度、元素是否完全相同

    • static boolean equals(Object[] a,Object[] a2)

      :比较两个数组的长度、元素是否完全相同

  • 填充数组


    • static void fill(int[] a, int val)

      :用val值填充整个a数组

    • static void fill(Object[] a,Object val)

      :用val对象填充整个a数组

    • static void fill(int[] a, int fromIndex, int toIndex, int val)

      :将a数组[fromIndex,toIndex)部分填充为val值

    • static void fill(Object[] a, int fromIndex, int toIndex, Object val)

      :将a数组[fromIndex,toIndex)部分填充为val对象



数组算法的升华



数组的扩容

  • 方式一:自动扩容:利用Arrays类中的static copyOf()方法

    在这里插入图片描述
  • 方式二手动扩容

    在这里插入图片描述



数组指定下标元素删除和新增

  • 数组元素删除

    在这里插入图片描述

    在这里插入图片描述
  • 数组元素新增

    • 方式一

      在这里插入图片描述

      在这里插入图片描述
    • 方式二

      在这里插入图片描述

      在这里插入图片描述



字符串(String)—特殊的对象类型

注意:在String类中的方法,如果形参名带regex,则说明该方法都支持正则表达式

  • 定义

    java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如”abc” )都可以被看作是实现此类的实例。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

    Java 语言提供对字符串串联符号(“+”)以及将其他对象转换为字符串的特殊支持(toString()方法)。
  • 特点

    (1)字符串String类型是final声明的,不能被继承

    (2)字符串的对象是不可变的对象,一旦被修改就会产生新的对象

    (3)String对象内部使用字符数组进行保存的(注意:JDK1.9之前是用char[] value数组,JDK1.9之后用byte[]数组)



String内存结构的特点

在java中只要是写在双引号里面的内容,那么其必须出现在内存中固定的区域——字符串常量池(简称串池)

JDK1.6之前串池是在方法区中

  • 工作原理

    当程序里出现一个双引号引住的内容时(比如字符串),首先它会检索串池,看看是否已经存在了这个字符串,如果串池中没有,则创建String对象并将值赋进去;如果该串池中已经包含该字符串,则不会创建新的字符串对象,会将原有的字符串对象赋值给引用。
  • 串池中的特点

    (1)在串池中同一个String串只会存在一个对象

    (2)字符串改值原理是在串池中产生了新字符串,而原字符串不会改变
  • 代码示例

    在这里插入图片描述

示例代码中(s1

s3)结果为false的原因:s3是在堆中创建的对象,栈中的对象名s3记录了该对象在堆中的地址,而堆中的对象体内有个value属性,该属性指向方法区中的串池中的字符串,“

”比较的是两个对象的地址是否相同,此时s1的地址是直接指向方法区的,而s3的地址是指向堆中的对象,所以不相等。而s1.equals(s3)结果为True的原因是:此时的equals为String类中的equals方法,是用来比较对象的内容是否相等,由于字符串均为”hello“,所以结果为True


注意

:value为:private final char value[]——由此可看出value是值不可变(final修饰的变量的值不可被修改)的数组,其中保存了字符串常量池中字符串的地址

  • 字符串常量池的位置

    JDK1.6及其之前:方法区

    JDK1.7:在堆里

    JDK1.8:在元空间



String创建对象时的特点

在这里插入图片描述

请添加图片描述

双引号里的串值都在字符串常量池中

串池中同一个字符串只会有一个对象

若直接给String赋值则用的是串池中的地址给引用赋值;若是new则会导一手(即new的对象在堆里,然后让堆里的char型value数组指向字符串常量池中的字符串)

String是个引用数据类型,所以String可以调属性和方法。比如String比较相等不是用等号(“==”比较的是两个对象的地址是否相同)比的而是用equals(此时的equals为String类中的equals方法,比较对象的内容是否相等)比较的



字符串拼接问题

  • 拼接原则

    (1)常量+常量=常量池

    (2)变量+常量=变量+变量=堆 (注意:变量就是new过)

    (3)拼接后调用intern()方法:结果在常量池中
  • 实例如下:

    (1)
    在这里插入图片描述

    (2)
    在这里插入图片描述



    在这里插入图片描述

(3)

在这里插入图片描述

  • 两种拼接方式(详见代码)

    在这里插入图片描述



    注意




    利用concat()方法拼接时,哪怕是两个常量拼接,结果也是在堆里

    不管是常量+常量还是变量+常量又或是变量+变量,只要拼字符串都会产生新对象 。但是在串池中同一个字符串只会产生一个对象



字符串对象比较

1、==:比较是对象的地址

只有两个字符串变量都是指向字符串的常量对象时,才会返回true

String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2);//true
    
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str1 == str4); //false
System.out.println(str3 == str4); //false

2、equals:比较是对象的内容,因为String类型重写equals,区分大小写

只要两个字符串的字符内容相同,就会返回true

String str1 = "hello";
String str2 = "hello";
System.out.println(str1.equals(str2));//true
    
String str3 = new String("hello");
String str4 = new String("hello");
System.out.println(str1.equals(str3));//true
System.out.println(str3.equals(str4));//true

3、Objects类中的equals方法—

Objects.equals(Object a, Object b)

方法是Java中的一个静态方法,用于比较两个对象是否相等。该方法是在Java 7中引入的,并且是为了解决在比较两个对象时可能出现的空指针异常(NullPointerException)而设计的

在需要比较对象是否相等时,尤其是当其中一个对象可能为 null 时,Objects.equals() 是一个很有用的工具方法,此时可以弥补String类中的equals方法因为字符串为空而出现的空指针异常的情况


示例1


在这里插入图片描述


示例2


在这里插入图片描述

4、equalsIgnoreCase:比较的是对象的内容,不区分大小写

String str1 = new String("hello");
String str2 = new String("HELLO");
System.out.println(str1.equalsIgnoreCase(strs)); //true

5、compareTo:String类型重写了Comparable接口的抽象方法,自然排序,按照字符的Unicode编码值进行比较大小的,严格区分大小写

String str1 = "hello";
String str2 = "world";
str1.compareTo(str2) //小于0的值

6、compareToIgnoreCase:不区分大小写,其他按照字符的Unicode编码值进行比较大小

String str1 = new String("hello");
String str2 = new String("HELLO");
str1.compareToIgnoreCase(str2)  //等于0



空字符比较

1、哪些是空字符串

String str1 = "";
String str2 = new String();
String str3 = new String("");
		空字符串:长度为0

2、如何判断某个字符串是否是空字符串

if("".equals(str))

if(str!=null  && str.isEmpty())

if(str!=null && str.equals(""))

if(str!=null && str.length()==0)

注意:

当使用

"".equals(str)

时,空字符串””是一个有效的对象,因此不需要检查

str

是否为null。因此,使用

"".equals(str)

可以避免NullPointerException异常。而使用其他方法判断是否为空字符串时则会报NullPointerException异常(因为对于其它判断方法来说空字符串不是一个有效的对象),所以需要

str!=null

来避免NullPointerException异常



字符串常用方法一

方法 解释
String concat​(String str) 将指定的字符串连接到该字符串的末尾,等价于+
String toLowerCase​() 将字符串全部转为小写
String toUpperCase​() 将字符串全部转为大写
boolean endsWith​(String suffix) 测试此字符串是否以指定的后缀结尾
boolean startsWith​(String prefix) 测试此字符串是否以指定的前缀开头
int length​() 返回此字符串的长度
s1.getBytes(charsetName) 将字符串变为字节数组。charsetName:为编码格式,缺省为”utf-8″,但有时候写编码格式可能会报异常,所以需要用到try…catch块
char charAt(index) 返回[index]位置的字符
char[] toCharArray() 将此字符串转换为新的字符数组,如:s1.tocharArray()
String trim​() 去掉字符串两端的空格字符串
boolean equalsIgnoreCase(Object obj) 比较字符串是否相等,不区分大小写
int compareTo(String other) 按照字典顺序比较字符串大小,区分大小写,按照Unicode编码值比较大小
int compareToIgnoreCase(String other) 按照字典顺序比较字符串大小,不区分大小写

在这里插入图片描述



字符串常用方法二

方法 解释
int indexOf(String) 返回参数字符/字符串在原字符串中第一次出现时的位置下标,若没有则返回-1
int indexOf(String, fromindex) 返回参数字符/字符串在原字符串中位置下标为fromindex处开始往后第一次出现时的位置下标,若没有则返回-1
int lastIndexOf(String) 返回参数字符在原字符串中最后一次出现的位置下标,若没有则返回-1
int lastIndexOf(String, fromindex) 返回参数字符在原字符串中的第fromindex个位置下标往前开始最后一次出现的位置下标,若没有则返回-1
String intern​() 返回字符串对象的规范表示形式(即将字符串放到串池里)
String substring​(int beginIndex) 返回从位置下标beginIndex开始截取到字符串末尾的字符串
String substring(int beginIndex, int endIndex) 返回从位置下标beginIndex开始到(endIndex-1)结束为止的字符串

在这里插入图片描述

在这里插入图片描述



字符串常用方法三

方法 解释
boolean contains(xx) 看字符串中中是否包含字符/字符串xx,此为boolean型
s1.replace(oldChar,newChar) 从原串中用newChar替换掉oldChae
s1.replaceAll(regex,replacement) 从原串中用第二个参数字符串替换掉所有的第一个参数字符串
s1.replaceFirst(regex,replacement) 从原串中用第二个参数字符串替换掉第一次出现的第一个参数字符串
String[] split(String regex) 使用参数作为分隔符,将原字符串分割成字符串数组
|:在正则表达式中有特殊含义,若不想 其有特殊含义,在java中可为其加上两个\\即可,如”\\|"

在这里插入图片描述



可变字符序列

因为String对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低。因此,JDK又在java.lang包提供了可变字符序列

StringBuilder



StringBuffer

类型。

StringBuffer:老的,线程安全的(因为它的方法有synchronized修饰)

StringBuilder:线程不安全的



StringBuilder、StringBuffer的API


StringBuilder、StringBuffer的API是完全一致的

方法 解释


StringBuffer append(xx)

拼接,追加(注意:其可以一直追加)


StringBuffer insert(int index, xx)

在[index]位置插入xx


StringBuffer reverse()

反转
StringBuffer delete(int start, int end) 删除[start,end)之间字符
StringBuffer deleteCharAt(int index) 删除[index]位置字符
void setCharAt(int index, xx) 替换[index]位置字符
void setLength(int newLength) 设置当前字符序列长度为newLength
StringBuffer replace(int start, int end, String str) 替换[start,end)范围的字符序列为str
int indexOf(String str) 在当前字符序列中查询str的第一次出现下标
int indexOf(String str, int fromIndex) 在当前字符序列[fromIndex,最后]中查询str的第一次出现下标
int lastIndexOf(String str) 在当前字符序列中查询str的最后一次出现下标
int lastIndexOf(String str, int fromIndex) 在当前字符序列[fromIndex,最后]中查询str的最后一次出现下标
String substring(int start) 截取当前字符序列[start,最后]
String substring(int start, int end) 截取当前字符序列[start,end)
String toString() 返回此序列中数据的字符串表示形式

请添加图片描述



版权声明:本文为cgrs5572原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。