当前位置: 代码迷 >> 综合 >> Day07——Java基础——object类、scanner类、String类、StringBuffer类、基本数据类型对应包装类、自动拆装箱
  详细解决方案

Day07——Java基础——object类、scanner类、String类、StringBuffer类、基本数据类型对应包装类、自动拆装箱

热度:39   发布时间:2023-12-15 15:48:17.0

JAVA常用API

概念:
API全名:application(应用) programming(程序) interface(接口)
API是应用程序编程接口

Java API
Java API就是sun公司提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
我们可以通过查帮助文档来了解Java提供的API如何使用

API就是java的工具类,使用时候导包可以直接使用,不需要自己定义,而是由java本身提供好的类完成功能
(在java开发过程中,有很多功能java已经提供了,我们只需要记住那些类可以实现哪些方法,在开发过程中灵活调用即可(面向对象编程思想))
所谓的程序开发就是new对象(可能java提供工具类对象、自定义类对象)调方法

在进行工具类的使用时需要进行导包操作,但是有些常用工具类可能在java运行时本身需要用,还有大部分对于程序员开发而言常用的工具类,如果需要每次使用时额外导入,很麻烦,多以对于一些常用的工具类,java将其放在了java.lang包下,将java.lang包默认导入所有类

Object类
Object是所有类的超类。内含许多本地方法。
主要方法
public String toString()及其重写
public int hashCode()方法
public boolean equals(Object obj)及其重写
equals方法介绍
==与equals()的差别
在object中两者用法实现功能相同,但equals判断的是是否为同一个对象,对内存地址是否相同
==判断的是是否全等,当进行基本数据类型判断时,判断的是常量地址是否相同,判断对象时判断的是对象地址是否相同(判断指定内容是否全等)
String中重写了object的equals方法,用于判断两字符串内容是否一致

// object顶级父类 是所有类的父类// 所有类都会获得object类提供的方法Object o1 = new Object();Object o2 = new Object();Object o3 =o1;// 声明一个Object类变量名为o1用于保存// 创建的一个新的Object类对象// 声明的变量必须经过赋值后才能使用// toString方法 将对象以字符串的形式返回// Object类返回的是当前对象的地址// 当直接将对象输出时默认调用对象的toString方法System.out.println("toString");String string = o1.toString();System.out.println(string);System.out.println(o1);// hashCode方法 返回对象在程序运行期间唯一标识// 无论程序结束运行后再次运行多少次 hashcod值不变// hashCode值是根据内存地址计算的System.out.println("hashCode");int hashCode = o1.hashCode();System.out.println(hashCode);//equals方法 判断两对象地址是否相同System.out.println("equals");System.out.println(o1);System.out.println(o3);System.out.println(o1.hashCode());System.out.println(o3.hashCode());System.out.println(o1.equals(o3));

Scanner 类
常用于控制台录入。完成获取数据获取功能。
主要方法
构造方法中指定数据源的理解
public int nextInt()及其他next前缀方法方法
public String nextLine()方法

  // Scanner扫描器类// 用于获取控制台的输入数据// 通过相应方法获取指定数据类型数据// 是java初期动态获取数据的主要方式之一// 与其他工具类不同Scanner不在java.lang包下// 所以在进行使用时需要进行导包操作 import java.util.Scanner;Scanner sc = new Scanner(System.in);//扫描器类需要在构造方法中传入扫描位置控制台的输入内容//nextInt 用于获取控制台下一个输入的整数类型的数据//其中还提供了额外很多其他基本数据类型的数据获取方法int nextInt = sc.nextInt();System.out.println(nextInt);//nextLine 用于获取控制台下一行输入的内容String nextLine = sc.nextLine();System.out.println(nextLine);//在进行操作时可能会出现前一个获取操作方法与后一个方法相冲突

String类
字符串数据类型。属于引用数据类型。
String类的特殊性:
字符串为常量,字符串值一旦初始化便不可以修改。
常量池:在java用于保存在编译期已确定的,已编译的class文件中的一份数据。
主要方法
判断:

