Java基础

这篇博客详细介绍了Java的基础知识,包括JRE和JDK的区别、内存分配、变量与方法的面试题,重点讲解了构造方法、面向对象(封装、继承、多态)以及字符串和集合类的使用。此外,还涉及了运算符、修饰符、内部类、异常处理和多线程等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java基础

前篇

1. JRE、JDK

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. Java中内存分配

虚拟机自动调用main方法,进入栈中运行
在这里插入图片描述

变量与方法

1. 面试题

1.1 成员变量与局部变量的区别有哪些

a. 概念
在这里插入图片描述
b. 作用域
在这里插入图片描述
c. 存储位置
在这里插入图片描述
d. 生命周期
在这里插入图片描述
e. 初始值
在这里插入图片描述
f. 使用原则:
在这里插入图片描述

1.2 在Java中定义一个不做事且没有参数的构造方法的作用

java在执行子类的构造方法之前,若没有指定super(…),则会默认调用父类的无参构造方法,若此时父类中只有有参构造方法,则编译时会发生错误。
在这里插入图片描述

1.3 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

帮助子类做初始化工作

1.4 一个类的构造方法的作用是什么?若一个类没有声明构造方法,改程序能正确执行吗?为什么?

new一个对象的时候需要调用该类的构造方法,系统默认会创造一个不带参数的构造方法
官方:
主要作用是完成对类对象的初始化工作。可以执行。因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。

1.5 构造方法有哪些特性?

在这里插入图片描述

1.6 静态变量和实例变量区别

静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,它当且仅当在类初次加载时会被初始化,JVM只为静态变量分配一次内存空间。

实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在创建对象的时候被初始化,在内存中,创建几次对象,就有几份成员变量。

1.7 静态方法和实例方法有何不同?

在这里插入图片描述

1.8在一个静态方法内调用一个非静态成员为什么是非法的?

在这里插入图片描述

1.9 什么是方法的返回值?返回值的作用是什么?

在这里插入图片描述

1.10值传递和引用传递有什么区别

在这里插入图片描述

1.11 对象相等判断之==和equals的区别?

在这里插入图片描述

1.12 hashCode 与 equals

2. 构造方法

2.1. 概述

在这里插入图片描述
若想都用,则两个构造方法都手动创建。直接给对象赋值了,姓名和年龄
在这里插入图片描述

2.2. 注意事项:

在这里插入图片描述

2.3. 方法重载

2.3.1. 概述

在这里插入图片描述

2.3.2. 好处

在这里插入图片描述

2.3.3. 面试题之方法重写与重载

3.1 构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。

3.2 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
在这里插入图片描述

面向过程和面向对象(封装、继承、多态)

1. 概念

在这里插入图片描述

2.封装

2.1 解释

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2 面试

在这里插入图片描述

3. 继承

在这里插入图片描述
《就近原则》

重要:子类中所有的构造方法默认都会先调用父类的无参构造方法!!!

在这里插入图片描述

super关键字

3.1. 继承中访问构造方法和成员变量的特点

在这里插入图片描述

3.2. 继承中成员方法访问特点:

在这里插入图片描述

3.3. super内存图

在这里插入图片描述

3.4. 方法重写

在这里插入图片描述

3.5.java中继承的注意事项

在这里插入图片描述

3.6. 案例

在这里插入图片描述

package com.weichen.test;
public class Test_fu_zi {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Dog dog=new Dog("狗",22);
		dog.method();
		System.out.println(dog.getName()+dog.getAge());
		
		Cat cat=new Cat("猫",22);
		cat.method();
		System.out.println(cat.getName()+cat.getAge());
	}
}
class Animal{
	private String name;
	private int age;
	public Animal() {	
	}
	public Animal(String name,int age) {
		this.name=name;
		this.age=age;
	}
	public void setName(String name) {
		this.name=name;
	}
	public void setAge(int age) {
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
}
class Dog extends Animal{
	public Dog() {
		
	}
	public Dog(String name,int age) {
		super(name, age);
	}
	public void method() {
		System.out.println("我是狗,我可以看门");
	}
	
}
class Cat extends Animal{
	public Cat() {
		
	}
	public Cat(String name,int age) {
		super(name, age);
	}
	public void method() {
		System.out.println("我是猫,我可以抓老鼠");
	}
	
}

3.7. 面试之继承

在这里插入图片描述

3.8. 面试之super关键字的使用

在这里插入图片描述
在这里插入图片描述

4. 多态

4.1 概述

在这里插入图片描述
在这里插入图片描述

4.2 多态转型内存图解

在这里插入图片描述

数组:

1. 基本使用:

package com.weichen.test;

import java.util.Arrays;

public class Array_usually {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//声明一个数组并分配空间:必须指定数组大小
		int[] arr1=new int[2];
		int[] arr2= {1,2,3,4};
		int[] arr3=new int[] {1,2,3,4};
		
		
		//数组的遍历方式1:
		for(int score:arr1) {
			System.out.println(score);
		}
		
