Fork me on GitHub

JavaSE Day12 数组API StringAPI StringBUffer 包装类 正则

JavaSE Day12 数组API StringAPI StringBUffer 包装类 正则


Arrays类

int[] arr = {2,34,12,363,1,65};

// 把数组转换成字符串
 System.out.println(Arrays.toString(arr));
 
// 排序,升序
  Arrays.sort(arr);
  System.out.println(Arrays.toString(arr));
  
// 查找,二分查找(前提:升序排序)
// 查找的元素存在,返回位置索引;不存在,返回 -(插入点+1)
 System.out.println(Arrays.binarySearch(arr,34));
 System.out.println(Arrays.binarySearch(arr,89));
 
// 比较相等 两个数组(元素的个数,类型)
 int[] arr1 = {11,22,33,44,55,66,77};
 int[] arr2 = {11,22};
 System.out.println(Arrays.equals(arr1,arr2));
 

数组的复制

 int[] arr3;
 arr3 = Arrays.copyOf(arr1,arr1.length);// 源数组,新数组的长度;
 System.out.println(Arrays.toString(arr3));
 System.out.println(Arrays.toString(arr1));

数组的复制2

创建2个数组,通过for循环来一一赋值
创建2个数组,通过System.arraycopy(源数组,源数组开始位置,目的数组,目的数组开始位置,复制长度)
使用clone()方法
使用浅拷贝,直接替换变量名;

String类

表示字符串,字符序列。

不可变的类

一旦字符串对象确定了,此字符串对象的字符序列就不能更改了

因为是不可变对象,每一次的常量值赋值或对象赋值时,都会创建对象,效率低;
常量值会在常量池中创建新对象
对象赋值会在堆内存中创建对象

创建字符串

  • String s1 = "hello";

直接使用赋值运算符的,是存储在方法区的常量池中的维护的;如果池中存在,则不创建直接赋值;如果没有,则创建一个再赋值;

加了final的变量,存储在方法区的常量池中维护的;

  • String s2 = new String("hello");

一看到new就是在堆内存中分配空间

使用new创建,则在堆中创建对象;然后去常量池中查找是否存在,如果常量池中存在相同的字符串,则将该常量池的地址保存在创建的堆内存空间中;否则在堆内存中创建一份;而不会在常量池中创建,因为在Java中根本就不存在两个完全一模一样的字符串对象

参考资料:https://www.cnblogs.com/xiaoxi/p/6036701.html

字符串方法

 String s2 = new String();
// 空串,没有字符序列,null空对象
// 方法 判断字符串相等(堆内存地址)
  System.out.println(s3 == s5);
// equals 比较的是字符序列是否相等;(区分大小写)
  System.out.println(s1.equals(s3));
// 不区分大小写,比较字符序列
  System.out.println(s1.equalsIgnoreCase(s3));
// 追加
  String str = "hello";
//  System.out.println(str.concat("tom"));
  str.concat("tom");
  str = str.concat("tom");
// 字符串是不可变类,直接打印str,没有任何变化还是hello
  System.out.println(str);
// 长度
  System.out.println(str1.length());
// 大小写转换
  System.out.println(str1.toUpperCase());
  System.out.println(str1.toLowerCase());
// 查找参数字符串在当前字符串中 第一次出现的位置索引,不包含返回-1;
  System.out.println(str2.indexOf("he"));
// 查找参数字符串在当前字符串中 第一次出现的位置索引,
  System.out.println(str2.lastIndexOf("he"));
// char 取出参数索引位置的一个字符
  System.out.println(str2.charAt(10));

// 取子串
// 从起始位置参数  取到字符串的末尾;
  System.out.println(str3.substring(str3.indexOf("a")));
// [起始位置,终止位置) 从起始位置 到终止位置的前一位;
  System.out.println(str3.substring(5,8));


// 去除字符串的前后空格
  String str4 = "   h  e  l l  o  ";
  System.out.println(str4.trim());
// 使用第二个参数字符串替换第一个参数字符串;全部替换;
  System.out.println(str5.replace("hello","你好"));
// 去除所有空格
  System.out.println(str4.replace(" ",""));
 
// 是否以指定参数的字符串为 结尾,是true;
  System.out.println(str6.endsWith("java"));
// 是否以指定参数的字符串为 开头,是true;
  System.out.println(str6.startsWith("Demo"));
// 比较字符串大小
  String str7 = "abc";
// 比较的对象 在参数对象之前,结果是负数;
  System.out.println(str7.compareTo("Adc"));
// 两个字符串一样 返回0;
  System.out.println(str7.compareTo("abc"));
// 比较的对象 在参数对象之后,结果是正数;
  System.out.println("xyz".compareTo("abc"));