重写equals方法
public boolean equalsIgnoreCase(String anotherString)方法
public boolean contains(CharSequence s)方法
public boolean startsWith(String prefix)及其重载方法
public boolean endsWith(String suffix)方法
public boolean isEmpty()方法
获取:
public int length()方法
public char charAt(int index)方法
public int indexOf(int ch)及其重载方法
public int lastIndexOf(int ch)及其重载方法
public String substring(int beginIndex)及其重载方法
转换
public char[] toCharArray() 方法
public byte[] getBytes()方法
重写toString方法
public static String copyValueOf(char[] data)及其重载方法
public static String valueOf(boolean b)及其重载方法
public String toLowerCase()方法
public String toUpperCase()方法
public String concat(String str)方法
其他:
public String replace(char oldChar, char newChar)方法
public String[] split(String regex)方法
public String trim()方法
public int compareTo(String anotherString)方法
public int compareToIgnoreCase(String str)方法

// String字符串类// 用于保存字符串常量的引用数据类型// 保存字符串为常量 不允许修改// 这里的常量指的是具体字符串数据// 常量创建后存储在常量池中// 对于String类型而言,每次赋值相当去// 常量池中寻找是否有已存储的指定常量,没有在常量池中创建// 对于String重复赋值可能会加大常量中数据压力// String重写了object的toString改为直接返回当前保存的字符串内容// 因为字符串数据保存在常量池中,而不是像其他引用数据类型,不同对象// 物理地址位置不同,但是String因为其特殊性保存数据的位置为常量池// 导致不同对象存储数据的物理地址相同// 从而导致Sting这一引用数据类型的创建既可以使用基本数据类型的创建方式// 也可以使用引用数据类型new 构造方法的形式创建String s1 = "";String s2 = new String();String s3 = new String("");System.out.println(s1 == s2);System.out.println(s1.equals(s2));System.out.println(s2 == s3);System.out.println(s1.equals(s3));System.out.println();System.out.println("equalsIgnoreCase方法");// equalsIgnoreCase 用于比较两字符串在不考虑大小写的情况下是否内容相等String eic1 = " abcdefga ";String eic2 = "AbCdEfG123123";System.out.println(eic1.equals(eic2));System.out.println(eic1.equalsIgnoreCase(eic2));System.out.println();System.out.println("contains方法");// contains用于判断指定字符串中是否包含另一个字符串System.out.println(eic1.contains("sada"));System.out.println(eic1.contains("bcde"));System.out.println("startWith/endWith方法");// startWith/endWith用于判断指定字符串开始、结尾是否为另一个字符串System.out.println(eic1.startsWith("abc"));System.out.println(eic1.endsWith("cdefg"));System.out.println("isEmpty方法");// isEmpty 用于判断字符是否为空字符串""System.out.println(s1.isEmpty());System.out.println("length方法");// length 用于返回当期字符串的长度(字符个数)System.out.println(eic1.length());System.out.println("charAt方法");// charAt 用于返回指定索引位置的char字符数据索引范围0~length()-1char c = eic1.charAt(3);System.out.println(c);System.out.println();System.out.println("indexOf方法");// indexOf 用于返回指定字符串在当前字符串中第一次出现的索引位置// 若没有匹配到指定字符串 返回-1System.out.println(eic1.indexOf("a"));System.out.println("indexOf方法");// lastIndexOf 用于返回指定字符串在当前字符串中最后一次出现的索引位置// 若没有匹配到指定字符串 返回-1System.out.println(eic1.lastIndexOf("a"));System.out.println();System.out.println("substring方法");// substring 用于从指定字符串中截取字符串// 开始位置为索引位置 结束位置可以不写 截取从开始位置到最后// 当输入开始与结束位置 截取内容包含起始位置不包含结束位置// 截取字符串的长度为结束位置-起始位置// 快速得到截取字符串 从起始位置开始算 取结束位置-起始位置个得到结果System.out.println(eic1.substring(2));System.out.println(eic1.substring(2, 5));System.out.println(eic1.substring(2, 6));// [2,6)System.out.println("valueOf方法");// valueOf 将指定类型的数据转换为字符串对象System.out.println(String.valueOf(1) instanceof String);System.out.println("toLowerCase方法");// toLowerCase 用于将指定字符串中大写字母转换为小写System.out.println(eic2.toLowerCase());System.out.println("toUpperCase方法");// toUpperCase 用于将指定字符串中小写字母转换为大写System.out.println(eic2.toUpperCase());System.out.println("concat方法");// concat 用于将两字符进行拼接操作System.out.println(eic1 + eic2);System.out.println(eic1.concat(eic2));System.out.println("replace方法");//replace 用于将指定字符串中的字符替换为指定字符System.out.println(eic1.replace('a', '*'));System.out.println(eic1.replace("ab", ""));System.out.println("trim方法");//trim 用于去除字符串首末位空白字符" "System.out.println(eic1.trim());System.out.println("compareTo/compareToIgnoreCase方法");//compareTo(区分大小写)/compareToIgnoreCase(不区分大小写)//使用Unicode值进行减法运算 实现排序//返回负数说明指定字符应在原字符后//返回正数说明指定字符应在原字符前String a="a"; String b="b";System.out.println(a.compareTo(b));System.out.println(b.compareToIgnoreCase("B"));

