JAVA

JAVA,第1张

JAVA 基础API API(Application Programming Interface,应用程序接口)是一些邓先定义的函数,目的是提供应用程序与开发人员基于 某软件可以访问的一些功能集,但又无需访问源码或理解内部工作机制的细节。也就是公司制定自己的系统接口。 学习方法

这里的每一个API方法都是独立的,一个没有记住不影响另外的API的使用
官方API手册
当一个构造方法嵌套层次较多时,可以从外往内分析,先查API手册看最外层的类的构造方法所需要的参数

API手册查询方法
  1. 查API手册
  2. 在IDEA中点击两次Shift打开IDEA工具的搜索框,选中右上角的include non-project items
  3. 在IDEA左侧External Libraries里面找到jdk1.8-> rt.jar->java.lang.Object
Object 对象 顶级父类
  • hashCode() 哈希码值
    本方法的作用是返回对应对象的int类型的哈希值,力求不同的对象返回不同的哈希值,这样就可以根据哈希值区分不同的对象。
  • toString() 对象默认的输出内容,在各种ide中都可以自动生成,比如IDEA中Generate->toString()
    使用System.out.println()方法时,会调用对象的toString()方法,默认会打印对象的getClass().getName() + "@" + Integer.toHexString(hashCode());
  • equals()与hashCode要保持一致,要重写都重写,要不重写都不重写。

如果不重写:

  1. hashCode()根据地址值生成
  2. equals()底层使用==

如果重写:
3. hashCode()根据重写后各属性值生成
4. equals()比较的是重写后类型+所有属性值

String
  • 不可变、不可继承官方文档
public final class String
    implements java.io.Serializable, Comparable, CharSequence {
    
    private final char value[];
}
  • 创建String对象的方式
  1. char[] values = {'a','b','c'};String s = new String(values);使用此种方式每次都会在堆中创建一个新的对象
  2. String s = "abc";推荐使用此种方式,写法简单,且字符串会入池。效果:第一次创建会正常放入常量池,但第二次创建时就不会再次创建了,使用的是之前创建好的值。

关于常量池相关的知识
深入解析String#intern
What is Java String interning?

  1. String s = new String("abc");使用此种方式每次都会在堆中创建一个新的对象
  • equals() String类已经重写了此方法,比较的是两者的字符的值,即相同内容的String将会返回true
  • hashCode()返回哈希值。String已重写了此方法,根据字符串的具体内容生成哈然值。所以只要字符串的内容相同,则其生成的哈希值也相同。
  • int length()返回此字符串的长度,返回的是字符的个数,中英文都是按一个字符算returns the number of characters contained in the string object
  • toUpperCase() 返回所有小写字符转成大写后的字符串
  • toLowerCase() 返回所有大写字符转成小写后的字符串
  • boolean startsWith(String prefix)判断字符串是否以prefix开头
  • boolean endsWith(String suffix) 判断字符串是否以prefix结尾
  • char charAt(int index) 返回char格式的指定索引处的字符
  • int indexOf(String str[, int fromIndex]) 返回当前字符串中str第一次出现的位置,fromIndex参数是可选的,意思是从fromIndex索引开始查找str第一次出现的位置,可用于查找第二次等出现的位置。
  • int lastIndexOf(String str[, int fromIndex]) 返回当前字符串中最后一次出现str的位置,fromIndex参数是可选的,指在[0,fromIndex]范围内查找最后一次出现str的位置
  • String concat(String str) 返回当前字符串与str拼接后的新串
  • String[] split(String regex) 按指定的regex将当前字符串拆分成一个字符串数组

regex为""时,返回逐个字符拆开后的数组,即"abc".split("");// ['a','b','c']
regex出现在末尾时,也不会出现空元素,即"abcb".split("b");// ['a','c']
regex一次也没有出现时,会返回只有一个当前字符串的数组,即"abc".split("d");// ['abc']
regex 支持转义字符 t n等都可以使用。正则表达式

  • String trim() 返回去掉了开头和结尾处的ASCII值<=u0020,也就是char值小于' '空格的char值的字符之后的新串,通过观察可以发现常遇到的如’n’:10、t:9、r:13这些还有一些其他的不可见与控制字符都是在空格之前的,因此一般使用trim()方法后基本可以确定剩下的就是可见字符开头和结尾的了。
  • byte[] getBytes()把字符串存储到一个新的 byte 数组中
StringBuilder 和 StringBuffer