		//数组的遍历方式2
		for(int i=0;i<arr2.length;i++) {
			System.out.println(arr2[i]);
		}
		
		
		//Arrays数组工具类的使用
		//1. 比较两个数组是否相等
		System.out.println("比较两个数组是否相等:"+Arrays.equals(arr2, arr3));  
		
		
		//2. 对数组的元素进行升序排列
		Arrays.sort(arr3); 
		System.out.println("对数组的元素进行升序排列:");
		for(int score:arr3) {
			System.out.println(score);
		}
		
		//3.将一个数组转换成一个字符串
		System.out.println("将一个数组转换成一个字符串"+Arrays.toString(arr2));
		
		//4.把数组array所有元素都赋值为val
		System.out.println("把数组array所有元素都赋值为val");
		Arrays.fill(arr1, 7);
		for(int score:arr1) {
			System.out.println(score);
		}
		
		//5.把数组复制成一个长度为length的新数组,返回类型与复制的数组一致
		int[] new_Array =Arrays.copyOf(arr1, 5);
		System.out.println("把数组复制成一个长度为length的新数组,返回类型与复制的数组一致");
		for(int score:new_Array) {
			System.out.println(score);
		}
		
		
		//6.查询元素值val在数组array中的下标(要求数组中元素已经按照升序排列)
		System.out.println("查询元素值7在数组arr1中的下标(要求数组中元素已经按照升序排列)");
		System.out.println(Arrays.binarySearch(arr1, 7));
		
	}

}

2、二维数组

在这里插入图片描述
在这里插入图片描述

3. LeetCode

在这里插入图片描述

import java.util.Arrays;
public class leetcode_01 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] heights= {1,1,4,2,1,3};
		int count=heightChecker(heights);
		System.out.println(count);

	}

	    public static int heightChecker(int[] heights) {
	    	int[] new_heights=heights.clone();
	    	int count=0;
	    	Arrays.sort(new_heights);

	            for(int i=0;i<heights.length;i++){
	                if(new_heights[i]==heights[i]){
	                    count++;
	                }
	            }
	            return count;
	    }
}

在这里插入图片描述

package com.weichen.test;
public class Leetcode_arr02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr= {1,1,1,1,1};
		Solution solution=new Solution();
		int result=solution.numOfSubarrays(arr,1,0);
		System.out.println(result);
	}
}
class Solution {
    public int numOfSubarrays(int[] arr, int k, int threshold) {
    	int count=0;    //记录满足条件的数组个数	 
    	
    	//找出子数组
    	int[] sub_arr=new int[k]; 	
    	for(int i=0;i<arr.length-k+1;i++) {  		   		
    		int temp=i;
    		for(int j=0;j<k;j++) {
    			sub_arr[j]=arr[temp++];
    		}
    		if(avg(sub_arr)>=threshold) {
    		    count++;
        	}
    	}		
    	return count;
    }

    //求平均值
    public int avg(int[] arr) {
    	int sum=0;
    	for(int i=0;i<arr.length;i++) {
    		sum+=arr[i];
    	} 	
		return sum/arr.length; 	
    }
}

在这里插入图片描述

package com.weichen.test;

import java.util.HashSet;
import java.util.Set;

public class Leetcode_04 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution_1 solution=new Solution_1();
		int[] nums= {2,2,3,4,5};
		int result=solution.findRepeatNumber(nums);
		System.out.println(result);
	}

}
class Solution_1 {
    public int findRepeatNumber(int[] nums) {
    	Set<Integer> set=new HashSet<Integer>();
    	int repeat=-1;
    	for(int num:nums) {
    		if(!set.add(num)) {
    			repeat=num;
    			break;
    		}
    	}  	
    	return repeat;
    }
}

4、案例

数组反转

public class test_flower {
	public static void main(String[] args) {
		int[] arr=new int[] {19,28,37,46,50,60};
		for(int start=0,end=arr.length-1;start<end;start++,end--) {
			int temp=arr[start];
			arr[start]=arr[end];
			arr[end]=temp;
		}
		for(int arrs:arr) {
			System.out.println(arrs);
		}
	}
}

常用API之String类型

1. 概述

在这里插入图片描述

2. String常见构造方法(构造方法用来创建对象)

在这里插入图片描述

package com.weichen.test;
public class Test_String {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/*
		 * 字符串特点:
		 * 1. java程序中,所有的双引号字符串,都是String这个类的对象,利用对象可以直接调用String的对象
		 * 2. 字符串是常量,值在创建之后不能被更改若要更改,只是又指向了另外一个字符串对象而已
		 */
		//创建字符串对象的四种方式:
		String string="weichen";
		string.length();
		
		//public String()
		String s1=new String();
		System.out.println(s1);
		
		//public String(char[] chs)
		char[] cs= {'a','b','c'};
		String string2=new String(cs);
		System.out.println(string2);   //把一个个字符串成一个字符串    abc
		
		//public String(String original)
		String string3=new String("123");
		System.out.println(string3);
	}
}

3. 以上构造方法创建字符串对象的区别对比

在这里插入图片描述
在这里插入图片描述

4. 字符串的比较(==,equals)

在这里插入图片描述

5.遍历字符串

在这里插入图片描述

