JavaSe学习笔记

文章目录

    • JavaSe
      • 零散点
      • 字符串
      • 多态
      • 时间类+格式化时间
        • Date类
        • SimpleDateFormat类
        • Calendar类
      • 正则表达式
        • 字符类
        • 预定义字符
        • 贪婪量词
      • Lambda表达式
      • 泛型
      • 迭代器
        • For循环增强
      • 可变参数
      • Collection集合
        • List系列集合
        • Set系列集合
      • Collections
      • Map集合
      • Stream流
      • 异常
        • 运行时异常
        • 异常处理
      • 日志
        • Logback
        • 实现
        • 日志级别
      • File类
        • 创建File对象
        • 删除文件
        • 遍历
        • 编解码
      • IO流
        • 字节流
          • 字节输入
          • 字节输出
        • 字符流
          • 字符流输入
          • 字符流输出
      • 缓冲流
        • 字节缓冲流
          • 字节缓冲输入流
          • 字符缓冲输入流
          • 字符缓冲输出流
        • 字符转换流
          • 字符输入转换流
          • 字符输出转换流
      • 打印流
      • Properties类
      • 多线程
      • 反射

之前一直在看黑马程序员的Java教程,平时记录也就是把视频中的ppt截图存放。但是时间久了发现之前很多内容都没有记牢,熟用。现在改用文字记录总结平时学习到的内容,同时学会熟练使用MarkDown写法。Java官方API文档。

JavaSe

零散点

  • Java文件的名称和Public修饰的类名相同,类中包含一个或多个方法,从main方法开始执行
  • final修饰的变量不可重新赋值改变,final声明的类为最终类,不能被继承
  • 只有当被除数是负数时余数才是负数
  • 强制类型转换–>(类型)变量
  • sc.next()读取以空格为结束的字符串,sc.nextLine()读取以回车会结束的字符串
  • 数值型字符串转换为整数–>int 变量名 = Interger.parseInt(字符串)
  • 数组间用=表示新数组指向原数组
  • 重载方法->同名不同参
  • 不可变集合List.of(“”,“”)返回一个集合
  • finally之前的try中如果有return语句,会先执行finally语句再执行return语句
  • static{}可用于初始化,main方法之前执行
  • 打印一个对象,会默认调用toString方法,如果没重写toString方法,就返回对象地址
  • 接口中的方法默认由public abstract修饰,常量默认由public static final修饰
  • 接口中被default修饰的方法可以直接补全方法的代码,接口被实现后可直接使用该方法

字符串

  • toCharArray()->将字符串拆分返回一个字符数组
  • substring(start,end)->从start开始到end截取字符串返回一个新字符串
  • replace(“a”,“b”)->将字符串中的a全部替换成b
  • split(“,”)->将字符串以","分隔,返回一个字符串数组

多态

格式:

  • 父类 实例对象名称 = new 子类构造器
  • 父类转子类(instanceof判断) -> 子类 名称 = (子类)实例对象名称
  • 方法调用: 编译看左边,运行看右边
  • 变量调用: 编译,运行都看左边

时间类+格式化时间

Date类

Date类位于util包内,用于操作时间。
格式:

  • Date nowTime = new Date(ms);当ms存在时,将该毫秒值转换为日期对象

方法:

  • getTime()获取毫秒值(距1970年01月01日 00时00分00秒)、System类中的currentTimeMillis()也可以获取毫秒值

SimpleDateFormat类

格式:

  • SimpleDateFormat 对象名称 = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss EEE a”);
  • 调用对象的format(Date类)方法返回一个格式化后的字符串
  • 调用对象的parse(格式化字符串)返回一个的Date类

实例:

// 格式化时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss Ea");
//获取当前时间
String nowTime = "2022年05月19日 21:10:53 星期六 上午";
//将格式化后的时间转换为日期对象
Date d = sdf.parse(nowTime);
//获得日期对象的毫秒数
Long time = d.getTime();
//经过1天2小时2分钟2秒
Long time2 = time + (24*3600+2*3600+2*60+2)*1000;
//将时间格式化
System.out.println(sdf.format(time2));

Calendar类

Calendar是一个抽象类,不能直接创建对象。