String, StringBuffer, and StringBuilder

  • 特点:
  1. 封装了char[]数组
  2. 是可变的字符序列
  3. 提供了一组可以对字符内容修改的方法
  4. 常用append()来代替字符串做字符串连接”+”
  5. 内部字符数组默认初始容量是16:super(str.length() + 16);
  6. 如果大于16会尝试将扩容,新数组大小原来的变成2倍+2,容量如果还不够,直接扩充到需要的容量大小。int newCapacity = value.length * 2 + 2;
  7. StringBuffer 1.0出道线程安全,StringBuilder1.5出道线程不安全
正则表达式

正则表达式

  • 用途:主要用于校验数据

    String str = "a";a.matches(regex);
包装类
  • 基本类型没有任何功能,只是记录值,把基本类型进行包装,可以提供更加丰富的功能。
Integer
  • 构造函数
    new Integer(int i)
    Integer.valueOf(int i) 使用此种方式创建对象数据在 -128 ~ 127 范围内可以让引用变量直接指向缓存池内的对象,因此两个引用变量都使用此种方式赋值为相同的值时,两者使用==比较时结果为true
  • static int parseInt(String s) throws NumberFormatException将字符串参数作为有符号的十进制整数进行解析。除了第一个字符可以是用来表示负值的 ASCII 减号 ‘-’ (’u002D’) 外,字符串中的字符都必须是十进制数字。返回得到的整数值,就好像将该参数和基数 10 作为参数赋予 parseInt(java.lang.String, int) 方法一样。
Double

构造方法摘要
Double(double value) 构造一个新分配的 Double 对象,它表示基本的 double 参数。
Double(String s) 构造一个新分配的 Double 对象,表示用字符串表示的 double 类型的浮点值。

  • Double 没有缓存池,因此没有所谓高效的效果
  • static double parseDouble(String s)返回一个新的 double 值,该值被初始化为用指定 String 表示的值,这与 Double 类的 valueOf 方法一样。
自动拆、装箱
  • 自动装箱:
    Integer i = 127;编译器会自动把基本类型int 127 包装成包装类型Integer,然后交给Integer的类型的变量来保存,底层发生的代码实际是:Integer.valueOf(127); 自动装箱的方向 int【基本类型】 => Integer【包装类型】
  • 自动拆箱:
    int i1 = i;编译器会自动把包装类型i拆掉“箱子”,变回基本类型的数据127,然后交给基本类型的变量i1来保存,底层代码:int i1 = i.intValue();,自动拆箱的方向:Integer【包装类型】 => int【基本类型】
BigDecimal

本类常用来解决精确的浮点数运算不精确的问题

  • 构造函数
    public BigDecimal(String val)
    public BigDecimal(double val) 此种方式不推荐,在转换过程中可能会出现问题,如果确实需要传入double,可以使用new BigDecimal(doublevalue+"");的方式来避免不精确的问题

此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

  • 常用的四则运算
    public BigDecimal add(BigDecimal augend)
    public BigDecimal subtract(BigDecimal subtrahend)
    public BigDecimal multiply(BigDecimal multiplicand)
    public BigDecimal divide(BigDecimal divisor)此方法在除不尽时会抛出算术异常,因为没有办法精确表示结果,解决方案:需要额外设置除不尽时的保留位数和舍入方式。divide(a,b,c);

public BigDecimal divide(BigDecimal divisor,
int scale,
RoundingMode roundingMode)返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。如果必须执行舍入,以生成具有指定标度的结果,则应用指定的舍入模式。
参数:
divisor - 此 BigDecimal 要除以的值。
scale - 要返回的 BigDecimal 商的标度,就是保留位数。
roundingMode - 要应用的舍入模式。

舍入方式解析
ROUND_HALF_UP 四舍五入,五入 如:4.4结果是4; 4.5结果是5
ROUND_HALF_DOWN 五舍六入,五不入 如:4.5结果是4; 4.6结果是5
ROUND_HALF_EVEN 公平舍入(银行常用)参考银行家舍
比如:在5和6之间,靠近5就舍弃成5,靠近6就进位成6,如果是5.5,就找偶数,变成6
ROUND_UP 直接进位,不算0.1还是0.9,都进位
ROUND_DOWN 直接舍弃,不算0.1还是0.9,都舍弃
ROUND_CEILING(天花板) 向上取整,取实际值的大值
朝正无穷方向round 如果为正数,行为和round_up一样,如果为负数,行为和round_down一样
ROUND_FLOOR(地板) 向下取整,取实际值的小值
朝负无穷方向round 如果为正数,行为和round_down一样,如果为负数,行为和round_up一样