6.统计字符次数

package com.weichen.test;
import java.util.Scanner;
//判断一个字符串中有几个大写字母,几个小写字母,几个数字
//先将一个字符串转换成一个字符数组,然后对数组中的每一个字符进行判断
//判断字符是否为大写、小写、数字的方法
public class Test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入一个字符串");
		String string=scanner.nextLine();	
		int count_A=0,count_a=0,count_1=0;
		char[] a=string.toCharArray();
		
		for(int i=0;i<a.length;i++) {
			if(a[i]>='A'&&a[i]<='Z')   //判断一个字符是否是大写字母
			{
				count_A++;
			}
			if(a[i]>='a'&&a[i]<='z')   //判断一个字符是否是小写字母
			{
				count_a++;
			}
			if(a[i]>='0'&&a[i]<='9')   //判断一个字符是否是数字
			{
				count_1++;
			}
		}
		System.out.println("A"+count_A);
		System.out.println("a"+count_a);
		System.out.println("1"+count_1);
	}

}

7. 手机号屏蔽

在这里插入图片描述

8. 敏感词替换

在这里插入图片描述

9.切割字符串

在这里插入图片描述

10.拼接字符串(用StringBuilder.append()方法)

在这里插入图片描述

package com.weichen.test;
import java.util.Scanner;
//截取字符串方法
public class Test02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr= {1,2,3};
		String resultString=int_String(arr);
		System.out.println(resultString);
		
	}
	
	public static String int_String(int[] arr) {
		StringBuilder sBuilder=new StringBuilder("[");
		for(int i=0;i<arr.length;i++){
			if(i==arr.length-1) {
				sBuilder.append(arr[i]).append("]");
			}else {
				sBuilder.append(arr[i]).append(",");
			}
		}
		return sBuilder.toString();
	}
}
		
		

11. 小结

在这里插入图片描述
在这里插入图片描述

12.面试

12.1字符型常量和字符串常量的区别

在这里插入图片描述

12.2 什么是字符串常量池?

在这里插入图片描述

12.3 String 是最基本的数据类型吗

在这里插入图片描述

12.4 String有哪些特性

在这里插入图片描述

12.5String为什么是不可变的吗?

在这里插入图片描述
在这里插入图片描述
通过反射…不懂
在这里插入图片描述

12.6 是否可以继承 String 类

String 类是 final 类,不可以被继承。

12.7 String str="i"与 String str=new String(“i”)一样吗?

在这里插入图片描述

12.8 String s = new String(“xyz”);创建了几个字符串对象

在这里插入图片描述

12.9 如何将字符串反转?

在这里插入图片描述

12.10 数组有没有 length()方法?String 有没有 length()方法

数组没有 length()方法 ,有 length 的属性。String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。

12.11 String 类的常用方法都有那些?

在这里插入图片描述

12.12 在使用 HashMap 的时候,用 String 做 key 有什么好处?(需要回顾)

在这里插入图片描述

12.13. String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的

在这里插入图片描述

运算符:

1. 常用运算符

在这里插入图片描述

2. 面试

2.1数据交换

在这里插入图片描述

2.2 &和&&的区别

在这里插入图片描述

修饰符

1. 权限修饰符【访问】(public、protected、默认、private)

1.1 理解

在这里插入图片描述

1.2 面试题

在这里插入图片描述

2. final修饰符【更改】

2.1 final修饰成员变量、成员方法、类

在这里插入图片描述

2.2 final修饰基本类型和引用类型变量

在这里插入图片描述

2.3 final 有什么用?

在这里插入图片描述

2.4 final finally finalize区别(遗留)

在这里插入图片描述

3.static修饰符

3.1 用static修饰成员变量(2个知识点)

在这里插入图片描述

3.2 static访问特点

在这里插入图片描述

3.3 面试之static存在的主要意义

在这里插入图片描述

3.4 面试之staticstatic的独特之处

在这里插入图片描述

3.5 面试之static应用场景

在这里插入图片描述

关键字

1. private关键字

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. this关键字:

2.1 简介

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 内存原理

在这里插入图片描述

2.3 面试之this关键字的用法

在这里插入图片描述

2.4 this和super的区别

在这里插入图片描述

接口:

1. 接口描述:

在这里插入图片描述

2.接口特点

在这里插入图片描述

3. 接口的成员特点

在这里插入图片描述

4.示例

在这里插入图片描述

5. 类和接口的关系

在这里插入图片描述
在这里插入图片描述

6. 抽象类和接口的区别

在这里插入图片描述

7. 案例

在这里插入图片描述

8. 用接口作为形参或者返回值类型为接口

在这里插入图片描述

抽象类:

1. 概述

在这里插入图片描述

2. 特点:

在这里插入图片描述
在这里插入图片描述

3. 抽象类和接口的区别

在这里插入图片描述

内部类

1. 概述

在这里插入图片描述

2. 内部类定义格式

在这里插入图片描述

3. 内部类的访问特点:

在这里插入图片描述

4. 内部类分类

4.1 成员内部类

在这里插入图片描述

4.2 局部内部类

在这里插入图片描述

