Java算法题常用API整理总结

1. 栈和队列LinkedList

使用push插入元素时【栈】,头部元素peek为栈顶元素
使用addLast插入元素时,头部元素peek为队首元素

通常创建一个对象专精一个数据结构,不要串用

1.1 栈常用方法

// 栈顶插入元素
push(ele)   
// 返回栈顶元素并弹出    
pop()   
//返回栈顶元素但不弹出
peek()    

1.2 队列常用方法

// 头插
addFirst(ele)		
// 尾插
addLast(ele)
// 获取队列头元素    
getFirst()		
// 获取队列尾元素    
getLast			
// 获取头元素并弹出
poll()			
// 获取尾元素并弹出     
pollLast()		 
// 删除指定索引元素    
remove(index)		
// 返回首次出现某元素的索引
indexOf(ele)				

1.3 通用方法

// 清空
clear()				
// 返回大小    
size()			
// 判断是否为空
isEmpty()					
// 得到指定索引元素【栈是从栈顶数下来】
get(index)			
// 改变某索引处的元素
set(index,ele)		

2. 链表ArrayList

// 默认将元素添加到链表尾,可以通过index添加到指定位置
add(ele)		
// 移除指定位置元素
remove(index)		
// 修改指定位置元素
set(index,element)		
// 得到指定位置元素
get(index)			
// 返回第一次/最后一次出现某元素的索引
indexOf/lastIndexOf(ele)	
//返回大小/是否为空    
size()/isEmpty()			
// 链表变数组    
toArray()			
// 字符串形式输出【若要输出自定义形式,可以遍历后用StringBuilder拼接】
toString()				

3. 集合Set

TreeSet相较于HashSet多了排序功能【排序通过重写Comparator的方法实现】,因此用TreeSet就行

// 集合如果不存在元素ele,则添加此元素
add(ele)			
// 清空
clear()				
// 查询指定元素是否存在,存在返回true
contains(ele)		
// 判空
isEmpty()				
// 如果指定元素在此set中则移除
remove(ele)			
// 返回元素数量
size()			
// 返回一个大于等于当前元素的最小元素【屋顶上一个】,不存在返回null
ceiling(ele)		
// 返回一个小于等于当前元素的最大元素【地板下一个】,不存在返回null
floor(ele)			
// 返回此set中严格大于给定元素的最小元素,不存在返回null
higher(ele)			
// 返回此set中严格小于给定元素的最大元素,不存在返回null
lower(ele)			
// 返回第一个元素
first()			
// 返回最后一个元素
last()					

4. 映射Map

理由同Set,只讲TreeMap,可根据关键字排序

LinkedHashMap会保证遍历时按照插入顺序【默认】或者访问顺序取出

首元素可用map.entrySet().iterator().next().getKey()得到

image-20230407183829471
// 在此映射中关联指定值与指定键
put(key,value)			
// 从此映射中移除指定键的映射关系(如果存在)
remove(key)			
// 清空
clear() 				
// 如果包含指定键,返回true
containsKey(key)		
// 如果包含指定值,返回true
containsValue(value)
// 返回指定键的值,如果不存在返回null
get(key)				
// 返回此映射中当前第一个(最低)键
firstKey()				
// 返回映射中当前最后一个(最高)键
lastKey()				
// 返回大于等于给定键的最小键;如果不存在这样的键,则返回 null
ceilingKey(key)		
// 返回小于等于给定键的最大键;如果不存在这样的键,则返回 null
floorKey(key)	
// 是否空/map大小    
isEmpty()/size()

遍历方式

	   TreeMap<Integer, Integer> map = new TreeMap<Integer,Integer>();
        map.put(1, 2);
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
			System.out.println("关键字:"+entry.getKey());
			System.out.println("值:"+entry.getValue());
		}

5. 大/小根堆PriorityQueue

因为其本质是根堆而不是队列,因此遍历输出得到的元素无序,依次弹出根顶元素才有序

// 清空
clear()				
// 如果包含指定元素返回true
contains(ele) 		
// 将指定元素插入此优先队列
offer(ele) 			
// 获取根堆顶元素
peek() 				
// 获取并移除根堆顶元素
poll() 				
// 移除指定元素
remove(ele) 
// 返回元素个数
size() 					

大小根堆选择

// 默认为小根堆,大根堆需要重新方法
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
                 // 后面比前面大就交换,即大的在前面,就是大根堆
				return o2-o1; 
			}
		});

6. 字符串

String用来处理最终结果,StringBuilder用来拼接

6.1 String

// 返回此字符串的长度
length()			
// 判空,当长度为0时返回true
isEmpty()
// 除去任何前导和尾随空格,如果该字符串没有前导或尾随的空格,则返回值为该字符串本身
trim()		
// 返回索引i处的字符,也可以通过toCharArray()转变成数组再遍历
charAt(int i)	
// 按字典顺序比较两个字符串
compareTo(String anotherString)			
// 按字典顺序且不区分大小写比较两个字符串
compareToIgnoreCase(String anotherString)
// 判断两个字符串是否相等,相等返回true否则返回false
equals(String anotherString)
// 同上,不区分大小写
equalsIgnoreCase(String str)		
// 检查是否以某一前缀开始
startsWith(String prefix)		
// 根据指定字符串拆分
split(String regex) 			
// 返回从begin开始到end-1结束的子串
substring(int beginIndex, int end)	
// 将此字符串中的所有字母都换为大写
toUpperCase() 	
// 将此字符串中的所有字母都换为小写
toLowerCase()	

// lastIndexOf有类似用法👇
// 返回指定字符在此字符串中第一次出现的索引
indexOf(char ch)			
// 同上,从指定索引开始搜索
indexOf(char ch, int fromindex) 	
// 返回子串在此字符串中第一次出现的索引
indexOf(String str)			
// 同上,从指定索引开始搜索
indexOf(String str, int fromindex)	
// 用s2替换目标字符串中出现的所有s1
replaceAll(String s1,String s2)	
// 用s2替换目标字符串中出现的第一个s1
replaceFirst(String s1,String s2)	
// 类方法【即String.xxx】
// 返回 char数组的字符串表示形式
valueOf(char[] data)				
// 返回 char 数组参数的特定子数组的字符串表示形式
valueOf(char[] data,int offset,int count)
// 返回参数【int,boolean...】的字符串表示形式
valueOf(ele)								

6.2 StringBuilder

相较于String来说,处理速度更快,所以处理字符串的时候一般使用StringBuilder,最后再通过toString()方法转为字符串