Scanner sc = new Scanner(System.in);
System.out.println("请输入两个小数:");
double a = sc.nextDouble();
double b = sc.nextDouble();
BigDecimal bd1 = new BigDecimal(a+"");
BigDecimal bd2 = new BigDecimal(b+"");
System.out.println("+"+bd1.add(bd2));
System.out.println("-"+bd1.subtract(bd2));
System.out.println(bd1.multiply(bd2));
System.out.println("/:"+bd1.divide(bd2,3,BigDecimal.ROUND_HALF_UP));
高级API IO

学习方式:学习父类的公共方法,学习子类对象的创建方式

Stream

File
  • new File(String path);只会在内存中创建一个File类型的对象,并不会在对应路径下创建一个真实的文件

path 为 时路径为当前磁盘的根目录 如D:
path 为 “” 时,路径为当前Project所在目录 ,如D:PersonalCGB210901

  • isDirectory() 是否是文件夹,当exists()方法返回false时,isDirectory()和isFile()都会返回false

  • length() 返回文件的大小,与windows系统中右键查看显示的字节数一致

  • isFile() 是否是文件

  • getName() 获取文件名字或文件夹的名字

  • getParent() file是文件时获取到的是D:a,如果是文件夹,获取到的是上一级目录 D:a,反正获取到的都是没有最后面的斜线

  • getAbsolutePath() 获取绝对路径,最后面是没有斜线

  • exists() 是否存在 ,实际工作过程中请先使用此方法进行存在性判断,再做后续的处理。

  • boolean createNewFile() 返回:如果指定的文件不存在并成功地创建,则返回 true;如果指定的文件已经存在,则返回 false .。会有IOException检查异常,需要处理掉才可以通过编译,否则报错。如果写的路径格式不正确,可能会报这个IOException异常

  • mkdirs() 创建多层文件夹

  • mkdir() 创建文件夹

  • delete() 删除文件或空文件夹

  • list() 文件及文件夹名字的数组

  • listFiles() 返回当前文件夹下的所有文件的数组,如果当前文件夹不存在或当前并非文件夹,则该方法返回的是Null

Stream InputStream FileInputStream
  • new FileInputStream(File fiile);
  • new FileInputStream(String path);
  • read(); 从输入流读取数据的下一个字节。值字节作为0到255范围内的整数返回。如果由于到达流的结尾而没有字节可用,则返回值-1。此方法会一直阻塞,直到输入数据可用、检测到流结束或引发异常为止。
InputStream in = null;
try {
	//创建流对象,注意 InputStream是抽象父类,不可以实例化
	//InputStream fin = new FileInputStream(new File("d:\a.txt"));//这种方式也可以,但是不常用,因为会创建一个File对象,浪费空间
	in = new FileInputStream("d:\a.txt");
	int read;
	//循环读取数据,只要读到的数据不等-1,说明还有数据,符合循环条件,继承循环
	while ((read = in.read()) != -1) {
		System.out.println(read + " " + Integer.toBinaryString(read));
	}
	in.close();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	try {
		in.close();// 关流 *** 作也有可能会抛出异常,因此也需要捕获
	} catch (IOException e) {
		e.printStackTrace();
	}
}
BufferedInputStream
InputStream in = null;
try {
    in = new BufferedInputStream(new FileInputStream("D:\a.txt"));
    int b;
    while ((b = in.read()) != -1) {
        System.out.println(b);
    }
} catch (Exception e) {
    e.printStackTrace();
}finally {
	try {
	    in.close();
	} catch (IOException e) {
	    e.printStackTrace();
	}
}
Reader FileReader
Reader reader = null;
try {
    reader = new FileReader("D:\a.txt");
    int read;
    while ((read = reader.read()) != -1) {
        char c = (char)read;
        System.out.print(c);
    }
} catch (Exception e) {
    e.printStackTrace();
}finally {
	try {
	    reader.close();
	} catch (IOException e) {
	    e.printStackTrace();
	}
}
BufferedReader
BufferedReader br = null;
try {
    br = new BufferedReader(new FileReader("D:\a.txt"));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.print(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}finally {
	try {
	     br.close();
	 } catch (IOException e) {
	     e.printStackTrace();
	 }
}
OutputStream FileOutputStream、 BufferedOutputStream
  • FileOutputStream的重载构造方法里面有一个boolean append的参数,如果 true则使用追加写入。
OutputStream out = null;
try {
    out = new BufferedOutputStream(new FileOutputStream("D:\a.txt",true));// boolean append
    out.write(97);
} catch (IOException e) {
    e.printStackTrace();
}finally {
    try {
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
BufferedWriter writer = null;
try {
    writer = new BufferedWriter(new FileWriter("D:\a.txt", true));
    writer.write("中国");
} catch (IOException e) {
    e.printStackTrace();
}finally {
    try {
        writer.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4674224.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存