4.3 匿名内部类

在这里插入图片描述

4.4 匿名内部类在开发中的使用

package com.weichen.test;
public class Inner_class {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JumppingOperator jumppingOperator=new JumppingOperator();
		
		Jummpping jummpping=new Jummpping() {
			
			@Override
			public void jump() {
				// TODO Auto-generated method stub
				System.out.println("tiaogao");
			}
		};
		jumppingOperator.method(jummpping);	
		
		//或者
		jumppingOperator.method(new Jummpping() {
			
			@Override
			public void jump() {
				// TODO Auto-generated method stub
				System.out.println("tiaogao");
			}
		});
	}
}
interface Jummpping{
	void jump();
}
class JumppingOperator{
	public void method(Jummpping j) {
		j.jump();
	}
}

4.5 静态内部类

在这里插入图片描述

5. 内部类面试题

5.1 什么是内部类?

在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类。内部类本身就是类的一个属性,与其他属性定义方式一致。

5.2 内部类的分类

内部类可以分为四种:成员内部类、局部内部类、匿名内部类和静态内部类

  1. 静态内部类:定义在类内部的静态类
    创建方式:new 外部类.静态内部类()
  2. 成员内部类:定义在类内部,成员位置上非静态类
    创建方式:外部类实例.new 内部类()
  3. 局部内部类:定义在方法中的内部类
    创建方式:在对应方法内,new 内部类()
  4. 匿名内部类:匿名内部类就是没有名字的内部类

5.3 内部类的优点

在这里插入图片描述

5.4 内部类的应用场景

在这里插入图片描述

5.5 局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?

在这里插入图片描述

集合类

集合类之ArrayList

1. 概述

在这里插入图片描述
在这里插入图片描述

2. 方法

在这里插入图片描述

3. 示例

在这里插入图片描述

4. 常用方法

在这里插入图片描述

常用API

1. Random

1.1 作用和基本步骤

在这里插入图片描述

2. Math

2.1 Math概述

在这里插入图片描述

2.2 常用方法

在这里插入图片描述

2.3 易出错

在这里插入图片描述
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。
在这里插入图片描述
在这里插入图片描述

3.System类

3.1 概述&常用方法

在这里插入图片描述
在这里插入图片描述

4. Object类

4.1 概述和常用方法

在这里插入图片描述

4.2 面试题之== 和 equals 的区别是什么:

在这里插入图片描述
在这里插入图片描述

4.3 hashCode 与 equals (重要)(遗留)

  1. HashSet如何检查重复:
    HashSet底层数据结构是hash表和数组
    IDK通过hashcode()方法计算每个对象的hash值,返回的是一个int类型的整数,用该hash值确定对象在hash表中的索引位置。在Object()类的默认hashcode()方法中,每个对象的hash值都是不同的。

5. Arrays类

5.1 Arrays类的概述和常用方法

在这里插入图片描述
在这里插入图片描述

6. 基本类型包装类

6.1 基本类型包装类概述

在这里插入图片描述

6.2 Integer类的概述和使用

在这里插入图片描述

6.3 案例

在这里插入图片描述

6.4 自动装箱和拆箱

在这里插入图片描述

7. 日期类

7.1 常用方法和构造方法

在这里插入图片描述

7.2 案例

在这里插入图片描述

package com.weichen.test;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Datedemo {

	public static void main(String[] args) throws ParseException {
		// TODO Auto-generated method stub
		DateUtils dateUtils=new DateUtils();
		String string="2018-09-08 20:20:20";
		dateUtils.str_to_date(string,"yyyy-MM-dd HH:mm:ss");
		
		Date date=new Date();
		dateUtils.date_to_str(date,"yyyy年MM月dd日 HH:mm:ss");		
	}
}
class DateUtils{
	public void str_to_date(String str,String format) throws ParseException {
		//把字符串解析为指定格式的日期    注意此处传入的字符串格式要和构造方法中的参数一致
		Date date=new Date();
		SimpleDateFormat simpleDateFormat=new SimpleDateFormat(format);
		date=simpleDateFormat.parse(str);
		System.out.println(date);
	}
	public void date_to_str(Date date,String format) {
		//把指定格式的日期转换成指定格式的字符串    传入一个时间和想要的字符串的格式
		SimpleDateFormat simpleDateFormat=new SimpleDateFormat(format);
		String string=simpleDateFormat.format(date);
		System.out.println(string);
	}
	
}


异常

1. 异常概述

在这里插入图片描述

2. JVM的默认处理方案

在这里插入图片描述

3. 异常处理

在这里插入图片描述

4. 编译时异常和运行时异常的区别

在这里插入图片描述

5. 异常处理之throws

在这里插入图片描述

6. 自定义异常

在这里插入图片描述

7. throws和throw的区别

在这里插入图片描述

集合

1. Collection

在这里插入图片描述

1.1 集合类体系结构

在这里插入图片描述

1.2 Collection集合常用方法

在这里插入图片描述

1.3 Collection集合的遍历