// 构建一个值为str的可变字符串【也可传空参数】
StringBuilder(String str)
// 返回索引i位置的字符
charAt(int i)
// 返回此字符串的长度
length()
// 在此字符串追加str【参数为StringBuilder也可以】
append(String str)
// 在index处插入字符数组c【c也可以是单个字符或者其他类型】
insert(int index, char[] c)	
// 将char的子数组【下标offset开始,长度len】追加到此字符串
append(char[] str, int offset, int len)	
// 移除此序列从start到end-1的字符串
delete(int start, int end)	
// 移除指定索引上的字符
deleteCharAt(int index)	
// 将指定索引处的字符替换为ch
setCharAt(int index, char ch)	
// 将此字符串反转
reverse()			
// 返回此字符串从start开始至length-1结束的String
substring(int start)		
// 返回此字符串从start开始至end-1结束的String
substring(int start, int end)	
// 返回此序列中的String表示形式
toString()		

// lastIndexOf有类似用法👇
// 返回子字符串第一次出现的索引
indexOf(String str)		
// 同上,从指定位置查找
indexOf(String str, int fromIndex)

7. 工具类

Arrays

// 将arr数组元素变为字符串,一般用于输出看看数组情况,省去遍历的繁琐操作
toString(arr)  		
// arr数组排序,可以传入匿名类Comparator自定义排序方式
sort(arr,new Comparator<T>(){}) 	
// arr数组二分查找(需要排好序)元素ele,返回目标值索引,找不到返回-1			
binarySearch(arr,ele) 	
// 复制arr数组[from,to)位置元素,返回复制好的数组副本
copyOfRange(arr,from,to)
// 使用ele元素将数组填充
fill(arr,ele) 		
// 比较两个数组元素的内容是否完全一致
equals(arr1,arr2) 				

Collections

// 仅List可用
// 反转List中的元素
reverse(list) 	
// 按照小到大对链表进行排序【默认】,也可以实现Compartor接口自定义排序
sort(list,new Cpmparator<T>(){}) 
// 将list中的i处元素和j处元素进行交换
swap(list,i,j) 
// list2拷贝到list1,要确保list1有足够空间
copy(list1,list2) 	
// 将list中的A替换成B
replaceAll(list,A,B)	
    
// List和Set都可用
// 返回最大、最小元素
max(list)/min(list) 
// ele出现次数
frequency(list,ele) 

Integer

// Boolean,Double等都有类似将字符串转换的方法👇
// 将字符串参数解析为带符号的十进制整数
parseInt(String s) 	
// 将字符串参数解析为第二个参数指定的基数中的有符号正整数
// radix参数不填则默认以十进制数进行解析
parseInt(String s, int radix)  
// 将i转为k进制真值【有正负号】
toString(int i,k) 

8. 日期Calendar

通过设置对象内部字段再通过get方法获得数值

  • YEAR :指示年份

  • MONTH:指示月份

    MONTH字段是从0月开始计数的,所以12月对应的值是11

  • DAY_OF_MONTH:指示一个月中的某天。

  • DAY_OF_WEEK:指示一个星期中的某天。

  • DAY_OF_YEAR:指示当前年中的天数。

  • DAY_OF_WEEK_IN_MONTH:指示当前月中的第几个星期。

  • HOUR:指示当天中的某小时

  • MINUTE:指示当前小时中的某分钟

  • SECOND:指示当前分钟中的某秒

// 得到Calendar对象
Calendar calendar = Calendar.getInstance();	
// 第一个参数是日期字段,诸如YEAR、MONTH等将给定的日历字段设置为给定值
set(int field, int value)
// 设置日历字段年月日的值
set(int year, int month, int day)
// 获取给定字段的值
get(int field);		
// 以毫秒为单位返回日历时间值
getTimeInMillis() 		
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
add(int field, int amount)

9. 数学工具Math

// a,b的最值
min(a,b)/max(a,b)
// 返回正确舍入的 double 值的正平方根
sqrt(double a)		
// 绝对值
abs(a)		
// a的b次方,返回一个double类型的数。
pow(double a, double b) 
// 向上取整
ceil(double x)		
// 向下取整
floor(double x)	
// 四舍五入取整
round(double x)	
// 生成一个[0,1)之间的double类型的伪随机数
random()				
// tan,cos与sin类似
// acos(-1)=π
// 正弦值
sin(double a) 
// 反正弦值
asin(double a) 			

10. 大数类

// 传入字符串参数直接创建,可以使用=进行同类型赋值
BigInteger a = new BigInteger("123456789101112131415");
BigDecimal c = new BigDecimal("123456.123456");
// 以二进制解析"111110",变为10进制赋值给d
BigInteger d = new BigInteger("111110", 2);	
// 把a转化为16进制的字符串输出
System.out.println(a.toString(16));			
// a对象值+b对象值并将结果返回
a.add(b)
// 减法,同上👆
a.subtract(b) 
// 乘法,同上
a.multiply(b) 
// 除法,同上
a.divide(b)   
// 取余,同上
a.mod(b)
// 最大公因数,同上
a.gcd(b)	
// 最值,同上
a.max(b)/a.min(b)	
// a的b次方
a.pow(b) 
// 比较大小,a大返回1
a.compareTo(b) 
// 把BigInteger 转化为 BigDecimal
toBigDecimal() 
// 把BigDecimal 转化为 BigInteger
toBigInteger() 

BigDecimal在乘除时可以指定结果舍入方式

// 只有乘除法才有舍入这个说法
// 向零舍入。 即1.55 变为 1.5 , -1.55 变为-1.5
ROUND_DOWN 
// 向正无穷舍入. 即 1.55 变为 1.6 , -1.55 变为 -1.5
ROUND_CEILING
// 向负无穷舍入. 即 1.55 变为 1.5 , -1.55 变为 -1.6
ROUND_FLOOR
// 四舍五入 即1.55 变为1.6, -1.55变为-1.6
ROUND_HALF_UP 
// 五舍六入 即 1.55 变为 1.5, -1.5变为-1.5
ROUND_HALF_DOWN 
    
// a除b结果四舍五入并保留两位小数返回给c
BigDecimal c = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);
// a保留两位小数并且向0舍入
a = a.setScale(2, BigDecimal.ROUND_DOWN);

11. 输入输出

Scanner类较为常用,此处不赘述

BufferedReader

