第二周课程预习

String类

字符串在开发中的应用特点

String类的特点

  1. Java程序中所有双引号字符串,都是String这个类的对象 `String s = "字符串";可以直接创建对象

  2. 字符串一旦被创建,就不可更改

String s = "abc";
s = "def";  //实际上是新的"def"对象替换了原来s所记录的对象"abc"
System.out.println(s);

不可更改:是字符串内容不可更改,如果想要更改,只能使用新的对象,做替换

  1. String字符串虽然不可改变,但是可以被共享 字符串常量池:当使用双印花创建字符串对象时,会检查常量池中是否存在该数据 若不存在:创建 若存在:复用 (ps:不同的JDK版本,字符串常量池所在的位置不同 JDK7版本之前:StringTable是在方法区中,JDK7版本开始:StringTable被挪到了堆内存中)

String类常见的构造方法

  1. public String( ):创建一个空白字符串,里面不含任何内容 String s1 = new String( );

  2. public String(char[] chs):根据传入的字符数组,创建字符串对象 String s2 = new String( chs);

  3. public String(String original):根据传入的字符串,来创建字符串对象

String 类用于比较的方法

  • equals方法 public boolean equals(要比较的字符串) 将此字符串与指定的对象比较(内容比较) 谁调用都可以 eg: s1.equals(s2); 完全一样结果才为ture

  • equalsIgnoreCase public boolean equalsIgnoreCase(要比较的字符串) 不考虑大小写


String 类用于遍历的方法

  • toCharArray该方法将字符串拆解为数组 char[] chars = s.toCharArray(); (ps:如果调用的方法与主方法是平级的:加static,反之都不加) (此方法效率更高)

  • charAt——charAt(int 索引)

String s = "abcd";
for(int i=0;i<4;i++){
    char c = s.charAt(i); //完成字符串的遍历
}

使用length方法获取长度length(是一种方法,使用时不要忘了括号) 此时循环里可写成: for(int i=0;i<s.length;i++)


String 类用于字符串截取的方法

  • substring

  1. public String substring(int index):根据传入的索引开始做截取,截取到字符串的末尾 使用方法:String s2 = s.substring(2);

  2. public String substring(int bindex,int eindex):根据传入的开始和结束索引,对字符串进行截取 使用方法:String s2 = s.substring(0,1); 注意事项:包含头不包含尾

:截取出来的内容作为新的字符串返回,要找变量接收


String类用于替换的方法

  • replace public String replace(CharSequence target,CharSequence repalcement) 参数1:旧值 参数2:新值 ps:必须是原值完全匹配,才能用新值做替换


String类用于切割的方法

  • split public String[] split(String regex) (参数为规则) 例如:

String s = 192,168,1,1;
String[] sArr = s.split(",");
for(int i = 0;i < sArr.length;i++){
    System.out.println(sArr[i]);
}

制定规则时,先正常指定切割规则,若没有得到期望的结果,在规则前面加\\: "\\规则" 例如:若在上例中将逗号改为点,不能分割成功,因为"."是一个通配字符,可以代表任一字符,而在前面加上"\\."就可以解决问题


StringBuilder类

StringBuilder的作用:提高字符串操作效率

介绍

  1. 一个可变的字符序列

  2. StringBuilder是字符串缓冲区,将其理解是容器,这个容器可以存储任意数据类型,但是只要进入这个容器全都变成字符串 ps:打印对象名的时候结果呈现的也是字符串而不是地址


StringBuilder的构造方法

  1. public StringBuilder():创建一个空白的字符串缓冲区(容器),其初始容量为16个字符,超过之后容器会自动做扩容

  2. public StringBuilder(String str):创建一个空白的字符串缓冲区(容器),容器在创建好之后,就会带有参数的内容


StringBuilder常用成员方法

  • append public StringBuilder append(任意类型) :添加数据,并返回对象自己

StringBuilder stb = new StringBuilder;
stb.append("补药");
stb.append("上学");

链式编程:调用的方法,返回的结果是对象,就可以继续向下调用方法 stb.append("a").append("b").append("c")...; String[] sArr = stb.toString().split(",");

  • reverse public StringBuilder reverse():将缓冲区中的内容进行反转 应用案例:判断一个字符串是否为回文字符串,对拿到的字符串进行反转,若反转后的内容与原数据相同则为回文字符串

Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//将String转换为StringBuilder,以调用内部reverse方法
StringBuilder stb = new StringBuilder(s);
stb.reverse();
//接下来判断反转后的内容与原数据是否相同,即用s和stb作比较
//此时要注意s和stb的类型不同,不能直接比较,可将stb转为String类型
if(s.equals(stb.toString())){
    System.out.println("是对称字符串");
}
else{
    System.out.println("不是对称字符串");
}
  • length public int length():返回长度

  • toString public String toString():将缓冲区中的内容,以String字符串类型返回

使用场景:数据在StringBuilder中,但是要调用的方法StringBuilder没有而String有,就需要将数据转换为String再调用

->String转换为StringBuilder

String s = "abc";
StringBuilder stb = new StringBuilder(s);

->StringBuilder转换为String

StringBuilder stb = new StringBuilder();
String s = stb.toString();

-->案例:定义一个方法,把int中的数据按照指定的格式拼接成一个字符串返回 例如:数组int[] arr={1,2,3} 输出为[1,2,3]

public static String arrayToString(int[] arr){
    //创建一个StringBuilder对象,以进行拼接
    StringBuilder stb = new StringBuilder("[");
    //遍历数组,获取数组内部元素
    for(int i = 0; i < arr.length - 1; i ++){ //快捷键:arr.fori
    //将获取到的元素拼接到字符串缓冲区
    stb.append(arr[i]).append(",");
    }
    //特殊处理最后一个元素
    stb.append(arr[arr.length-1]).append("]");
    //将stb转为String类型
    return stb.toString();
}

(ps:StringBuilder用于线程不安全(效率高),StringBuffer用于线程安全(效率低))

包装类

将基本数据类型包装为类(变成引用数据类型) int->Integer char->Character (其他类一般都直接大写首字母)

Integer类

手动装箱:调用方法手动将基本数据类型包装为类

  1. public Integer(int value):通过构造方法(不推荐)

  2. public static Integer valueOf(int i):通过静态方法

Intefer i1 = Integer.valueOf(num)

手动拆箱:调用方法手动将包装类拆成(转换)基本数据类型 int i = i1.intValue;

JDK5开始,出现了自动拆装箱 自动装箱:可以将基本数据类型,直接赋值给包装类的变量 自动拆箱:可以将包装类的数据,直接赋值给基本数据类型变量

  • Integer常用方法(都是被静态修饰):

    1. toBinaryString:转二进制

    2. toOctalString:转八进制

    3. toHexString:转十六进制

    4. parseInt:将数字字符串转换为数字 注意:所转换的必须是数字字符串

Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1 == i2); //true
Integer i3 = 129;
Integer i4 = 129;
System.out.println(i3 == i4); //false

自动装箱的时候,如果装箱的数据范围,是-128~127,==号比较的结果就是true,反之都是false

自动装箱的原理:自动帮我们调用了Integer.valueOf(int i) 如果装箱的数据不在-128~127之间,会创建新的对象 如果在范围内,不会创建新的对象,而是从底层的数组中取出一个提前创建好的Integer对象并返回 (ps:Integer类中,底层存在一个长度为256个大小的数组Integer[] cache) 在数组中,存储了256个Integer对象,分别是-128~127)

BigDecimal类

用于解决小数运算中,出现的不精确问题

  • 创建对象

    1. public BigDecimal(double val)(不推荐:无法保证小数运算的精确)

    2. public BigDecimal(String val) BigDecimal bd = new BigDecimal("0.1");

    3. public static BigDecimal valueOf(double val) BigDecimal bd = BigDecimal.valueOf(0.1);

  • 常用方法

    1. add:加法

    2. subtract:减法

    3. multiply:乘法

    4. divide:除法

    5. divide(用于除不尽) 参数:(另一个BigDecimal对象,精确几位,舍入模式):除法 四舍五入模式:RoundingMode.HALF_UP 进一模式:RoundingMode.UP 去尾模式:RoundingMode.DOWN

      注意:如果使用BigDecimal运算,出现了除不尽的情况,就会出现异常

    6. doubleValue:将BigDecimal对象转换为基本数据类型double型

异常

介绍: 指的是程序在编译或执行过程中,出现的非正常(错误)的情况(语法错误不是异常)

  • 阅读异常信息:从下往上看

    1. 找异常错误位置

    2. 异常名称(Java中所有的异常都是类)

    3. 异常原因


异常的体系

Throwable->分为Error和Exception

Error:严重级别问题 常见:栈内存溢出,堆内存溢出

Exception异常类->分为RuntimeException及其子类(运行时异常)和除RuntimeException之外的所有异常(编译时异常) 编译时异常:编译阶段就出现的错误(语法错误不算),需要在运行之前给出解决方案 运行时异常:编译阶段没有错误,运行期间可能会出现的错误


异常的处理方式

Java对于异常的默认处理方式:向上抛出 处理流程: ①虚拟机会在出现异常的代码那里自动创建一个异常对象 ②异常会从方法中出现的点这里抛给调用这,调用者抛给JVM虚拟机 ③虚拟机接收到异常对象后,先在控制台直接输出异常信息数据 ④终止Java程序的运行,后续代码没有机会执行了

  • 异常处理方式1 try...catch捕获异常 好处:异常对象可以被捕获,后续的代码可以继续执行 格式:

    try{
        可能会出现异常的代码  //new 异常对象类()
    }catch(异常名称 对象名){ //类似于   类名 对象名
        异常的处理方案
    }catch(另一异常名称 对象名){ 
        异常的处理方案
    }

    执行流程:

    1. 执行try{}中的代码,看是否有异常对象产生

    2. 没有:catch不会捕获,后续代码继续执行 有:catch捕获异常对象,执行catch{}中的处理方案,后续代码继续执行 有多个异常可能性,编写多个catch进行处理 优化:(但是不建议,不能做精准处理)

      try{
          可能会出现异常的代码  //new 异常对象类()
      }catch(Exception e){ //用到父类:Exception e = new 异常名称();->多态
          异常的处理方案
      }

      注意:如果捕获多个异常,最大的异常要放到最后进行捕获

  • 异常处理方式2 throws 抛出异常 起到声明作用 在方法名后加throws XxxException,XxxxException (throws可以声明多个异常,用逗号做分割)

    • throw:用在方法中,后面跟的是异常对象,其作用是抛出异常对象 throws用在方法名后,起到声明作用

    • 抛出的异常对象如果是编译时异常,必须使用throws声明 如果是运行时异常,不需要写throws

选择:

正在面临的异常,是否需要暴露出来: -不需要暴露:try...catch捕获 -需要暴露:抛出异常


自定义异常

自定义编译时异常:创建一个类,继承Exception,重写构造器

自定义运行时异常:创建一个类,继承RunTimeException,重写构造器

异常的细节:
  • Throwable的常用方法: public String getMessage() 获取异常的错误原因 public void printStackTrace() 展示完整的异常错误信息(不会强制终止)

  • 子类重写父类方法时,不能抛出父类没有的异常,或者比父类更大的异常

容器与泛型

List

有序集合,元素顺序是固定的,可以包含重复的元素 可以通过索引快速访问和修改元素

  • 常见实现类:ArrayList、LinkedList、Vector

Set

无序集合,元素顺序不固定,具有唯一性,不允许添加重复的元素 通过迭代器访问元素

  • 常见实现类:HashSet、LinkedHashSet、TreeSet

Map

可以用于存储配置信息,缓存等

无序集合(但有些实现类可以保持插入顺序),键不可以重复,但是值可以重复 以键值对的形式存储数据,每个键只能映射到一个值,但是不同的键可以映射到相同的值 通过键访问值,或者通过迭代器访问键值对

  • 常见实现类:HashMap、LinkedHashMap、TreeMap

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值