Stringbuffer、Stringbuilder类
概念:
字符串缓冲区,缓冲区用于存储数据,所以也称之为容器。字符串的组成原理就是通过该类实现的。
StringBuffer与String的区别:
效率更快,避免了过多字符串常量垃圾对象的产生
前者用于生成字符串,后者用于表示字符串
后者为常量,前者是“可变化的量”
主要方法
构造:
public StringBuffer()
public StringBuffer(int capacity) :StringBuffer有容量和长度
public StringBuffer(String str)
public StringBuffer(CharSequence seq)
主要方法
重写:
public String toString()
添加&删除:
public StringBuffer append(boolean b)及其重载方法
public StringBuffer insert(int offset, boolean b)及其重载方法
注意链式编程
public StringBuffer delete(int start, int end)
public StringBuffer deleteCharAt(int index)
替换&反转&截取
public StringBuffer replace(int start, int end, String str)
public StringBuffer reverse()
public String substring(int start)
public String substring(int start, int end)
与String相互转换
构造与toString方法
概念:
字符串缓冲区,缓冲区用于存储数据,所以也称之为容器。字符串的组成原理就是通过该类实现的。
StringBuffer与String的区别:
效率更快,避免了过多字符串常量垃圾对象的产生
前者用于生成字符串,后者用于表示字符串
后者为常量,前者是“可变化的量”
主要方法
构造:
public StringBuffer()
public StringBuffer(int capacity) :StringBuffer有容量和长度
public StringBuffer(String str)
public StringBuffer(CharSequence seq)
主要方法
重写:
public String toString()
添加&删除:
public StringBuffer append(boolean b)及其重载方法
public StringBuffer insert(int offset, boolean b)及其重载方法
注意链式编程
public StringBuffer delete(int start, int end)
public StringBuffer deleteCharAt(int index)
替换&反转&截取
public StringBuffer replace(int start, int end, String str)
public StringBuffer reverse()
public String substring(int start)
public String substring(int start, int end)
与String相互转换
构造与toString方法

// StringBuffer 带有缓冲区的字符串对象// 数据存储在当前对象的缓冲区中// 对数据的操作也是在当前缓冲区中// 对数据的操作会直接影响当前对象的值// 链式编程对于一些方法的连续调用 不使用中间变量而是直接继续调用方法StringBuffer sBuffer = new StringBuffer("hello");sBuffer.append(" ").append("world!");String str = "hello";str.concat(" ").concat("wolrd!");// System.out.println(str);//值没有被修改// System.out.println(sBuffer);//值被方法修改// insertsBuffer.insert(0, " ");// deletesBuffer.delete(0, 1);// deleteCharAtsBuffer.deleteCharAt(1);// replacesBuffer.replace(0, 1, "abcdefg");// reversesBuffer.reverse();//substring 返回的是String字符串(截取部分)String substring = sBuffer.substring(3,5);System.out.println(sBuffer);System.out.println(substring);