// 把字符串转换成字符数组char[]
  String str8 = "  aga  sdgsag  ";
  char[] crs = str8.toCharArray();
  System.out.println(Arrays.toString(crs));
// 把当前字符串 用参数字符串分割 为一个字符串数组,String[]
  String str9 = "aa bb  cc dd ee";
  String[] strs = str9.split(" ");
// 参数字符串在当前 字符串中是否存在,存在就是true,不包含就是false;
  System.out.println(str9.contains("cc"));
  

可变的类

StringBuffer

  StringBuffer sf = new StringBuffer();
  // 查看StringBuffer的长度
  System.out.println(sf.capacity());
  // 默认是16,如果大小不够,则成倍的扩容;
  // 缩小容量 为 实际存储字符的大小
  sf.trimToSize();
  StringBuffer sf1 = new StringBuffer(100);
  // 可以指定容量
  
  // 添加数据
  sf1.append("hello");
  // 向参数索引位置插入一个字符串;
  sf1.insert(5,"tom");
  // 修改某个索引位置的字符
  sf1.setCharAt(3,'y');
  // 删除 索引位置的字符
  sf1.deleteCharAt(5);
  // 删除 [起始位置,终止位置)
  sf1.delete(5,8);
  
  //反转
  sr.reverse();
  
  // 转换为字符串;
  String str = sr.toString();

StringBuilder

StringBuilder s1 = new StringBuilder();
方法和StringBuffer差不多

区别

  • String
    • 表示一个字符串,不可变类
    • 字符串的字符序列 频繁更改,效率低;
  • StringBuffer && StringBuilder
    • 可变字符串类
    • 字符序列频繁更改 ,可以使用
  • StringBuffer
    • 线程安全的
    • 都是用synchronized 关键字进行修饰,因此是线程安全的
    • 数据准确,但是速度慢;
  • StringBuilder
    • 线程非安全
    • 数据不准确,但是速度快

时间

System.currentTimeMillis();
从1970-1-1-0:0:0计算到现在的毫秒数
native 关键字 表示是由底层的C语言来实现的;

正则表达式

语法

// 1. 定义正则表达式  Pattern.compile(regString)
  Pattern ptn = Pattern.compile("\\d{6}");
// 2. 表达式模式  Matcher matcher = ptn.matcher("需要匹配的数据")
  Matcher mr = ptn.matcher("343434");
// 3. 验证  matcher.matches();
   System.out.println(mr.matches());

简易语法

boolean flag = Pattern.matches("\\d{6}","343434");
// 参数1:regString
// 参数2:需要匹配的数据

匹配模式

总共三种匹配模式
贪婪模式
勉强模式
侵占模式

参考文档
正则表达式匹配模式

拆箱装箱

包装类

装箱

把基本数据类型 包装成对象。
基本数据类型 --> 引用类型;

自动装箱

Integer i1 = 23;
默认调用Integer.valueOf()

拆箱

把对象中的值,取出来
引用类型 --- 》 基本类型

自动拆箱

  int n = i;
  默认调用 i.intValue();

包装类是不可变类

进制转换

  System.out.println(Integer.toBinaryString(5));// 10-》2
  System.out.println(Integer.toOctalString(12));// 10-》8
  System.out.println(Integer.toHexString(15));// 10-》16
  System.out.println(Integer.valueOf("101",2));// 2-》10
  System.out.println(Integer.valueOf("14",8));// 8-》10
  System.out.println(Integer.valueOf("f",16));// 16-》10

字符串 和 数值 转换

基本类型转换为字符串的方法有三种方法:

  1. 使用包装类中的toString()方法
  2. 使用String类的valueOf()方法
  3. 加入空字符(最常用)
 // 数字 转换为 字符串
  int x = 22;
  String str = x+"";// "22"
  str = Integer.toString(x);
  str = String.valueOf(x);

字符串转换为基本类型

包装类转换为基本类型有两种方法:

  1. 使用包装类中的parseXXX()方法
  2. 使用包装类中的valueOf()方法
// 字符串转换为数字
 String str1 = "123";
 int y = new Integer(str1);
 y = Integer.parseInt(str1);
 y = Integer.valueOf(str1);

Character包装类的方法

 Character.isUpperCase(c)
  判断字符是否是大写字母
 Character.isLowerCase(c)
  判断字符是否是小写字母
 Character.isDigit(c)
  数字
 Character.isSpaceChar(c)
  空格

除了float和double以外,其余的都有缓冲:1个字节的空间;

Boolen --->都缓冲
Character ---> 0-127
Byte,Short,Integer,Long ----> -128~127
有缓存的数据,引用的是同一块内存地址
NumberFormatException 非数字异常

posted @ 2018-10-03 00:53  耳_东  阅读(73)  评论(0)    收藏  举报