方法:

  • get(int field)返回日期某个字段信息(Year、Month、Day)
  • set(int field,int value)修改日历的某个字段信息
  • add(int field,int amount)为某个字段增/减指定的值
  • getTime()拿到此刻日期对象,返回一个Date对象
  • getTimeInMillis()拿到此刻时间毫秒值

正则表达式

方法:

  • matches(),判断是否匹配正则表达式,返回Boolean类型

字符类

  • [abc]指定字符
  • [^abc]除了指定字符外的字符
  • [a-zA-Z]从a(A)到z(Z)包括
  • [a-d[m-p]]从a到d或从m到p
  • [a-z&&[^def]]从a到z除去指定字符
  • [a-z&&[^m-p]]从a到z除去指定范围字符

预定义字符

  • .任何字符
  • \d一个数字[0-9]
  • \D非数字[^0-9]
  • \s一个空白字符[\t\n\x0B\f\r]
  • \S非空白字符[^\s]
  • \w英文、数字、下划线[a-zA-Z_0-9]
  • \W一个非单词字符[^\w]

贪婪量词

  • X? x,一次或无
  • x* x,0次或多次
  • x+ x,一次或多次
  • x[n] x,n次
  • x[n,] x,至少n次
  • x[n,m] x,至少n不超过m

Lambda表达式

简化函数式接口(接口中有且仅有一个抽象方法,通常加@FunctionalInterface注解)匿名内部类的代码写法

格式:

  • (匿名内部类被重写方法的形参列表)->{被重写方法的代码}

实例:

public class LambdaDemo1 {
    public static void main(String[] args) {
        run( () ->{
            System.out.println("放飞");
        });
    }

    public static void run(Play p){
        p.fly();
    }
}

@FunctionalInterface
interface Play{
    void fly();
}

泛型

格式:

  • 修饰符 class 类名<泛型变量>{} 泛型方法
  • 修饰符 <泛型变量> 返回类型 名称(){} 泛型类
  • 修饰符 interface 接口名称<泛型变量>{} 泛型接口

作用:

  1. 编译阶段指定数据类型
  2. 泛型接口可以让实现类选择当前功能需要操作的数据类型

拓展:

  • 其中?作为通配符, 表示?必须是car或其子类(或其父类)
  • 泛型和集合都只支持引用数据类型,不支持基本数据类型,集合中存储的元素认为是对象

迭代器

格式:
Iterator iterator()返回迭代器对象

方法:

  • hasNext()询问当前位置是否有元素返回Boolean

For循环增强

格式:
for(元素数据类型 变量名:可迭代对象){
该变量就是元素
}

可变参数

格式:数据类型…参数名称(本质是一个数组)

Collection集合

方法:

  • add(E e)将对象e添加到指定集合
  • clear()清除所有元素
  • remove(E e)将对象e移除当前集合
  • contains(Object obj)判断当前集合是否含指定对象
  • isEmpty()判断当前集合是否为空
  • size()返回集合中元素个数
  • toArray()集合中的元素存储到数组

List系列集合

元素有序、可重复、有索引

  1. ArrayList
    有序、可重复、有索引
  2. LinkedList
    有序、可重复、有索引
    特有功能:
  • addFirst(E e)从列表开头插入元素
  • addLast(E e)添加到末尾
  • getFirst()得到列表第一个元素
  • removeFirst()删除第一个

Set系列集合

哈希值:JDK根据对象的地址,按照规则算出来的int类型的数值。hashCode()方法返回对象哈希值

元素无序、不重复、无索引

  1. HashSet
    无序、不重复、无索引
  2. LinkedHashSet
    有序、不重复、无索引
  3. TreeSet
    按大小默认升序、不重复、无索引。
  • 存储元素为对象时,实现Comparable接口重写compareTo方法自定义比较规则。
  • TreeSet集合有参构造器可以设置Comparator接口对应比较器对象,定制规则

Collections

作用:
Collections不属于集合,使用来操作集合的工具类

方法:

  • addAll(Collection )给集合批量添加元素
  • shuffle(List list)打乱list集合元素顺序
  • sort(List list, Comparator c)指定规则排序

Map集合

格式: Map<数据类型,数据类型> maps = new Map<>()
键值对应key=value,无序不重复,无索引

