垃圾分代回收机制

-当程序启动时,系统会对堆内存进行监测,若堆内存使用比例超过70%就会启动GC(Garbage Collector)通知系统进行回收。

  • 堆内存分为新生代和老生代,新生代又分为伊甸园区和幸存区,创建的新对象首先放入伊甸园区,然后扫描一次,若无用则回收,若依然在用则放入幸存区,然后进行多次扫描,无用则回收,有用就移动到老生代(扫描…无用则回收)

Object

  • Object类是Java中所有类的顶级父类。
  • 对象.getClass()——返回值是该对象的实际创建类型
  • 对象.toString()——将对象转为字符串,并返回其地址值
  • 对象1.equals(对象2)——比较两对象的地址值是否相等,可以重写

String

  • String是一个最终类,没有子类
  • 在这里插入图片描述
    在这里插入图片描述

- String中的重要方法

  • s.charAt(index)——根据字符串的下标返回指定字符
  • s.length()——返回字符串长度值
  • s.toCharArray()——将字符串转为字符数组
  • new String(char[ ] c)——将字符数组转为字符串对象
  • s1.compareTo(s2)——返回两个字符串对象字典排序的差值
  • s.concat(s2)——将s2拼接到s的末尾
  • s1.contains(s2)——判断s2是否是s1的子串
  • s1.startsWith(s2)/s1.endsWith(s2)——判断s1是否以s2开头或结尾
  • s1.equals(s2)——重写了Object中的方法(Object中之比较地址),比较地址值是否相等,如果不相等再比较内容是否一致
  • s.getBytes(“utf-8”)——根据指定编码规则,返回一个字节数组
  • s.indexOf(“asd”)——返回新串在s中第一次出现的下标值
  • s.intern()——把字符串对象的引用转到常量池
  • s.isEmpty()——判断是否是空串
  • s.replace(“aa”,“bbb”)——将原字符串中的“aa”替换为“bbb”
  • s.subString(7)/s.subString(2,7)——截取子字符串
  • s.trim()——删除字符串首尾的空格
  • String.valueOf(数据)——可以把所有的数据类型转换成新字符串返回
char c[]={'a','b','c'};
   	System.out.println(c);//abc
   	System.out.println(c.toString());//[C@15db9742

正则表达式(Pattern类)

  • List item
  • s.matches("(.)\1a{5,12}.*b?")——返回值为true或者false
  • *为0次或多次,+为至少一次,?为至多一次
  • s.replaceAll(“正则表达式”,“abc”)——将匹配到的字符(串)替换为“abc”
  • s.split(“aa”)——以aa为分割点将原串切割为字符串数组
  • String str=“TomAndJerry”;
    //捕获组和使用捕获组不在一个表达式中只能用$n去使用其他的捕获组
    System.out.println(str.replaceAll("(Tom)(.*)(Jerry)", “$3$2$1”));//输出JerryAndTom

包装类

  • 自动封箱、自动拆箱
  • 整数类型共享范围(-128,127)