在这里插入图片描述

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Num1 {
	public static void main(String[] args) {
		Collection<String> collection=new ArrayList<String>();   
		collection.add("hello");
		collection.add("world");
		
		Iterator<String> iterator=collection.iterator();
		while(iterator.hasNext()) {
			String string=iterator.next();
			System.out.println(string);
		}
	}
}

1.4集合的使用步骤

在这里插入图片描述
在这里插入图片描述

2. List

2.1 List集合的概述和特点

在这里插入图片描述

package com.weichen.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String> list=new ArrayList<String>();
		list.add("hello");
		list.add("world");
		list.add("java");
		list.add("hello");
		
		Iterator<String> iterator=list.iterator();
		while(iterator.hasNext()) {
			String string=iterator.next();
			System.out.println(string);
		}
	}
}

2.2 List集合特有方法(Collection没有,ArrayList有)

在这里插入图片描述
在这里插入图片描述

2.3 并发修改异常

在这里插入图片描述

2.4 ListIterator(可用迭代器添加元素,并且不会出现异常)

在这里插入图片描述

2.5 增强for循环

在这里插入图片描述

2.6 用三种方式遍历List集合

在这里插入图片描述

2.7 数据结构

在这里插入图片描述
在这里插入图片描述

2.8 List集合子类特点(ArrayList、LinkedList)

在这里插入图片描述

3. Set(不包含重复元素)

3.1 Set集合的概述和方法

在这里插入图片描述
在这里插入图片描述

3.2 hash值

在这里插入图片描述

3.3 HashSet(底层数据结构是哈希表,所以对象要重写hashcode()和equals()方法来保证元素的唯一性)

在这里插入图片描述

在这里插入图片描述

3.4 LinkedHashSet类

在这里插入图片描述
在这里插入图片描述

3.5 TreeSet集合具体类

在这里插入图片描述

3.6 自然排序Comparable的使用(创建TreeSet的带参构造方法)

在这里插入图片描述

3.7 比较器排序Comparator的使用(创建TreeSet的带参构造方法)

在这里插入图片描述

3.8 案例:

在这里插入图片描述

package com.weichen.test;
import java.util.Comparator;
import java.util.TreeSet;

//LinkedList 底层实现原理是链表   所以增删比较容易,查找不是很方便
public class Num1 {
	public static void main(String[] args) {
		TreeSet<Student11> treeSet=new TreeSet<Student11>(new Comparator<Student11>() {   //内部类的知识,创建接口的具体实现类,利用多态,重写方法
			@Override 
			public int compare(Student11 o1, Student11 o2) {
				// TODO Auto-generated method stub
				int num=(o2.getGrade_shuxue()+o2.getGrade_yuwen())-(o1.getGrade_shuxue()+o1.getGrade_yuwen());  //总分降序	
				int num2=num==0?o1.getGrade_shuxue()-o2.getGrade_shuxue():num;    //数学分降序
				int num3=num2==0?o1.getName().compareTo(o2.getName()):num2;       //姓名自然升序
				return num3;

			}
		});	
		treeSet.add(new Student11("zhangsan",11,22));
		treeSet.add(new Student11("lisi",22,33));
		treeSet.add(new Student11("wangwu",2,3));
		treeSet.add(new Student11("zhangsan",11,22));
		treeSet.add(new Student11("aerwer",2,3));
		treeSet.add(new Student11("ertert",3,2));
		for(Student11 student11:treeSet) {
			System.out.println(student11);
		}
		
		
}
}
class Student11{
	
	public Student11() {
		super();
	}
	public Student11(String name, int grade_yuwen, int grade_shuxue) {
		super();
		this.name = name;
		this.grade_yuwen = grade_yuwen;
		this.grade_shuxue = grade_shuxue;
	}
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getGrade_yuwen() {
		return grade_yuwen;
	}
	public void setGrade_yuwen(int grade_yuwen) {
		this.grade_yuwen = grade_yuwen;
	}
	public int getGrade_shuxue() {
		return grade_shuxue;
	}
	public void setGrade_shuxue(int grade_shuxue) {
		this.grade_shuxue = grade_shuxue;
	}
	private int grade_yuwen;
	private int grade_shuxue;
	@Override
	public String toString() {
		return "Student11 [name=" + name + ", grade_yuwen=" + grade_yuwen + ", grade_shuxue=" + grade_shuxue + "]";
	}		
}

3.9 案例之:不重复的随机数

在这里插入图片描述

import java.util.HashSet;
import java.util.Random;
public class Random_set {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
	HashSet<Integer>  hashSet=new HashSet<Integer>();
//	while(hashSet.size()<10) {
//		Integer i=(int) Math.ceil(Math.random()*20);
//		hashSet.add(i);
//	}
	Random random=new Random();
	while(hashSet.size()<10) {
		int number=random.nextInt(20)+1;
		hashSet.add(number);
	}
	System.out.println(hashSet);
	}
}

4. 泛型

4.1 泛型概述

在这里插入图片描述
在这里插入图片描述

5. Map

5.1 概述和使用

在这里插入图片描述

5.2 Map的基本功能

