java多线程基础
在操作系统之上,可以同时运行很多个进程,并且每个进程之间相互隔离互不干扰。CPU会通过时间片轮转算法,为每一个进程分配时间片,并在时间片使用结束后切换下一个进程继续执行,通过这种方式来实现宏观上的多个程序同时运行。
由于每个进程都有一个自己的内存空间,进程之间的通信就变得非常麻烦(比如要共享某些数据)而且执行不同进程会产生上下文切换,非常耗时
后来,线程的概念被提出,一个进程可以有多个线程,线程是程序执行中一个单一的顺序控制流程,现在线程才是程序执行流的最小单元,各个线程之间共享程序的内存空间(也就是所在进程的内存空间),上下文切换速度也高于进程。
很多框架都在使用多线程,比如Tomcat服务器,所有用户的请求都是通过不同的线程来进行处理的,这样网站才可以同时响应多个用户的请求。
虽然多线程能够解决很多问题,但是,如何才能正确地使用多线程,如何才能将多线程的资源合理使用,这都是我们需要关心的问题。
在Jdk1.5的时候,新增了java.util.concurrent(JUC)包,其中包括大量用于多线程编程的工具类,目的是为了更好的支持高并发任务,让开发者进行多线程编程时减少竞争条件和死 ...
java集合
集合的好处之前保存多个数据的时候一直都是用的数组,但是数组
长度开始时必须指定,而且一旦指定,不能更改
保存的必须为同一类型的元素
使用数组进行增加/删除元素时比较麻烦
但是集合避免了这些缺点,可以动态保存任意多个对象。
常用的集合主要可以分为两类
单列集合Collection
List:ArrayList、LinkedList、Vector
Set:HashSet、TreeSet
双列集合Map:HashMap、TreeMap、Hashtable、Properties
CollectionCollection是一个接口,不可以实例化。该类提供了一些通用方法,供实现该接口的类使用。
size:集合中元素个数
isEmpty:检查集合是否为空
clear:清空集合
ListList实现了Collection接口,除了通用方法外,还含有:
add(i,b):把b元素添加到集合的i位置
addAll(i,b):从i位置开始,把b中所有元素添加进来
get(i):得到i位置上的元素
indexOf(a)/lastIndexOf(a):返回a在List中第一 ...
java常用类及其方法
包装类针对八种基本数据类型相应的引用类型,有了类的特点,就能调用类中的方法。
基本数据类型
包装类
boolean
Boolean
char
Character
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
装箱与拆箱 这两个过程的主要用途在于使得在需要使用对象的场景中能够使用基本数据类型,以及在需要使用基本数据类型的场景中能够使用对象。例如,在集合类中,只能存储对象而不能存储基本数据类型,因此需要通过装箱将基本数据类型转换为对应的包装类对象。
在jdk5之前,需要手动装箱与拆箱,jdk5及之后使用自动装箱与拆箱。
public class Test{ public static void main(String[] args){ int num = 100; // 手动装箱 Integer i = new Integer(num); Integer j = In ...
java基础入门(三)
枚举类使用方法
使用关键字enum代替class,默认会继承Enum类
public static final 类名 = new 类名(参数)直接使用类名(参数)代替,这种语法会默认调用该类的构造器,如果有无参构造器可以不填参数
如果有多个常量对象,使用,间隔
创建的对象放在枚举类的行首
Enum类不可在外部创建对象,因为其构造器为私有
常用方法
方法名
详细描述
valueOf
通过字符串找到叫该名字的枚举对象,如果没找到会报异常
toString
返回枚举对象的名称,通常会在枚举类中重写该方法
values
隐藏在枚举类中的方法,返回一个数组,含有全部定义的枚举对象
ordinal
输出该枚举对象的定义次序,从0开始编号
compareTo
比较两个枚举对象,按照定义次序比较,返回前面的枚举常量编号减去后面的枚举常量编号
注意事项
使用enum关键字后不能继承其他类(enum会隐式的继承Enum类)
枚举类的普通类一样可以实现接口
注解注解(Annotation)也叫做元数据(Metadata),用于解释包、类、方法、属性、构造器、局部变量等数据信 ...
java基础入门(二)
类变量(静态变量)在类中定义的变量,加上static称为类变量,否则称为实例变量/普通变量。
性质:
类中使用static修饰的变量将会被所有同类共享。
static类变量,在类加载时就生成了,不需要创建对象实例就可以访问(以该变量不是private修饰为前提)。
注意事项
什么时候需要使用类变量?
当我们需要让某个类的所有对象对共享一个变量时可以使用。
类变量与实例变量的区别:
类变量是该类的所有对象共享的,而实例变量时每个对象独享的。
类变量的生命周期随着类加载开始,随着类消亡而被销毁。
类方法(静态方法)类似于类变量,就是在类中定义的方法前使用static修饰。
使用时不需要将类实例化,直接用类名.方法使用。
注意事项
类方法和普通方法一样,随着类加载而加载,将结构信息存在方法区
类方法中无this参数,不能使用与对象有关的关键字,如this和super。
类方法只能访问静态变量和静态方法。
普通成员方法可以访问静态方法和普通方法。
理解main方法
public static void main(String[] args){}
main方 ...
java基础入门(一)
idea常用快捷键
Ctrl + Alt + L 格式化
Shift + F10 编译运行
Alt + Insert 插入构造器
Ctrl + H 显示继承关系
Alt+Enter new完对象后可以直接分配变量名
idea 断点调试
跳入(F7): 跳入方法内(可以查看JDK原码)
跳过(F8): 逐行执行代码
跳出(shift+F8):跳出方法
继续(F9):跳到下一个断点
JUnitJUnit是一个Java语言的单元测试框架,多数Java的开发环境已经继承了JUnit作为单元测试工具。
使用方式 如果在编写主方法时添加了很多非静态的方法,则在逐个测试方法时需要在main()函数中挨个new出来,再逐个测试。这样做非常的麻烦,可以点击Alt + Enter安装JUnit框架,在需要测试的方法上加@Test标识,则该方法前面会出现绿色的运行按钮,这样不需要在main()函数中声明也可以快速执行方法。
public class Test{ public static void main(String[] args){ / ...
LeetCode每日一题.2
LeetCode每日一题 今天的每日一题是383. 赎金信,简单题,直接做。
题干给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = “a”, magazine = “b”输出:false
示例 2:
输入:ransomNote = “aa”, magazine = “ab”输出:false
示例 3:
输入:ransomNote = “aa”, magazine = “aab”输出:true
提示:
1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成
思路分析把字符串中每一个字符映射到哈希表上,统计数字,如果ransomNote中的对应字母 ...
LeetCode第379场周赛
LeetCode第379场周赛 这场比赛感觉来恶心人的,一堆边界条件,又让我疯狂WA,简单题也WA,受不了了。
第一题给你一个下标从 0 开始的二维整数数组 dimensions。
对于所有下标 i(0 <= i < dimensions.length),dimensions[i][0] 表示矩形 i 的长度,而 dimensions[i][1] 表示矩形i的宽度。
返回对角线最长的矩形的面积。如果存在多个对角线长度相同的矩形,返回面积最大的矩形的面积。
示例 1:
输入:dimensions = [[9,3],[8,6]]输出:48解释:下标 = 0,长度 = 9,宽度 = 3。对角线长度 = sqrt(9 * 9 + 3 * 3) = sqrt(90) ≈ 9.487。下标 = 1,长度 = 8,宽度 = 6。对角线长度 = sqrt(8 * 8 + 6 * 6) = sqrt(100) = 10。因此,下标为 1 的矩形对角线更长,所以返回面积 ...
LeetCode第121场双周赛
LeetCode第121场双周赛 每次这么晚打比赛脑子都要抽风,这次周赛疯狂WA,第一道简单题更是WA了4次,受不了了。每次打比赛我都是能AC三题就是胜利,第四题看一眼题干,能看懂就做,看不懂就不做了,这次确实是A掉三题,只不过罚时了很久就是了…
第一题给你一个下标从 0 开始的整数数组 nums 。
如果一个前缀 nums[0..i] 满足对于 1 <= j <= i 的所有元素都有 nums[j] = nums[j - 1] + 1 ,那么我们称这个前缀是一个 顺序前缀 。特殊情况是,只包含 nums[0] 的前缀也是一个 顺序前缀 。
请你返回 nums 中没有出现过的 最小 整数 x ,满足 x 大于等于 最长 顺序前缀的和。
示例 1:
输入:nums = [1,2,3,2,5]输出:6解释:nums 的最长顺序前缀是 [1,2,3] ,和为 6 ,6 不在数组中,所以 6 是大于等于最长顺序前缀和的最小整数。
示例 2:
输入:nums = [3,4,5,1,12,14,13]输出:15解释:nums 的最长顺序前缀是 [3,4,5] ...
LeetCode每日一题.1
LeetCode每日一题 今天的每日一题是2807. 在链表中插入最大公约数,难度标的中等,不过我认为应该是简单题
题干给你一个链表的头 head ,每个结点包含一个整数值。
在相邻结点之间,请你插入一个新的结点,结点值为这两个相邻结点值的 最大公约数 。
请你返回插入之后的链表。
两个数的 最大公约数 是可以被两个数字整除的最大正整数。
示例 1:
输入:head = [18,6,10,3]输出:[18,6,6,2,10,1,3]解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。
18 和 6 的最大公约数为 6 ,插入第一和第二个结点之间。
6 和 10 的最大公约数为 2 ,插入第二和第三个结点之间。
10 和 3 的最大公约数为 1 ,插入第三和第四个结点之间。所有相邻结点之间都插入完毕,返回链表。
示例 2:
输入:head = [7]输出:[7]解释:第一幅图是一开始的链表,第二幅图是插入新结点后的图(蓝色结点为新插入结点)。没有相邻结点,所以返回初始链表。
提示:
链表中结点数目在 [1, 5000] ...