StringBuilder
方法与StringBuffer完全相同
效率更快
线程不安全
String 、StringBuffer 、StringBuilder区别
1、保存数据的区别
String中保存的是常量数据存储在常量池中, StringBuffer/StringBuilder是变量,数据保存在本身缓存区(内存空间)中

2、对于内存消耗的区别
String在多次赋值会创建多个常量,且之前创建的常量也会一直保存在常量池中,直到程序运行结束,GC(垃圾回收机制)进行资源的回收释放
StringBuffer/StringBuilder数据操作全在缓存区(自身内存空间)中,不会对常量池,以及除了本身缓存区对内存的消耗外,产生其他消耗

3、对于数据的操作
String操作缓存区中数据的物理地址,StringBuffer/StringBuilder操作的是本身缓存区中数据,String方法只会返回新的字符串不会对本身进行修改,StringBuffer/StringBuilder会直接将缓存区中存储的数据进行修改

4、执行速度的区别
StringBuilder> StringBuffer>String
StringBuilder不需要考虑线程安全性所以速度大于StringBuffer

5、使用频率
String> StringBuffer> StringBuilder
String经常用于修改较少只进行数据保存这一功能的场景

基本数据类型包装类
包装类:
基本数据类型是类吗?不是
那么对于基本数据类型的方法怎么调用?
方法的调用时通过对象调用或者通过类调用
基本数据类型不是类,但是我们还想为其提供方法并支持调用
从而开发了出了包装类这一概念
对每个基本数据类型进行包中融入面向对象的编程思想——万物皆对象
每个具体的基本数据类型按照起类型分别定义了对应的包装类

java虚拟机为了优化8种基本数据类型的包装对象都提供了缓冲池,缓冲池有大小,一个字节。
Java为每个基本数据类型像String与StringBuffer一样提供了一个用于操作基本数据类型有缓存区的相应类

byte =>Byte
short =>Short
int => Integer
long =>Long
float =>Float
double =>Double
Boolean =>Boolean
char => Character

java1.5新特性自动拆装箱

java中基本数据类型与其包装类的自动类型转换

自动装箱:把基本类型转换为包装类类型
int基本类型可以直接赋值给包装类对象
自动拆箱:把包装类类型转换为基本类型
包装类对象可以直接与基本类型进行计算

//包装类//常用方法//valueOf String(获其他数据类型)转化相应的包装类对象Integer i=new Integer(10);Double valueOf = Double.valueOf("4654.1254");System.out.println(valueOf);//包装类与基本数据类型的互相转换//intValue 将包装类转换为基本数据类型double intValue = valueOf.doubleValue();//构造方法 与 valueOf都可以将基本数据类型转换为相应数据的包装类对象Integer valueOf2 = Integer.valueOf(100);Integer valueOf1 = Integer.valueOf("4654");//每个包装类都有valueOf这个方法用于类型转换//也都有相应的转换为基本数据类型的方法//char类型的包装类Character额外提供了很多方法用于单个字符的操作//提供的是静态方法//判断指定字符是否是字母System.out.println(Character.isLetter('2'));//判断指定字符是否是大写字母System.out.println(Character.isUpperCase('3'));//判断指定字符是否是小写字母System.out.println(Character.isLowerCase('2'));//判断指定字符是否是数字System.out.println(Character.isDigit('a'));//判断指定字符是否是字母或数字//加删除线的方法称之为过时方法(已经有更好的方法替代,在下一个java更新版本//可能会被删除 不建议使用)
// 注意:所有删除方法被标志为删除那么肯定意味着有更好的方法替代实现了相同的功能System.out.println(Character.isJavaLetterOrDigit('a'));System.out.println(Character.isLetterOrDigit('.'));//是否是符号System.out.println(Character.isDefined('.'));
  相关解决方案