Math类(java.lang.Math)

  • `精确运算
BigDecimal bd1=new BigDecimal("2.1");
BigDecimal bd2=new BigDecimal("1.98");
System.out.println(bd1.subtract(bd2));
  • String转double
DecimalFormat df=new DecimalFormat("#.#####");
		String s1=df.format(d);
		System.out.println(Double.parseDouble(s1));
		System.out.println(Double.valueOf(s1).doubleValue());

Date类

  • Date date=new Date();
    System.out.println(date);//输出当前系统日期—Sat Jul 27 17:41:11 CST 2019

  • //1、字符串转日期
    String str=“2012-12-12 17:10:11”;
    //指定日期转换的格式
    SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
    //把字符串转成日期
    Date date=sdf.parse(str);
    System.out.println(date);//输出结果:Wed Dec 12 17:10:11 CST 2012

  • //2、日期转字符串
    SimpleDateFormat sdf1=new SimpleDateFormat(“yyyy年MM月dd日 HH时mm分ss秒”);
    //把日期转成字符串
    Date date=new Date();//自定义时间:Date date=new Date(2019-1900,7-1,19);
    String s=sdf1.format(date);
    System.out.println(s);//输出结果:2019年07月27日 17时47分36秒

  • //jdk1.8time包下更新 只展示日期
    LocalDate f=LocalDate.now();
    System.out.println(f.plus(0,ChronoUnit.CENTURIES));//2019-07-27

  • //得到日历类里的信息2019-07-27,星期六
    Calendar c=Calendar.getInstance();//获取当前时间
    System.out.println(c.get(Calendar.DAY_OF_MONTH));//27
    System.out.println(c.get(Calendar.DAY_OF_WEEK));//7

异常

  • 自定义异常:
  • 1、自定义一个异常类(继承 Exception)
  • 2、在方法中有可能出异常的地方抛出异常
  • 3、在调用方法出使用try/catch捕获异常
public class ExceptionDemo {
	public static void main(String[] args) {
	//调用时捕获异常
		try {
			String s = "";
			test(s);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
    //方法中抛出异常
	public static void test(String m) throws InputErrorException {
		if (m == "") {
			throw new InputErrorException("输入数据有误!!!");
		}
	}
}
    //创建异常类
class InputErrorException extends Exception {
	public InputErrorException(String message) {
		super(message);
	}
}

finally

public class ExceptionDemo7 {
	public static void main(String[] args) {
		System.out.println(m());   //4
	}
	public static int m(){
		int i=1;
		try {
			return i=4;//若为对象,则此处挂起的是对象的地址值
		}
		 finally {
			i++;
			System.out.println(i);     //5
          //return i;//若此处没有return,则return i=4;
		}
	}
}

集合(Collection)

  • //创建集合对象
    Collection c=new ArrayList<>();
    //存储/添加元素
    c.add(“abc”);
//创建列表集合对象
		ArrayList list=new ArrayList();
		for(int i=0;i<6;i++)
		list.add("abc");
		System.out.println(list);//[abc, abc, abc, abc, abc, abc]
//		//插入元素---添加元素
		list.add(5, "123");
		System.out.println(list);//[abc, abc, abc, abc, abc, 123, abc]
  • ArrayList底层是由数组来实现的,默认数组的初始长度是10,根据底层右移运算进行扩容,
  • 每次在原来的基础上扩容一半 10-- 15-- 22 --33
  • LinkedList底层是由节点(静态内部类)来进行存储元素的。底层内存不连续,不需要扩容,增删元素效率较高、查询元素效率较低
  • Vector
  • 底层基于数组,扩容是基于三目运算符默认增加一倍,但是可以指定增量,如果增量不为0就可以按照增量进行数组的扩容
//调用方法返回古老的迭代器
Enumeration<String> e=v.elements();//只有Vector有这个方法
//迭代遍历
//使用while循环
//获取元素
String s=e.nextElement();
System.out.println(s);
//删除元素---直接删除集合元素
v.remove(s);
while(e.hasMoreElements()){//判断是否还有元素
}
  • Iterator(迭代器)
      //获取新的迭代器
		Iterator<String> it=list.iterator();
		//迭代遍历
		while(it.hasNext()){//判断后面是否还有元素
			//获取元素
			String s=it.next();
			System.out.println(s);
			//直接删除集合元素?不能
			//list.remove(s);
			//是改变底层比较的状态值---由true变为false
			it.remove();//这样才可以删除
		}
		System.out.println(list);//[]
  • Stack(栈)

  • //创建Stack对象
    Stack s=new Stack<>();
    s.push(“1”);//入栈
    s.pop();//出栈(获取栈顶元素并删除
    s.peek();//获取栈顶元素不删除

Set:不能存储重复元素

  • HashSet
  • 底层基于HashMap来实现的,是由数组+链表进行存储元素,不能存储重复元素,不能保证存入数据的顺序,底层数组长度(容量)一定是2En在这里插入图片描述
  • TreeSet会自动对存储的元素进行排序—升序—自然排序对象存储在TreeSet中想要进行排序,保证对象对应的类实现Comparable接口,重写compareTo方法去指定具体的排序规则
  • Queue(队列)
  • //创建集合对象
    Queue q=new LinkedList<>();

映射(Map<k,v>)

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo1 {
	public static void main(String[] args) {
		//创建映射对象
		Map<String, Integer> map=new HashMap<>();
		//添加元素
		map.put("a", 1);
		map.put("b", 2);
		map.put("c", 3);
		map.put("d", 4);
		//重复键--覆盖
		map.put("a", 6);//{a=6, b=2, c=3, d=4}
		//判断映射是否包含键
		//System.out.println(map.containsKey("c"));
		//判断是否包含值
		//System.out.println(map.containsValue(7));
		//把映射中的键值对(Entry对象)存放Set集合中进行返回
		//Set<Map.Entry<String, Integer>> s=map.entrySet();
		//根据键获取值---键不存在返回null
		//System.out.println(map.get("u"));
		//返回的把所有的键存放到Set集合中
		//Set<String> set=map.keySet();
		//根据键删除键值对
		//map.remove("a");
		//删除键值对
		//同时满足才能删除
		//map.remove("u", 3);
		//把映射的所有值存储到一个集合中进行返回
		//Collection<Integer> c=map.values();
		System.out.println(map);//{a=1, b=2, c=3, d=4}	
	}
}
  • 遍历映射

两种方法:

//1.获取映射中所有的键
		Set<String> set=map.keySet();
		//遍历键
		//增强for循环
		for (String string : set) {
			//由键获取指定值
			System.out.println(string+"="+map.get(string));
		}
//2.获取所有的键值对
		for(Map.Entry<String, Integer> entry:map.entrySet()){
			//每个entry就是具体的entry对象就是具体的键值对
			System.out.println(entry.getKey()+"="+entry.getValue());
		}
  • 映射的实现类:(映射不是集合)
  • 1、HashMap可以允许存储null值和null键,默认初始容为16,默认扩容是增加一倍,如果指定初始容量,指定的值在2En~2E(n+1),那么底层真实的容量就是2E(n+1) 异步式线程不安全的集合
  • 2、HashTable不允许存储null值和null键,默认初始容量是11,默认扩容是增加一倍再加一 11—22+1–46+1,如果指定初始容量底层真实的初始容量就是多少 同步式线程安全的集合

File

import java.io.File;
import java.io.IOException;

public class FileDemo1 {
	
	public static void main(String[] args) throws IOException {
		//创建File类对象
		//在创建对象过程中不会去检测真实的路径
		//只是在根据给定的路径创建对象
		File file=new File("D:\\a.txt");//此时未在该目录下创建真实的文件
		//重命名---剪切(路径不一样)
		file.renameTo(new File("D:\\javase\\2.txt"));//文件存储的路径
		//创建文件---空文件
		//boolean b=file.createNewFile();
		//创建文件夹---目录
		//不仅可以创建文件夹或者目录还可以创建多级目录
		//boolean b=file.mkdirs();
		//可以删除文件(有无内容),删除空目录
		//直接删除---不会放在回收中
		boolean b=file.delete();
		System.out.println(b);//删除成功返回true
		//返回目录或者文件的名称
		System.out.println(file.getName());
		//返回所在目录路径
		System.out.println(file.getParent());
		//返回所在位置的路径以及名称
		System.out.println(file.getPath());
	}
}
  • 获取当前目录下的所有文件以及文件夹
public class FileDemo2 {
	
	public static void main(String[] args) {
		//创建文件类对象
		File file=new File("D:\\");
		//获取当前目录下的所有文件以及文件夹的信息
		File[] fs=file.listFiles();
		//遍历数组
		for (File f : fs) {
			System.out.println(f);
		}	
		//判断是否是文件
		System.out.println(file.isFile());
		//判断是否是文件夹---目录
		System.out.println(file.isDirectory());
	}
}
  • 删除文件
public class FileText1 {
	public static void main(String[] args) {
		//获取文件类对象
		File file=new File("D:\\a");
		//调用方法
		deleFile(file);
	}
	
	//删除文件
	public static void deleFile(File file){
		//判断是否是文件夹
		if(file.isDirectory()){
			//获取当前文件夹下所有的信息
			File[] fs=file.listFiles();
			//遍历数组
			for (File f : fs) {
				//把数组里的每一个文件类对象再次传入到本方法中
				deleFile(f);
			}
		}
		//删除文件---删除空目录
		file.delete();
	}
}

IO流

  • 四大基本流
    在这里插入图片描述
  • FileWriter fw=new FileWriter(“D:\1.txt”);
    fw.write(“hahahaahhaha”);//开发时需要处理异常
    fw.flush();//冲刷缓冲区
    fw.close();
    //强制对象值为null
    //把对象置为无用对象,在某个时间进行垃圾回收
    fw=null;
  • FileReader reader=new FileReader(“D:\2.txt”);
    //读取数据
    //返回的是读取到字符的编码值
    //读取结束的标志就是返回-1
    System.out.println((char)reader.read());
    int len=-1;//提供变量供给读取数据覆盖
    while((len=reader.read())!=-1){//避免读取两次情况
    System.out.println(len);
    }
    //关流—输入流没有缓冲区
    reader.close();
  • 自建缓冲区
char[] cs=new char[3];
		int len=-1;
		//reader.read(字符数组)--返回值就是每次读取到的字符个数
		while((len=reader.read(cs))!=-1){//读取到的内容存放到数组
			System.out.println(new String(cs,0,len));
		}		
  • 利用文件流进行文件复制
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		long start=System.currentTimeMillis();
		FileReader reader=new FileReader("D:\\b.txt");//文件不存在会报错
		FileWriter writer=new FileWriter("D:\\a.txt");//文件不存在会新建
		char[] c=new char[1024*64];//自建缓冲区
		int count=-1;
		while((count=reader.read(c))!=-1){
			writer.write(c);
			writer.flush();
		}
		reader.close();
		writer.close();
		reader=null;
		writer=null;
		long end=System.currentTimeMillis();
		System.out.println(end-start);
	}
}
  • 字节流
//创建字节输出流对象---没有缓冲区  true表明文件可追加,即不删除原有信息
		FileOutputStream os=new FileOutputStream("D:\\c.txt",true);
		//写出数据
		os.write("中".getBytes());//获取字节数组
FileInputStream fis=new FileInputStream("D:\\1.txt");
		//读取数据  结束标志是-1
		//System.out.println(is.read());
		//自建缓冲区
		byte[] bs=new byte[10];
		int len=-1;
		while((len=fis.read(bs))!=-1){
			System.out.println(new String(bs,0,len));
		}
  • BufferedReader
BufferedReader br=new BufferedReader(new FileReader("D:\\a123.txt"));
		//读取一行---结束标志null
		String str="";
		while((str=br.readLine())!=null){
			System.out.println(str);
		}
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\b.txt"));
		//写出数据
		bw.write("abc");
		bw.newLine();//换行---不管具体什么的操作系统
		bw.write("123");

合并流

public class SequenceInputStreamDemo {
	
	public static void main(String[] args) throws IOException {
		//提供输入流---提供待合并的数据
		FileInputStream in1=new FileInputStream("D:\\a1.txt");
		FileInputStream in2=new FileInputStream("D:\\a2.txt");
		FileInputStream in3=new FileInputStream("D:\\a3.txt");
		
		//创建Vector集合对象
		Vector<FileInputStream> v=new Vector<>();
		//把输入流对象添加到集合中
		v.add(in1);
		v.add(in2);
		v.add(in3);
		
		//获取到Enumeration---把集合中的所有输入流对象存放到e对象中
		Enumeration<FileInputStream> e=v.elements();
		
		//创建合并流对象---把含有输入流对象的e放到合并流对象中
		SequenceInputStream sis=new SequenceInputStream(e);
		
		//文件字节输出流
		FileOutputStream os=new FileOutputStream("D:\\a2.txt");
		//通过合并流对象进行统一读取数据---合并
		byte[] bs=new byte[1024*1024*10];
		int len=-1;
		while((len=sis.read(bs))!=-1){
			//写出合并之后的数据
			os.write(bs, 0, len);
		}
		//关流
		sis.close();
		os.close();	
	}
}
  • 序列化
public class ObjectOutputStreamDemo {
	public static void main(String[] args) throws IOException {
		//创建对象
		Person p=new Person();
		//给对象属性赋值
		p.setName("lili");
		p.setAge(10);
		//开始进行序列化---创建序列化类的对象
		ObjectOutputStream oos=new ObjectOutputStream
				(new FileOutputStream("p.data"));
		//写出对象
		oos.writeObject(p);//把对象进行序列化
		//关流
		oos.close();
	}
}
  • 反序列化
public class ObjectInputStreamDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		//创建反序列化对象
		ObjectInputStream ois=new ObjectInputStream
				(new FileInputStream("p.data"));
		//读取对象---保证获取的是传入的对象
		Person p=(Person)ois.readObject();
		//关流
		ois.close();
		//获取对象属性
		System.out.println(p.getName()+","+p.getAge());
	}
}

-可变参数

可变参数—表示可以接收多个这样类型的参数
可变参数底层就是一个数组,参数的值依次存放到数组元素中
可变参数一定在最右边而且只有一个

	public static int m(int m,int... n){//n[]

-创建配置文件

public class PropertiesDemo1 {
	
	public static void main(String[] args) throws IOException {
		//创建对象
		Properties p=new Properties();
		//添加元素---键和值---字符串
		p.setProperty("name", "lili");
		p.setProperty("gender", "女");
		p.setProperty("age", "10");
		//把要存储的内容传输到配置文件中---配置文件后缀必须是.properties
		//第二个参数---文件的内容解释
	p.store(newFileOutputStream("p.properties"),"");		
	}
}




public class PropertiesDemo2 {
	
	public static void main(String[] args) throws IOException, IOException {
		//创建对象
		Properties p=new Properties();
		//加载指定配置文件
		p.load(new FileInputStream("p.properties"));
		
		//获取配置文件的内容
		//根据键获取值
		System.out.println(p.getProperty("name"));
		//根据键获取值
		System.out.println(p.getProperty("name", "tom"));
		
		//列出配置文件信息
		p.list(System.out);
	}

}
Logo

快速构建 Web 应用程序

更多推荐