在这里插入图片描述
碎碎念。
当利用hashset保证插入元素值唯一时
hashset的底层数据结构是hash表和链表
若想保证元素插入唯一,就首先要比较两个元素是否相等。若插入的是一个自定义的类,此时若要比较两个对象是否相等,需要比较这两个对象里面的内容,需要重写equals()方法,因为不重写的话,引用类型默认比较的是地址值。利用hashcode()函数计算出每个对象的hash值,若两个对象的hash值不同,则说明两个对象一定不一样,但是原始的hashcode()函数出来的hash值,会使每个对象的hash值都不一样,所以在此要重写,若两个对象的hash值相同,再用equals()比较内容,若hash值不同,则说明存储单元不同,此时就不用再比较内容了。
hash值相同但内容不同
hash值不同但是内容相同

5.3 案例1

在这里插入图片描述

在这里插入图片描述

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;

public class Random_set {

	public static void main(String[] args) {
		HashMap<String, ArrayList> hashMap=new HashMap<String, ArrayList>();  //要求用hashmap集合存储元素  先定义一个hashmap对象
		ArrayList<String> list1=new ArrayList<String>();    //hashmap里面的每一个值都是一个ArrayList类型的,所以首先要创建多个ArrayList
		list1.add("qqq");
		list1.add("www");
		
		ArrayList<String> list2=new ArrayList<String>();
		list2.add("www");
		list2.add("rrr");
		
		ArrayList<String> list3=new ArrayList<String>();
		list3.add("rrr");
		
		hashMap.put("111", list1);
		hashMap.put("222", list2);
		hashMap.put("333", list3);
		
		Set<String> set=hashMap.keySet();
		for(String string:set) {   //先遍历键
			ArrayList<String> list=hashMap.get(string);      //再遍历值
			for(String valString:list) {
				System.out.println("键:"+string+"---值:"+valString);
			}
		}
	}		
}	

5.4 案例2

在这里插入图片描述

package com.weichen.test;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
//键盘输入一个字符串,返回各个以及个数
/*
 * 利用hashmap中键不同的特性存储每个字母
 * 默认值为null
 * map.add()  当键值相同时,重新赋值即可
 * 
 * */
public class Random_set {

	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入一个字符串");
		String string=scanner.nextLine();
		Count count = new Count();
		count.number(string);
	}		
}	
	

class Count{
	public void number(String str) {
	//TreeMap<Character,Integer> map=new TreeMap<Character, Integer>(); (对键值进行了排序)
		HashMap<Character,Integer> map=new HashMap<Character, Integer>();
		char[] ch=str.toCharArray();
		for(int i=0;i<ch.length;i++) {
			Integer value=map.get(ch[i]);
			if(value==null) {
				map.put(ch[i], 1);
			}else {
				map.put(ch[i], value+1);
			}
		}
		
		StringBuilder stringBuilder=new StringBuilder();
		Set<Character> key=map.keySet();
		for(Character character:key) {
			Integer integer=map.get(character);
			stringBuilder.append(character).append("(").append(integer).append(")");
			//System.out.print(character+"("+integer+")");
		}
		String string=stringBuilder.toString();
		System.out.println(string);
	}
}

6. Collections

6.1 概述和使用

在这里插入图片描述

6.2 案例

在这里插入图片描述

package com.weichen.practice;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CollectionsDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Student> arrayList=new ArrayList<Student>();		
		Student s1=new Student("weichen",11);
		Student s2=new Student("zeichen",11);
		Student s3=new Student("aeichen",33);
		
		arrayList.add(s1);
		arrayList.add(s2);
		arrayList.add(s3);
		
		Collections.sort(arrayList,new Comparator<Student>() {
				public int compare(Student o1,Student o2) {
					//年龄从小到大
					int num=o1.getAge()-o2.getAge();
					int num1=num==0?o1.getNameString().compareTo(o2.getNameString()):num;
					return num1;
				}	
		});	
		for(Student student:arrayList) {
			System.out.println(student.getNameString()+student.getAge());
		}	
	}
	
}

6.3 斗地主升级版

在这里插入图片描述

package com.weichen.practice;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeSet;
public class PlayGame_up {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建HashMap
		HashMap<Integer, String> hashMaps=new HashMap<Integer, String>();
		// 存储编号
		ArrayList<Integer> arrayList=new ArrayList<Integer>();
		
	
		//存储牌
		String[] flower= {"♦","♣","♥","♠"};
		String[] number= {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
	
		//将花色和数字进行拼接
		int index=0;
		for(String numbers:number) {
			for(String flowers:flower) {
				hashMaps.put(index,flowers+numbers);
				arrayList.add(index);
				index++;		
			}
		}
		hashMaps.put(index, "大王");
		arrayList.add(index);
		index++;
		hashMaps.put(index, "小王");
		arrayList.add(index);
		
		
		//洗牌
		Collections.shuffle(arrayList);
		
	
		//发牌   给每个人发牌   三个玩家的容器
		TreeSet<Integer> player1=new TreeSet<Integer>();
		TreeSet<Integer> player2=new TreeSet<Integer>();
		TreeSet<Integer> player3=new TreeSet<Integer>();
		TreeSet<Integer> dpplayer=new TreeSet<Integer>();
		
				
		//向每个人的容器里面加牌
		for(int i=0;i<arrayList.size();i++) {
			int x=arrayList.get(i);
			if(i>=arrayList.size()-3) {
				dpplayer.add(arrayList.get(i));
			}else if(i%3==0) {
				player1.add(arrayList.get(i));
			}else if(i%3==1) {
				player2.add(arrayList.get(i));
			}else if(i%3==2){
				player3.add(arrayList.get(i));
			}
					
		}
		lookpocker("qqq",player1, hashMaps);
		lookpocker("www",player2, hashMaps);
		lookpocker("eee",dpplayer, hashMaps);
		lookpocker("底牌",player1, hashMaps);
		
				
	}
	