方法:

  • put(K key,V value)添加元素
  • remove(Object key)根据键删除键值对元素
  • clear()移除所有键值对元素
  • containKey(Object key)判断集合是否包含指定的键
  • isEmpty()判断集合是否为空
  • size()集合长度,即键值对个数
  1. HashMap
    无序、不重复、无索引
  • LinkedHashMap——有序、不重复、无索引
  1. HashTable
  2. TreeMap
    排序、不重复、无索引

Stream流

Stream操作集合或数组首先要得到stream流,再使用流的功能
通过Collection接口中stream方法实现

方法:

  • filter(Predicate predicate)对流中数据进行过滤
  • limit(long maxSize)获取前几个元素
  • skip(long n)跳过前几个元素
  • distinct()去除流中重复元素
  • collect(Collector collector)开始收集stream流,指定收集器
  • toList()/toSet()/toMap(Function key,Function value)把元素收集到List/Set/Map集合中

实例1:

##去除最高工资和最低,计算平均
list1.stream().sorted((e1,e2) -> Ddouble.compare(e1.getSalary(),e2.getSalary)).skip(1).limit(list1.size()-1).forEach(e ->{
	allMoney += (e.getSalary());
});
averageMoney /= allMoney(list1.size()-2);

实例2:

Stream<String> s1 = list.stream().filter(s -> s.startsWith("王"));
List<String> wangList = s1.collect(Collectors.toList());

异常

  • Error:系统级别问题,JVM退出
  • Exception:java.lang包下,异常类,可处理问题(包括运行时异常(RuntimeEXCEPTION)和编译时异常)

运行时异常

  • ArrayIndexOutOfBoundsException数组索引越界异常
  • NullPointerException空指针异常
  • ArithmeticException数字操作异常
  • ClassCastException类型转换异常
  • NumberFormatException数字转换异常

异常处理

格式:
try{
//监视可能出现异常的代码
}catch(异常类型 变量){
//异常处理
}Finally{

}
或者方法直接将异常通过throws抛出给调用者

日志

规范接口:Commons Logging(JCL)
实现框架:Log4j、JUL(java.util.loggiing)、Logback

Logback

基于slf4j的日志规范实现的框架

技术模块:

  • logback-core:为其他两个模块奠定基础
  • logback-classic:log4j的改良版本
  • logback-access:模块与Tomcat和Jetty等Servlet容器集成,提供HTTP访问功能

实现

  1. 在项目新建文件夹lib,导入Logback相关jar包(logback-classic、logback-core、slf4j-api),并添加到项目依赖库
  2. 在Logback核心配置文件logback.xml拷贝到src目录下
  3. 在代码中获取日志对象(public static final Logger LOGGER=loggerFactory.getLogger())

日志级别

TRACE < DEBUG < INFO < WARN < ERROR(默认基本为debug)

File类

位于java.io.File下用于文件操作

方法:

  • isDirectory()是否为文件夹
  • isFile()是否为文件
  • exists()是否存在该文件
  • getAbsolutePath()返回绝对路径字符串
  • getPath()路径转为字符串
  • getName()获取文件(夹)名称
  • lastModified()获取最后修改的时间毫秒值

创建File对象

public File(String pathname)方法
File f1 = new File(“D:/blog/myblog/data.txt”)
方法:

  • createNewFile()创建一个新的空文件夹(实例化对象时可直接创建)
  • mkdir()只能创建一级文件夹
  • mkdirs()可创建多级文件夹

删除文件

  • delete()不走回收站且默认只能删除空文件夹

遍历

  • list()获取目录下所有一级文件名到一个字符串数组中返回
  • listFiles()获取目录下所有一级文件对象到一个文件对象数组中返回

实例:

//递归找文件
public static void searchFile(File dir,String fileName){
		if(dir != null && dir.isDirectorry()){
			File[] files = dir.listFiles()
			if(files != null && files.length>0){
				for(File file : files){
					if(file.isFile()){
						if(file.getNmae().contains(fileName)){
							System.out.println("找到了"+file.getAbsolutePath());
					}
				}else{
					searchFile(file,fileName);
				}
			}
		}
	}else{
		System.out.println("当前搜索的位置不是文件夹");
	}
}

编解码

IDE默认字符集进行编码(UTF-8方式)
byte[] bytes = name.getBytes(“GBK”);//指定GBK编码方式

IO流

  • flush()刷新流,还可继续写数据
  • close()关闭流,释放资源

字节流

字节输入