// 初始化一个缓冲输入流
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
// 读取一个文本行,一般配合split将读取字符串分割,用Integer将其转型
readLine();	

BufferedWriter

// 初始化一个缓冲输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
// 将a送入输出流中,一般将需要的输出一并放到输出流中,此时并未输出
write(a);
// 刷新输出流,将此时输出流的东西输出
flush();	

12. 常用封装算法

12.1 质数判断

大于等于5质数一定和6倍数相邻,1不是质数

// 判断素数的方法,已知1不是素数,在主函数中去除1即可
public static boolean isPrimeNumber(int n) {
		if (n == 2 || n == 3) {
			return true;
		}
		if ((n - 1) % 6 == 0 || (n + 1) % 6 == 0) {
			// 当前可能是素数
			for (int i = 2; i <= Math.sqrt(n); i++) {
				if (n % i == 0) {
					return false;
				}
			}
			return true;
		} else {
			return false;
		}
	}

12.2 最大公因数/最小公倍数

// 最大公约数,此法原理为欧几里得算法,可以理解为是发现的一个规律,不必深究
int gcd(int a, int b) {
		return b == 0 ? a : gcd(b, a % b);
}

// 最小公倍数=两数之积/两数最大公约数
int lcm(int a, int b) {
		return a * b / gcd(a, b);
}

12.3 快速幂

快速幂的原理是通过将幂转换为二进制形式进行分析从而减少相乘次数
正常进行计算时: 3 7 = 3 ∗ 3 ∗ 3 ∗ 3 ∗ 3 ∗ 3 ∗ 3 快速幂则是这样处理,首先 7 = ( 111 ) 2 ,所以 7 = 1 + 2 + 4 因此 3 7 = 3 1 ∗ 3 2 ∗ 3 4 ( 2 0 = 1 , 2 1 = 2 , 2 2 = 4 ) 这样计算次数就从原来的 7 次降低为 3 次,问题的关键便是得到每次乘的数字 由于我们是从二进制角度进行分析,因此位运算往往能派上用场,这就是快速幂整体思想 正常进行计算时:3^7=3*3*3*3*3*3*3\\ 快速幂则是这样处理,首先7=(111)_2,所以7=1+2+4\\ 因此3^7=3^1*3^2*3^4(2^0=1,2^1=2,2^2=4)\\ 这样计算次数就从原来的7次降低为3次,问题的关键便是得到每次乘的数字\\ 由于我们是从二进制角度进行分析,因此位运算往往能派上用场,这就是快速幂整体思想 正常进行计算时:37=3333333快速幂则是这样处理,首先7=(111)2,所以7=1+2+4因此37=313234(20=1,21=2,22=4)这样计算次数就从原来的7次降低为3次,问题的关键便是得到每次乘的数字由于我们是从二进制角度进行分析,因此位运算往往能派上用场,这就是快速幂整体思想

	// 快速幂
	static int qmi(int a, int b) {
        // 保存结果
		int res = 1;	
		while (b != 0) {
			if ((b & 1) == 1) {	
                // 当前最右边二进制位上有值时,说明当前a值是我们所需要的
				res = res * a;
			}
            // b每次处理完一位后往右移
			b = b >> 1;	
            // b完成一次位移后,a的次方数应当*2才能满足下一次乘数的要求
			a = a * a;	
		}
		return res;
	}

qmi(3,7)计算过程如下(求 3 7 3^7 37 ):
1. r e s = 1 , a = 3 , b = 7 = ( 111 ) 2 ,此时 b & 1 = ( 111 ) 2 & ( 001 ) 2 = 1 可知当 b 二进制形式的最后一位不为 0 时, b & 1 = = 1 2. r e s = a ∗ r e s = 3 ∗ 1 = 3 = 3 1 ; b > > 1 = ( 011 ) 2 , a = 3 ∗ 3 = 3 2 3. 再次进入循环, r e s = r e s ∗ a = 3 1 ∗ 3 2 , b > > 1 = ( 001 ) 2 , a = a ∗ a = 3 2 ∗ 3 2 = 3 4 4. r e s = 3 1 ∗ 3 2 ∗ 3 4 , b > > 1 = ( 000 ) 2 , a = 3 4 ∗ 3 4 = 3 8 5. 由于此时 b = = 0 ,所以跳出循环,返回结果 r e s = 3 7 ,即答案 1 .res=1,a=3,b=7=(111)_2,此时b \& 1=(111)_2\&(001)_2=1\\ 可知当b二进制形式的最后一位不为0时,b\&1==1 \\ 2. res=a*res=3*1=3=3^1;b>>1=(011)_2,a=3*3=3^2\\ 3. 再次进入循环,res=res*a=3^1*3^2,b>>1=(001)_2,a=a*a=3^2*3^2=3^4\\ 4. res=3^1*3^2*3^4,b>>1=(000)_2,a=3^4*3^4=3^8\\ 5. 由于此时b==0,所以跳出循环,返回结果res=3^7,即答案 1.res=1a=3,b=7=(111)2,此时b&1=(111)2&(001)2=1可知当b二进制形式的最后一位不为0时,b&1==12.res=ares=31=3=31b>>1=(011)2,a=33=323.再次进入循环,res=resa=3132,b>>1=(001)2,a=aa=3232=344.res=313234,b>>1=(000)2,a=3434=385.由于此时b==0,所以跳出循环,返回结果res=37,即答案

12.4 快速幂求模

详细原理可看快速幂取模