	//遍历牌,发的是编号,根据Arraylist中取的编号对应到hashmap中找元素值
	public static void lookpocker(String nameString,TreeSet<Integer> ts,HashMap<Integer, String> hm) {
		System.out.println(nameString+"的牌是:");
		for(Integer in:ts) {
			String pokerString=hm.get(in);
			System.out.print(pokerString+" ");
			
		}
		System.out.println();
	}
}


6.4 斗地主

package com.weichen.practice;

import java.util.ArrayList;
import java.util.Collections;
public class Playgame {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//定义一个装牌的容器
		ArrayList<String> arrayList = new ArrayList<String>();
		
		//装牌  
		//定义花色数组
		String[] flower= {"♦","♣","♥","♠"};
		String[] number= {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
	
		//将花色和数字进行拼接
		for(String string:flower) {
			for(String num:number) {
				StringBuilder stringBuilder=new StringBuilder();
				arrayList.add(stringBuilder.append(string).append(num).toString());
			}
		}
		arrayList.add("小王");
		arrayList.add("大王");
		
		//洗牌
		Collections.shuffle(arrayList);
		
		//发牌   给每个人发牌   三个玩家的容器
		ArrayList<String> player1=new ArrayList<String>();
		ArrayList<String> player2=new ArrayList<String>();
		ArrayList<String> player3=new ArrayList<String>();
		ArrayList<String> dpArrayList=new ArrayList<String>();
		
		//向每个人的容器里面加牌
		for(int i=0;i<arrayList.size();i++) {
			String string=arrayList.get(i);
			if(i>=arrayList.size()-3) {
				dpArrayList.add(string);
			}else if(i%3==0) {
				player1.add(string);
			}else if(i%3==1) {
				player2.add(string);
			}else {
				player3.add(string);
			}
			
		}
		
		//看牌
		lookpocker("qqq", player1);
		lookpocker("www", player2);
		lookpocker("eee", player3);
		lookpocker("底牌", dpArrayList);
	}
	public static void lookpocker(String nameString,ArrayList<String> array) {
		System.out.println(nameString+"的牌是:");
		for(String string:array) {
			System.out.print(string + " ");
		}
		System.out.println();
	}
}

I/O流:

File

在这里插入图片描述
在这里插入图片描述

2. 字节流

2.1 字节流概述

在这里插入图片描述

2.2 字节流写数据的三种方式

在这里插入图片描述

2.3 字节流写数据如何实现换行和追加写入

在这里插入图片描述

2.4 字节流写数据加入异常处理

在这里插入图片描述

2.5 字节流读数据

在这里插入图片描述
一次读取一个字节数组:
在这里插入图片描述

2.6 将一个文件中的内容复制到另外一个中

在这里插入图片描述

2.7 案例之复制图片

在这里插入图片描述

2.8 缓冲输出流

在这里插入图片描述

2.9 案例之复制视频

在这里插入图片描述

package weichen.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Digui {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		//读
		FileInputStream fileInputStream=new FileInputStream("E:\\software\\src\\2.mp4");
		BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
		
		FileOutputStream fileOutputStream=new FileOutputStream("E:\\software\\src\\222.mp4");
		BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(fileOutputStream);
		byte[] bytes=new byte[1024];
		int bu;
		while((bu=bufferedInputStream.read(bytes))!=-1) {
			String string=new String(bytes,0,bu);
			bufferedOutputStream.write(string.getBytes());
		}
		
		fileInputStream.close();
		fileOutputStream.close();
	}
}

3. 字符流

在这里插入图片描述

递归

1. 阶乘

在这里插入图片描述

多线程

1. 进程(正在运行的程序)

在这里插入图片描述

2. 线程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3. 多线程实现方式

在这里插入图片描述
在这里插入图片描述

package weichen.io;

public class ThreadDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyRunnable myThread=new MyRunnable();
		
		//创建Thread类的对象,把MyRunnable对象作为构造方法的参数
		Thread t1=new Thread(myThread,"1");
		Thread t2=new Thread(myThread,"2");
		Thread t3=new Thread(myThread,"3");
		//Thread t4=new Thread(myThread,"4");
		
		t1.start();
		t2.start();
		t3.start();
	}

}
class MyRunnable implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<100;i++) {
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}
	
}

4. 设置和获取线程名称

package weichen.io;