作用:
以内存为基准,把磁盘文件中的数据以字节形式读取到内存中
方法:

  • FileInputStream(File file)创建字节输入流管道与源文件对象接通
  • FileInputStream(String pathname)创建字节输入流管道与源文件路径接通
  • read()每次读取一个字节返回,没有字节可读返回-1
  • read(byte[] buffer)每次读取一个字节数组返回,没有字节可读返回-1
    实例:
File f = new File("Delete/src/data.txt");
InputStream is = new FileInputStream(f);//或者直接将f换成路径
byte[] buffer = new byte[(int)f.length()];
System.out.println(new String(buffer));
字节输出

作用:
以内存为基准,把内存中的数据以字节形式写出到磁盘文件中去的流
方法:

  • FileOutputStream(File file,Boolean append)创建字节输出流管道与源文件对象接通,可追加s数据
  • FileOutputStream(String filepath)创建字节输出流管道与源文件路径接通
  • write()写一个字节出去
  • write(byte[] buffer,int pos,int len)写一个字节数组的一部分出去

字符流

字符流输入

作用:
以内存为基准,把磁盘文件中的数据以字符形式读取到内存中
方法:

  • FileReader(File file)创建字符输入流管道与源文件对象接通
  • FileReader(String pathname)创建字符输入流通道与源文件路径接通
  • read()每次读取一个字符返回,没有字符可读返回-1‘
  • read(char[] buffer)每次读取一个字符数组,返回读取字符个数,无字符可读返回-1
    实例:
Reader fr = FileReader("Delete/src/data.txt");
char[] buffer = new char[1024];
int len;
while((len = fr.read(buffer)) != -1){
	String rs = new String(buffer, 0 ,len);
	System.out.print(rs);
}
字符流输出

作用:
以内存为基准,把内存中的数据以字符形式写到磁盘文件中的流
方法:

  • FileWriter(File file,boolean append)创建字符输出流管道与源文件对象接通,可追加数据
  • FileWriter(String filepath)创建字符输出流管道与源文件路径接通

缓冲流

作用:
缓冲流自带缓冲区、可以提高原始字节流、字符流读写的性能
数据源->字节流->缓冲流->内存->缓冲流->字节流->目的地

字节缓冲流

字节缓冲输入流

作用:
提高字节输入流读取数据的性能,
构造器:
public BufferedInputStream(inputStream is)可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能

字符缓冲输入流

作用:
提高字符输入流读取数据的性能,按行读取数据
构造器:
public BufferedReader(Reader r)把低级的字符输入流包装成一个高级的字符输入流通道
方法:

  • readLine()读取一行数据返回,无行可读返回null
    实例:
Reader fr = new FileReader("Delete/src/data.txt");
BufferedReader br = new BufferedReader(fr);
String line;
while((line = br.readLine()) != null){
	System.out.println(line);
}
字符缓冲输出流

作用:
提高字符输出流读取数据的性能,有换行功能
构造器:
public BufferedWriter(Writer w)把低级的字符输出流包装成一个高级的字符输出流通道
方法:

  • newLine()换行操作

字符转换流

字符输入转换流

构造器:
public InputStreamReader(InputStream is,String charset)把原始字节输入流按代码指定编码转换成字符输入流

字符输出转换流

构造器
public OutputStreamWriter(OutputStream os,String charset)把原始字节输出流按代码指定编码转换成字符输出流

打印流

作用:实现方便、高效的打印数据到文件中去
构造器:
public PrintStream(OutputStream os/File f/String filepath)
方法;
public void print(Xxx xx)打印任意类型数据出来
实例:

System.out.println("a");
OutputStream os = new FileOutputStream("Delete/src/data1.txt",true);
PrintStream ps = new PrintStream(os);
System.setOut(ps);//改变打印流位置(重定向)
System.out.print("asdasz");

Properties类

定义:继承于hashtable,属性集中每个键对应一个值(都为字符串)

方法 作用
String getProperty(String key) 用指定的键在此属性列表中搜索属性。
String getProperty(String key, String defaultProperty) 用指定的键在属性列表中搜索属性。
Object setProperty(String key, String value) 调用 Hashtable 的方法 put,实现新增键值对

多线程

线程:一个程序内部的一条执行路径

反射

Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。
先获取编译后的Class类对象,然后得到Class的全部成分

反射的作用
我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗!

你可能感兴趣的:(笔记,学习,java,开发语言)