// 原理:(a*c)%mode==((a%mode)*(c%mode))%mode
// 此函数是求(a^b)%mode
	static long Mode(long a, long b, long mode) {
		long sum = 1;
		a = a % mode;
		while (b > 0) {
			if ((b & 1) == 1) { 
				sum = (sum * a) % mode;
			}
			b = b >> 1;
			a = (a * a) % mode;
		}
		return sum;
	}
  • 26
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java程序设计》课程的库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 40. __________包包含了Collection的接口的类的API。 答案:Java.util 41. Math.round(11.5)等于__________,Math.round(-11.5)等于__________。 答案:12; -11 [考点范围] 常用的系统类 42. ________对象可以使用read方法从标准的输入设备(通常键盘)读取数据;__________对象可以使用print方法向标准输出设备(屏幕)输出显示。 答案:System.in ;System.out [考点范围] JAVA输入输出系统 43. 框架(JFrame)和面板(JPanel)的默认布局管理器分别是______和_______。 答案:BorderLayout FlowLayout [考点范围] 图形用户界面 44. Swing的布局管理器主要包括_______。 答案:FlowLayout、BorderLayout、CardLayout、GridLayout、GridBogLayout、BoxLayout [考点范围] 图形用户界面 45. Java事件处理包括建立事件源、________和将事件源注册到监听器 。 答案:声明监听器 [考点范围] 图形用户界面 46. AWT的事件处理机制包括_______、事件和事件监听者。 答案:事件源 [考点范围] 图形用户界面 47. Swing的顶层容器有________、JApplet、JWwindow和JDialog。 答案:JFrame [考点范围] 图形用户界面 48. 线程的启动是通过调用其______________方法而实现的。 答案:start() [考点范围] 线程 49. Java虚拟机(JVM)中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,分别用Thread类中的类常量表示,每个Java线程的优先级都在常数________和_______之间,即Thread.MIN_PRIORIY和Thread.MAX_PRIORIY之间。 答案:1;10 [考点范围] 线程
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ....................................................................................................................................................... 19 2.1. 线程 ...................................................................................................................................................... 20 2.2. JVM 内存区域 ..................................................................................................................................... 21 2.2.1. 程序计数器(线程私有) ................................................................................................................ 22 2.2.2. 虚拟机栈(线程私有) .................................................................................................................... 22 2.2.3. 本地方法区(线程私有) ................................................................................................................ 23 2.2.4. 堆(Heap-线程共享)-运行时数据区 ...................................................................................... 23 2.2.5. 方法区/永久代(线程共享) ..................................................................................................... 23 2.3. JVM 运行时内存 ................................................................................................................................. 24 2.3.1. 新生代 .......................................................................................................................................... 24 2.3.1.1. 2.3.1.2. 2.3.1.3. 2.3.1.4. Eden 区 .................................................................................................................................................... 24 ServivorFrom........................................................................................................................................... 24 ServivorTo .............................................................................................................................................. 24 MinorGC 的过程(复制->清空->互换) ....................................................................................... 24 1:eden、servicorFrom 复制到 ServicorTo,年龄+1................................................................................... 25 2:清空 eden、servicorFrom............................................................................................................................. 25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 .............................................................................................................................. 26 2.4.1.1. 引用计数法............................................................................................................................................... 26 2.4.1.2. 可达性分析............................................................................................................................................... 26 2.3.2. 2.3.3. 老年代 .......................................................................................................................................... 25 永久代 .......................................................................................................................................... 25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................................................................................................................. 26 2.4.2. 2.4.3. 2.4.4. 2.4.5. 2.4.5.1. 2.4.5.2. 2.6.1. 2.6.1.1. 2.6.1.2. 2.7.1. 2.7.2. 2.7.3. 2.7.4. 2.7.5. 2.7.6. 2.7.6.1. 标记清除算法(Mark-Sweep) .............................................................................................. 27 复制算法(copying)................................................................................................................. 27 标记整理算法(Mark-Compact).................................................................................................. 28 分代收集算法 .............................................................................................................................. 29 新生代与复制算法 .............................................................................................................................. 29 老年代与标记复制算法 ......................................................................................................................29 2.5. JAVA 四中引用类型 ........................................................................................................................... 30 2.5.1. 强引用 .......................................................................................................................................... 30 2.5.2. 软引用 .......................................................................................................................................... 30 2.5.3. 弱引用 .......................................................................................................................................... 30 2.5.4. 虚引用 .......................................................................................................................................... 30 2.6. GC 分代收集算法 VS 分区收集算法................................................................................................ 30 分代收集算法 .............................................................................................................................. 30 在新生代-复制算法............................................................................................................................. 30 在老年代-标记整理算法.....................................................................................................................30 分区收集算法 .............................................................................................................................. 31 2.7. GC 垃圾收集器 ................................................................................................................................... 31 2.6.2. Serial 垃圾收集器(单线程、复制算法)................................................................................ 31 ParNew 垃圾收集器(Serial+多线程) ................................................................................... 31 .......................................................... 32 ........................................................................... 32 ......................................................................... 33 ..................................................................................... 33 初始标记 .............................................................................................................................................. 33 Parallel Scavenge 收集器(多线程复制算法、高效) Serial Old 收集器(单线程标记整理算法 ) Parallel Old 收集器(多线程标记整理算法) CMS 收集器(多线程标记清除算法) 2.7.6.2. 2.7.6.3. 2.7.6.4. 2.8.1. 2.8.2. 2.8.3. 2.8.4. 2.8.5. 2.8.1. 2.8.2. 2.8.2.1. 2.8.2.2. 2.8.3. 2.8.4. 2.8.5. 并发标记 .............................................................................................................................................. 34 重新标记 .............................................................................................................................................. 34 并发清除 .............................................................................................................................................. 34 G1 收集器 .................................................................................................................................... 34 2.8. JAVA IO/NIO ....................................................................................................................................... 34 2.7.7. 2.9. 2.9.2. 2.9.2.1. 2.9.2.2. 2.9.2.3. 2.9.3. 2.9.4. 2.9.4.1. 2.9.4.2. 阻塞IO模型 ................................................................................................................................ 34 ............................................................................................................................ 35 ........................................................................................................................ 35 ........................................................................................................................ 36 ................................................................................................................................ 36 .................................................................................................................................. 36 .................................................................................................................................... 37 NIO 的缓冲区 .....................................................................................................................................38 NIO 的非阻塞 .....................................................................................................................................38 ....................................................................................................................................... 40 非阻塞 IO 模型 多路复用 IO 模型 信号驱动 IO 模型 ............................................................................................................................................ 40 ........................................................................................................................................ 40 JVM 类加载机制 ................................................................................................................................. 41 2.9.1.1. 2.9.1.2. 2.9.1.3. 2.9.1.4. 2.9.1.5. 2.9.1.6. 2.9.1.7. 2.9.1.8. 加载 .......................................................................................................................................................... 41 验证 .......................................................................................................................................................... 41 准备 .......................................................................................................................................................... 41 解析 .......................................................................................................................................................... 41 符号引用 .............................................................................................................................................. 42 直接引用 .............................................................................................................................................. 42 初始化 ...................................................................................................................................................... 42 类构造器 .............................................................................................................................. 42 类加载器 ...................................................................................................................................... 42 启动类加载器(Bootstrap ClassLoader) ......................................................................................... 43 扩展类加载器(Extension ClassLoader)..........................................................................................43 应用程序类加载器(Application ClassLoader): ..........................................................................43 双亲委派 ...................................................................................................................................... 43 OSGI(动态模型系统) ............................................................................................................ 44 动态改变构造 ...................................................................................................................................... 44 模块化编程与热插拔 .......................................................................................................................... 44 3. JAVA集合............................................................................................................................................45 3.1. 接口继承关系和实现 .......................................................................................................................... 45 3.2. LIST ....................................................................................................................................................... 47 3.2.1. ArrayList(数组)....................................................................................................................... 47 3.2.2. Vector(数组实现、线程同步) ............................................................................................... 47 3.2.3. LinkList(链表) ......................................................................................................................... 47 3.3. SET ....................................................................................................................................................... 48 3.3.1.1. 3.3.1.2. HashSet(Hash 表) ............................................................................................................................. 48 TreeSet(二叉树) ................................................................................................................................ 49 LinkHashSet(HashSet+LinkedHashMap) ................................................................................... 49 3.3.1.3. 3.4. MAP....................................................................................................................................................... 50 3.4.1. HashMap(数组+链表+红黑树)............................................................................................. 50 3.4.1.1. JAVA7 实现 ............................................................................................................................................. 50 3.4.1.2. JAVA8 实现 ............................................................................................................................................. 51 3.4.2. ConcurrentHashMap.................................................................................................................. 51 3.4.2.1. 3.4.2.2. 3.4.2.3. 3.4.2.4. Segment 段.............................................................................................................................................. 51 线程安全(Segment 继承 ReentrantLock 加锁) .............................................................................. 51 并行度(默认 16) ................................................................................................................................. 52 Java8 实现 (引入了红黑树) .............................................................................................................. 52 13/04/2018 Page 2 of 283 异步IO模型 JAVA IO 包 JAVA NIO Channel Buffer Selector 3.4.3. HashTable(线程安全) ........................................................................................................... 53 3.4.4. TreeMap(可排序) .................................................................................................................. 53 3.4.5. LinkHashMap(记录插入顺序) .............................................................................................. 53 4. JAVA 多线程并发.................................................................................................................................54 4.1.1. JAVA 并发知识库 ....................................................................................................................... 54 4.1.2. JAVA 线程实现/创建方式 .......................................................................................................... 54 4.1.2.1. 4.1.2.2. 4.1.2.3. 4.1.2.4. 继承 Thread 类 ........................................................................................................................................ 54 实现 Runnable 接口。............................................................................................................................ 54 ExecutorService、Callable、Future 有返回值线程.............................................................55 基于线程池的方式................................................................................................................................... 56 4.1.3. 4 种线程池 ................................................................................................................................... 56 4.1.3.1. 4.1.3.2. 4.1.3.3. newSingleThreadExecutor ................................................................................................................. 58 4.1.4. 线程生命周期(状态) .................................................................................................................... 58 4.1.3.4. 4.1.4.1. 4.1.4.2. 4.1.4.3. 4.1.4.4. 新建状态(NEW) ................................................................................................................................. 58 就绪状态(RUNNABLE): ................................................................................................................. 59 运行状态(RUNNING): .................................................................................................................... 59 阻塞状态(BLOCKED):....................................................................................................................59 4.1.9.5. 4.1.9.6. 4.1.9.7. 13/04/2018 Semaphore 信号量 ................................................................................................................................. 68 ................................................................................................................................. 68 ................................................................................................................................................................ 68 ........................................................................................................................... 69 AtomicInteger .......................................................................................................................................... 69 Page 3 of 283 newCachedThreadPool ......................................................................................................................... 57 ............................................................................................................................. 57 newScheduledThreadPool .................................................................................................................... 58 newFixedThreadPool 等待阻塞(o.wait->等待对列): ...................................................................................................................... 59 .......................................................................................................................................... 59 ............................................................................................................................................ 59 线程死亡(DEAD)................................................................................................................................ 59 ............................................................................................................................................................... 59 ............................................................................................................................................................... 59 ............................................................................................................................................................... 59 4.1.5. 终止线程 4 种方式 ...................................................................................................................... 60 同步阻塞(lock->锁池) 其他阻塞(sleep/join) 4.1.4.5. 4.1.5.1. 4.1.5.2. 4.1.5.3. 4.1.5.4. 正常运行结束........................................................................................................................................... 60 使用退出标志退出线程...........................................................................................................................60 Interrupt 方法结束线程 ........................................................................................................................... 60 stop 方法终止线程(线程不安全)....................................................................................................... 61 正常结束. 异常结束. 调用 stop 4.1.6. sleep 与 wait 区别....................................................................................................................... 61 4.1.7. start 与 run 区别 .......................................................................................................................... 62 4.1.8. JAVA 后台线程 ........................................................................................................................... 62 4.1.9. JAVA 锁 ....................................................................................................................................... 63 4.1.9.1. 4.1.9.2. 4.1.9.3. 乐观锁 ...................................................................................................................................................... 63 悲观锁 ...................................................................................................................................................... 63 自旋锁 ...................................................................................................................................................... 63 自旋锁的优缺点....................................................................................................................................................63 自旋锁时间阈值(1.6 引入了适应性自旋锁) .................................................................................................. 63 自旋锁的开启........................................................................................................................................................ 64 4.1.9.4. Synchronized 同步锁.............................................................................................................................. 64 ....................................................................................................................................... 64 ....................................................................................................................................... 64 Synchronized 作用范围 Synchronized 核心组件 Synchronized 实现 ............................................................................................................................................... 64 ReentrantLock......................................................................................................................................... 66 ........................................................................................................................................... 66 ................................................................................................................................................................ 66 .................................................................................................................................................................... 67 ........................................................................................................................ 67 ............................................................................................................................................. 67 ......................................................................................................... 68 tryLock 和 lock 和 lockInterruptibly 的区别........................................................................................................ 68 Lock 接口的主要方法 非公平锁 公平锁 ReentrantLock 与 synchronized ReentrantLock 实现 Condition 类和 Object 类锁方法区别区别 实现互斥锁(计数器为 1) 代码实现 Semaphore 与 ReentrantLock 4.1.9.8. 4.1.9.9. 4.1.9.10. 4.1.9.11. 4.1.9.12. 4.1.9.14. 4.1.9.15. 4.1.9.16. 可重入锁(递归锁)............................................................................................................................... 69 公平锁与非公平锁................................................................................................................................... 70 ..................................................................................................................................................... 70 ........................................................................................................................................... 70 ReadWriteLock 读写锁......................................................................................................................70 ........................................................................................................................................................................ 70 ........................................................................................................................................................................ 70 公平锁(Fair) 非公平锁(Nonfair) 读锁 写锁 共享锁和独占锁 .................................................................................................................................. 70 .................................................................................................................................................................... 70 .................................................................................................................................................................... 70 重量级锁(Mutex Lock)................................................................................................................71 轻量级锁 .............................................................................................................................................. 71 锁升级.................................................................................................................................................................... 71 独占锁 共享锁 4.1.9.13. 偏向锁 .................................................................................................................................................. 71 分段锁 .................................................................................................................................................. 71 锁优化 .................................................................................................................................................. 71 减少锁持有时间 .................................................................................................................................................... 72 ............................................................................................................................................................ 72 .................................................................................................................................................................... 72 .................................................................................................................................................................... 72 .................................................................................................................................................................... 72 4.1.10. 线程基本方法..............................................................................................................................72 减小锁粒度 锁分离 锁粗化 锁消除 4.1.10.1. 4.1.10.2. 4.1.10.3. 4.1.10.4. 4.1.10.5. 4.1.10.6. 4.1.10.7. 4.1.10.8. 线程等待(wait) ............................................................................................................................... 73 线程睡眠(sleep)............................................................................................................................. 73 线程让步(yield) .............................................................................................................................. 73 线程中断(interrupt)........................................................................................................................ 73 Join 等待其他线程终止 ...................................................................................................................... 74 为什么要用 join()方法? .................................................................................................................... 74 线程唤醒(notify)............................................................................................................................. 74 其他方法: .......................................................................................................................................... 74 4.1.11. 线程上下文切换..........................................................................................................................75 4.1.11.1. 4.1.11.2. 4.1.11.3. 4.1.11.4. 4.1.11.5. 4.1.11.6. 4.1.11.7. 进程......................................................................................................................................................75 上下文..................................................................................................................................................75 寄存器..................................................................................................................................................75 程序计数器 .......................................................................................................................................... 75 PCB-“切换桢”................................................................................................................................. 75 上下文切换的活动: .......................................................................................................................... 76 引起线程上下文切换的原因 .............................................................................................................. 76 4.1.12. 同步锁与死锁..............................................................................................................................76 4.1.12.1. 同步锁 .................................................................................................................................................. 76 4.1.12.2. 死锁 ...................................................................................................................................................... 76 4.1.13. 线程池原理..................................................................................................................................76 4.1.14.1. 4.1.14.2. 4.1.14.3. 4.1.14.4. 4.1.14.5. 4.1.14.6. 4.1.14.7. 4.1.14.8. 4.1.13.1. 4.1.13.2. 4.1.13.3. 4.1.13.4. 线程复用 .............................................................................................................................................. 76 ...................................................................................................................................... 76 .............................................................................................................................................. 78 ......................................................................................................................... 78 4.1.14. JAVA 阻塞队列原理.................................................................................................................... 79 线程池的组成 拒绝策略 Java 线程池工作过程 阻塞队列的主要方法 .......................................................................................................................... 80 ............................................................................................................................................................ 80 .................................................................................................................................................... 81 ............................................................................................................................. 81 ....................................................................................... 82 ......................................................................... 82 .............................................................. 82 .......................................................................................... 82 .............................................................. 83 ...................................................................................................................... 83 插入操作: 获取数据操作: Java 中的阻塞队列 ArrayBlockingQueue(公平、非公平) LinkedBlockingQueue(两个独立锁提高并发) PriorityBlockingQueue(compareTo 排序实现优先) DelayQueue(缓存失效、定时任务 ) SynchronousQueue(不存储数据、可用于传递数据) LinkedTransferQueue 13/04/2018 Page 4 of 283 4.1.14.9. LinkedBlockingDeque ..................................................................................................................... 83 4.1.15. CyclicBarrier、CountDownLatch、Semaphore 的用法 ........................................................ 84 4.1.15.1. 4.1.15.2. 4.1.15.3. ................................................................................................ 84 ............................................... 84 ....................................................................... 85 CountDownLatch(线程计数器 ) CyclicBarrier(回环栅栏-等待至 barrier 状态再全部同时执行) Semaphore(信号量-控制同时访问的线程个数) 4.1.16. volatile 关键字的作用(变量可见性、禁止重排序) ............................................................. 87 变量可见性............................................................................................................................................................ 87 禁止重排序............................................................................................................................................................ 87 ..................................................................................................................... 87 ................................................................................................................................................................ 87 4.1.17. 如何在两个线程之间共享数据...................................................................................................88 将数据抽象成一个类,并将数据的操作作为这个类的方法.............................................................................88 .................................................................................................................. 89 4.1.18. ThreadLocal 作用( )........................................................................................ 90 .............................................................................................................. 90 ................................................................................................................................................................ 91 4.1.19. synchronized 和 ReentrantLock 的区别 .................................................................................. 91 4.1.19.1. .................................................................................................................................. 91 4.1.19.2. .................................................................................................................................. 92 4.1.20. ConcurrentHashMap 并发......................................................................................................... 92 4.1.20.1. .......................................................................................................................................... 92 4.1.20.2. .......................................................................................................... 92 ................................................. 93 4.1.21. Java 中用到的线程调度 ............................................................................................................. 93 比 sychronized 更轻量级的同步锁 适用场景 Runnable 对象作为一个类的内部类 ThreadLocalMap(线程的一个属性) 线程本地存储 使用场景 两者的共同点: 两者的不同点: 4.1.21.1. 4.1.21.2. 4.1.21.3. 4.1.21.4. 减小锁粒度 ...................................................................................................................................... 93 ...................................................................................................................................... 93 ............................................................................................. 94 ..................................................................................................................... 94 4.1.22. 进程调度算法..............................................................................................................................94 4.1.22.1. 4.1.22.2. 4.1.22.3. ...................................................................................................................................... 94 ...................................................................................................................... 95 .............................................................................................................. 96 )..................................................................96 .......................................................................................................................................... 96 ........................................................................... 97 ............................................................................................................................................. 98 4.1.24. 什么是AQS(抽象的队列同步器).........................................................................................98 Exclusive 独占资源-ReentrantLock ................................................................................................................... 99 Share 共享资源-Semaphore/CountDownLatch ............................................................................................... 99 同步器的实现是 ABS 核心(state 资源状态计数) ....................................................................................... 100 ReentrantReadWriteLock 实现独占和共享两种方式.....................................................................................100 5. JAVA基础..........................................................................................................................................101 4.1.23. 什么是CAS( 4.1.23.1. 4.1.23.2. 4.1.23.3. 5.1.1. 5.1.1.1. 5.1.1.2. 5.1.1.3. 5.1.1.4. JAVA 异常分类及处理.............................................................................................................. 101 .................................................................................................................................................... 101 ............................................................................................................................................ 101 ..................................................................................................................................................................... 101 ........................................................................... 101 ................................................................................................................................ 102 ......................................................... 102 .................................................................................................................. 102 ............................................................................................................ 102 13/04/2018 Page 5 of 283 ConcurrentHashMap 分段锁 ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成 抢占式调度: 协同式调度: JVM 的线程调度实现(抢占式调度) 线程让出 cpu 的情况: 优先调度算法 高优先权优先调度算法 基于时间片的轮转调度算法 比较并交换-乐观锁机制-锁自旋 概念及特性 原子包 java.util.concurrent.atomic(锁自旋) ABA 问 概念 异常分类 Error Exception(RuntimeException、CheckedException) 异常的处理方式 遇到问不进行具体处理,而是继续抛给调用者 (throw,throws) try catch 捕获异常针对性处理方式 Throw 和 throws 的区别: 位置不同 功能不同: 5.1.2. 5.1.2.1. 5.1.2.2. 5.1.2.3. 5.1.2.4. 5.1.2.5. 5.1.2.6. 5.1.2.7. 5.1.3. 5.1.4.1. 5.1.4.2. 5.1.4.3. 5.1.4.4. @Documented 描述-javadoc @Inherited 阐述了某个被标注的类型是被继承的 5.1.5.1. 5.1.5.2. 5.1.5.3. 5.1.5.4. 泛型方法() ............................................................................................................................. 112 泛型类 ............................................................................................................................................. 112 类型通配符? .......................................................................................................................................... 113 类型擦除 ................................................................................................................................................ 113 .............................................................................................................................................................. 102 .......................................................................................................................................................... 102 JAVA 反射 ................................................................................................................................. 103 ............................................................................................................................................ 103 ............................................................ 103 ................................................................................................................................ 103 .................................................................................................................................. 103 ...................................................................................................................... 104 .................................................................................................................................... 104 ............................................................................ 104 ..................................................................... 104 ............................................................................................................ 104 ....................................................................................................................... 104 ................................................................................ 104 ............................................................................ 104 动态语言 反射机制概念 (运行状态中知道类所有的属性和方法) 反射的应用场合 编译时类型和运行时类型 的编译时类型无法获取具体方法 Java 反射 API 反射 API 用来生成 JVM 中的类、接口或则对象的信息。 反射使用步骤(获取 Class 对象、调用对象方法) 获取 Class 对象的 3 种方法 调用某个对象的 getClass()方法 调用某个类的 class 属性来获取该类对应的 Class 对象 使用 Class 类中的 forName()静态方法(最安全/性能最好) 创建对象的两种方法 Class 对象的 newInstance() 调用 Constructor 对象的 newInstance() ........................................................................................................................ 105 ............................................................................................................................. 105 .......................................................................................................... 105 JAVA 注解 ................................................................................................................................. 106 5.1.3.1. 概念 ........................................................................................................................................................ 106 5.1.3.2. 4 种标准元注解...................................................................................................................................... 106 @Target 修饰的对象范围 ................................................................................................................................. 106 @Retention 定义 被保留的时间长短 ............................................................................................................... 106 ................................................................................................................................ 106 .............................................................................................. 106 5.1.3.3. 注解处理器............................................................................................................................................. 107 5.1.4. JAVA 内部类 ............................................................................................................................. 109 静态内部类............................................................................................................................................. 109 成员内部类............................................................................................................................................. 110 局部内部类(定义在方法中的类) ..................................................................................................... 110 匿名内部类(要继承一个父类或者实现一个接口、直接使用 new 来生成一个对象的引用) ..... 111 5.1.5. JAVA 泛型 ................................................................................................................................. 112 5.1.6. JAVA 序列化(创建可复用的 Java 对象) ................................................................................. 113 .................................................................................................... 113 ................................................................................................. 113 .................................................................................................................................. 113 Serializable 实现序列化 .................................................................................................................................... 113 ............................................... 113 ................................................................................................ 113 ............................................................................................................................................................. 113 .................................................................................................................................. 114 .............................................................................................................................................. 114 ............................................................................................ 114 5.1.7. JAVA 复制 ................................................................................................................................. 114 5.1.7.1. ......................................................................................................................................... 114 5.1.7.2. ..................................................................................... 114 5.1.7.3. ................................................................................................. 115 5.1.7.4. ........................................................................................................ 115 6. SPRING 原理 ..................................................................................................................................... 116 6.1.1. Spring 特点................................................................................................................................ 116 6.1.1.1. 轻量级 ................................................................................................................................................ 116 13/04/2018 Page 6 of 283 保存(持久化)对象及其状态到内存或者磁盘 序列化对象以字节数组保持-静态成员不保存 序列化用户远程对象传输 ObjectOutputStream 和 ObjectInputStream 对对象进行序列化及反序列化 writeObject 和 readObject 自定义序列化策略 序列化 ID 序列化并不保存静态变量 序列化子父类说明 Transient 关键字阻止该变量被序列化到文件中 直接赋值复制 浅复制(复制引用但不复制引用的对象) 深复制(复制对象和其应用对象) 序列化(深 clone 一中实现) 6.1.1.2. 6.1.1.3. 6.1.1.4. 6.1.1.5. 6.1.2. 6.1.3. 6.1.4. 6.1.5. 6.1.6. 6.1.7. ............................................................................................................................................ 116 ............................................................................................................................................ 116 .................................................................................................................................................... 116 ............................................................................................................................................ 116 Spring 核心组件........................................................................................................................ 117 Spring 常用模块........................................................................................................................ 117 Spring 主要包............................................................................................................................ 118 Spring 常用注解........................................................................................................................ 118 Spring 第三方结合.................................................................................................................... 119 Spring IOC 原理........................................................................................................................ 120 6.1.7.1. 6.1.7.2. 6.1.7.3. 概念 ........................................................................................................................................................ 120 Spring 容器高层视图 ............................................................................................................................ 120 IOC 容器实现......................................................................................................................................... 120 控制反转 面向切面 容器 框架集合 BeanFactory-框架基础设施 .............................................................................................................................. 120 1.1..1.1.1 1.1..1.1.2 1.1..1.1.3 1.1..1.1.4 1.1..1.1.5 1.1..1.1.6 1.1..1.1.7 1.1..1.1.8 BeanDefinitionRegistry 注册表................................................................................................. 121 BeanFactory 顶层接口 .............................................................................................................. 121 ListableBeanFactory ................................................................................................................. 121 HierarchicalBeanFactory 父子级联.......................................................................................... 121 ConfigurableBeanFactory......................................................................................................... 121 AutowireCapableBeanFactory 自动装配 ................................................................................ 122 SingletonBeanRegistry 运行期间注册单例 Bean................................................................... 122 依赖日志框框.............................................................................................................................122 ApplicationContext 面向开发应用 .................................................................................................................... 122 WebApplication 体系架构 ................................................................................................................................. 123 6.1.7.4. Spring Bean 作用域.............................................................................................................................. 123 singleton:单例模式(多线程下不安全) ...................................................................................................... 123 prototype:原型模式每次使用时创建 ................................................................................................................ 124 Request:一次 request 一个实例 .................................................................................................................... 124 session ................................................................................................................................................................ 124 global Session....................................................................................................................................................124 6.1.7.5. Spring Bean 生命周期.......................................................................................................................... 124 实例化.................................................................................................................................................................. 124 IOC依赖注入......................................................................................................................................................124 setBeanName 实现............................................................................................................................................ 124 BeanFactoryAware 实现 ................................................................................................................................... 124 ApplicationContextAware 实现......................................................................................................................... 125 postProcessBeforeInitialization 接口实现-初始化预处理.......................................................................... 125 init-method .......................................................................................................................................................... 125 postProcessAfterInitialization ........................................................................................................................... 125 Destroy 过期自动清理阶段 ............................................................................................................................... 125 destroy-method 自配置清理 ............................................................................................................................. 125 6.1.7.6. Spring 依赖注入四种方式 .................................................................................................................... 126 构造器注入.......................................................................................................................................................... 126 setter方法注入...................................................................................................................................................127 静态工厂注入...................................................................................................................................................... 127 实例工厂.............................................................................................................................................................. 127 6.1.7.7. 5 种不同方式的自动装配...................................................................................................................... 128 6.1.8. Spring APO 原理 ...................................................................................................................... 129 6.1.8.1. 6.1.8.2. 6.1.8.1. 概念 ........................................................................................................................................................ 129 AOP 核心概念 ....................................................................................................................................... 129 AOP 两种代理方式 ............................................................................................................................... 130 JDK 动态接口代理 ............................................................................................................................................. 130 CGLib 动态代理.................................................................................................................................................. 131 6.1.8.2. 实现原理 ................................................................................................................................................ 131 6.1.9. Spring MVC原理......................................................................................................................132 6.1.9.1. MVC 流程............................................................................................................................................... 132 Http 请求到 DispatcherServlet ....................................................................................................................... 133 HandlerMapping 寻找处理器............................................................................................................................133 调用处理器 Controller........................................................................................................................................ 133 13/04/2018 Page 7 of 283 Controller 调用业务逻辑处理后,返回 ModelAndView.................................................................................133 DispatcherServlet 查询 ModelAndView .......................................................................................................... 133 ModelAndView 反馈浏览器 HTTP ................................................................................................................... 133 6.1.9.1. MVC 常用注解 ....................................................................................................................................... 133 6.1.10. Spring Boot 原理....................................................................................................................... 134 1. 创建独立的 Spring 应用程序............................................................................................................................. 134 2.嵌入的Tomcat,无需部署WAR文件.............................................................................................................134 3. 简化 Maven 配置 ................................................................................................................................................ 134 4. 自动配置 Spring ................................................................................................................................................. 134 5. 提供生产就绪型功能,如指标,健康检查和外部配置................................................................................... 134 6. 绝对没有代码生成和对 XML 没有要求配置 [1] ............................................................................................... 134 6.1.11. JPA 原理 .................................................................................................................................... 134 6.1.11.1. 事务....................................................................................................................................................134 6.1.11.2. 6.1.11.1. 6.1.11.1. 本地事务 ............................................................................................................................................ 134 分布式事务 ........................................................................................................................................ 135 两阶段提交 ........................................................................................................................................ 136 1 准备阶段........................................................................................................................................................... 136 2 提交阶段:....................................................................................................................................................... 136 6.1.12. Mybatis 缓存.............................................................................................................................. 137 6.1.12.1. Mybatis 的一级缓存原理(sqlsession 级别)..............................................................................138 6.1.12.2. 二级缓存原理(mapper 基本).....................................................................................................138 具体使用需要配置: .......................................................................................................................................... 139 6.1.13. Tomcat 架构 .............................................................................................................................. 139 7. 微服务 ................................................................................................................................................. 140 7.1.1. 服务注册发现 ............................................................................................................................ 140
单链表是一种常见的数据结构,用于存储一系列的节点连接起来的数据。 在C语言中,我们可以使用结构体来定义一个节点,包含一个数据域和一个指向下一个节点的指针域。代码如下: ```c struct Node { int data; struct Node* next; }; ``` 然后,我们可以定义一个指向链表头部的指针,表示整个链表的起始位置。初始化链表时,这个指针可以指向NULL。 ```c struct Node* head = NULL; ``` 接下来,我们可以实现一些基本的操作,例如插入节点、删除节点、遍历链表等。 插入节点的过程包括创建一个新节点,并将其插入到链表中适当的位置。 ```c void insertNode(int value) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = value; newNode->next = NULL; if (head == NULL) { head = newNode; } else { struct Node* curr = head; while (curr->next != NULL) { curr = curr->next; } curr->next = newNode; } } ``` 删除节点的过程需要找到目标节点,并调整前后节点的指针。 ```c void deleteNode(int value) { if (head == NULL) { return; } if (head->data == value) { struct Node* temp = head; head = head->next; free(temp); return; } struct Node* prev = head; struct Node* curr = head->next; while (curr != NULL && curr->data != value) { prev = curr; curr = curr->next; } if (curr != NULL) { prev->next = curr->next; free(curr); } } ``` 遍历链表的过程是从头节点开始,依次打印每个节点的数据。 ```c void printList() { struct Node* curr = head; while (curr != NULL) { printf("%d ", curr->data); curr = curr->next; } printf("\n"); } ``` 这是一个简单的单链表的实现示例,你可以根据需要进一步扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值