public class ThreadDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyThread t1=new MyThread();
		MyThread t2=new MyThread();	
		t1.setName("线程1");  //Thread类中的方法
		t2.setName("线程2");
		t1.start();
		t2.start();
	}
}
class MyThread extends Thread{   //getName()是Thread中的方法,而MyThread继承了该类,所以可以直接使用该方法
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<100;i++) {
			System.out.println(getName()+":"+i);
		}
	}
}


线程1:0
线程2:0
线程1:1
线程1:2
线程2:1
线程1:3
线程1:4
线程2:2
线程1:5
线程2:3
线程2:4
线程1:6
线程2:5
线程1:7
线程2:6
线程1:8
线程2:7
线程1:9
线程2:8
线程1:10
线程2:9
线程1:11
线程2:10
线程1:12
线程2:11
线程1:13

在这里插入图片描述

5 线程调度

在这里插入图片描述

6. 线程控制

在这里插入图片描述

7. 线程生命周期

在这里插入图片描述

8. 线程同步–案例之卖票&同步方法

在这里插入图片描述
在这里插入图片描述

9.线程同步

9.1 线程安全的类

在这里插入图片描述

9.2 Lock锁

在这里插入图片描述

10. 生产者消费者

在这里插入图片描述

package weichen.io;

public class P_C {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Box box=new Box();
		Procedure procedure=new Procedure(box);
		Customer customer=new Customer(box);
		
		Thread t1=new Thread(procedure,"生产者");
		Thread t2=new Thread(customer,"用户");
		
		t1.start();
		t2.start();
	}

}
class Box{
	private int milk;
	private boolean state=false;
	//取出牛奶
	public synchronized void outMilk() {   //synchronized
		//如果没有牛奶,等待
		if(!state) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		//如果有牛奶
		System.out.printf("用户拿到第%d瓶奶",this.milk);
		System.out.println();
		state=false;
		
		notifyAll();     //使用wait()让线程等待,就要用另外一个线程将其唤醒
		
	}
	//放入牛奶
	public synchronized void inMilk(int milk) {
		//如果有奶,就等待
		if(state) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		//如果没有牛奶,就生产牛奶
		this.milk=milk;
		System.out.printf("送奶工人将第%d瓶奶放入奶箱",this.milk);
		System.out.println();
		state=true;
		
		notifyAll();
	}
}

class Procedure implements Runnable{
	private Box box;
	public Procedure(Box box) {
		// TODO Auto-generated constructor stub
		this.box=box;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=1;i<=5;i++) {
			box.inMilk(i);
		}
	}	
}

class Customer implements Runnable{
	private Box box;
	public Customer(Box box) {
		// TODO Auto-generated constructor stub
		this.box=box;
		
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			box.outMilk();
		}		
	}
	
}

11. 面试题之线程池:

在这里插入图片描述

网络编程

1.1 网络编程概述

在这里插入图片描述

1.2 网络编程三要素之IP地址

在这里插入图片描述

1.3 网络编程三要素之端口

在这里插入图片描述

1.4 网络编程三要素之协议

在这里插入图片描述

1.5 UDP通信原理

在这里插入图片描述

1.5.1UDP通信程序

package weichen.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class SendDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//首先要创建一个发送端的对象
		DatagramSocket send_people=new DatagramSocket();		
		
		//建立要传输的数据包
		BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
		String lineString;
		while((lineString=bReader.readLine())!=null) {
			if("886".equals(lineString)) {
				break;
			}
			byte[] bys=lineString.getBytes();
			

		//将要发送的数据放入数据包中
		DatagramPacket send_data=new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.35.50"), 10086);
		
		//发送数据包
		send_people.send(send_data);
		
		//关闭发送端
		send_people.close();		
	}
}

在这里插入图片描述

1.6 TCP

1.6.1 TCP通信原理

在这里插入图片描述

1.6.2 TCP发送数据和接收数据

在这里插入图片描述

1.6.3 TCP通信程序练习

在这里插入图片描述

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;


public class Client_TCP {

	public static void main(String[] args) throws IOException {	
				//创建客户端Socket对象
				Socket client_Socket=new Socket(InetAddress.getByName("192.168.35.50"), 10005);
				
				//获取发送数据流,发送数据
				BufferedReader bReader=new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bWriter=new BufferedWriter(new OutputStreamWriter(client_Socket.getOutputStream()));
				String linString;
				while((linString=bReader.readLine())!=null) {
					if("886".equals(linString)) {
						break;
					}
					bWriter.write(linString);
					bWriter.newLine();
					bWriter.flush();			
				}
	
				//释放资源
				client_Socket.close();
	}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server_TCP {

	public static void main(String[] args) throws IOException, IOException {	
		ServerSocket s_Socket=new ServerSocket(10005);
		
		while(true) {
			Socket socket=s_Socket.accept();
			InputStream i_Stream=socket.getInputStream();
			BufferedReader bReader=new BufferedReader(new InputStreamReader(i_Stream));
			
			String lineString;
			while((lineString=bReader.readLine())!=null) {
				System.out.println(lineString);
			}	
		}
	}
}

Lambda表达式

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值