![](https://img-blog.csdnimg.cn/20210509095731245.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 65
java学习记录
小李子还挺酸
突飞猛进往往是自然发生的。你在某个夜晚苦熬一个知识点时,不会觉得自己突飞猛进;只有在多年后某日熟练地给别人讲解这个知识点后,内心才会小小地波动一下,猛然忆起当年深夜中的青灯一盏。
展开
-
<Java>java多线程的创建、使用以及如何解决线程安全问题
一、程序、进程和线程二、多线程的创建方式一:继承于Thread类方式二:实现Runnable接口三、Thread中的常用方法四、线程的生命周期例题:多窗口售票问题五、线程同步方式一:同步代码块1 解决实现Runnable方法的方式的线程安全问题2 解决继承Thread类的方式的线程安全问题方式二:同步方法1 使用同步方法解决实现Runnable接口的线程安全问题2 使用同步方法解决继承Thread类的线程安全问题原创 2021-06-12 11:08:25 · 1252 阅读 · 1 评论 -
<Java>使用Comparable和Comparator自定义排序
对List中的元素进行排序,可以使用List自带的sort()方法,使用时,我们需要向其传入一个实现的Comparator接口default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a原创 2021-09-02 14:37:57 · 210 阅读 · 0 评论 -
<Java>AtomicInteger的基本用法
1、AtomicInteger的常用方法i++和++i不是线程安全的,因此在高并发的情况下,需要使用synchronized等关键字来保证线程安全,但是AtomicInteger这个类则是线程安全的public static void main(String[] args) { AtomicInteger int1=new AtomicInteger(); System.out.println("AtomicInteger的默认值为:"+int1);转载 2021-08-24 22:51:13 · 11766 阅读 · 0 评论 -
<Java>Map的putAll()的使用以及 List 转 Map(Collectors.toMap) 使用技巧
putAll(Map<? extends K,? extends V> m)将指定map的所有映射复制到调用此方法map。如map1.putAll(map2);那么就是将map2的所有映射复制到map1中示例 public static void main(String[] args) { Map<Integer,String> map1=new HashMap(); Map<Integer,String> map2=ne原创 2021-08-24 19:13:26 · 754 阅读 · 0 评论 -
<Java>lambda表达式及使用parallelStream().filter()过滤数据
1、lambda表达式特征 * 1、可选类型声明:不需要声明参数类型,编译器可以统一识别参数值 * 2、可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号 x -> x*2 接收一个参数,并且返回其2倍的数值 * 3、可选的大括号:如果主体包含了一个语句,就不需要使用大括号 * 4、可选的返回关键字:如果主体只有一个表达式返回值,那么编译器会自动返回值,大括号需要指明表达式返回了一个数值 * * 1、不需要参数,返回值为5 * () -> 5 * * 2、原创 2021-08-24 15:44:17 · 5696 阅读 · 0 评论 -
<Java>Java多线程——线程间的通信(两个线程交替打印1-100)
文章目录1 wait、notify、notifyAll详解2 例题:两个线程交替打印1-1001 wait、notify、notifyAll详解1、wait()、notify()、notifyAll()方法是Object的本地final方法,无法被重写2、wait()方法使当前线程阻塞,前提是必须先获得锁,一般配合synchronized关键字使用。即一般就是在synchronized同步代码块或synchronized同步方法里使用wait()、notify()、notifyAll()方法3、原创 2021-06-14 12:35:10 · 1149 阅读 · 0 评论 -
<Java>多线程——Lock锁方式解决线程安全问题
Lock接口提供了与synchronized关键字类似的同步功能synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁定的访问,但却强制所有锁定获取和释放均要出现在一个块结构中:当获取了多个锁定时,它们必须以相反的顺序释放,且必须在与所有锁定被获取时相同的词法范围内释放所有锁定。虽然synchronized方法和语句的范围机制使得使用监视器锁定编程方便了很多,而且还帮助避免了很多涉及到锁定的常见编程错误,但有时也需要以更为灵活的方式使用锁定。例如,某些遍历并发访问的数据结果的算法原创 2021-06-12 21:01:15 · 1395 阅读 · 3 评论 -
<Java>单例模式(Singleton)
什么是单例模式单例模式,保证一个类在整个系统中仅有一个实例,并提供一个访问它的全局访问点例如:代表JVM运行环境的Runtime类要点(1)某个类只能有一个实例,外面不能随意地创建方法:构造器私有化(2)这个类必须自行创建这个实例使用一个该类的静态变量来保存这个唯一实例(3)这个类必须自行向整个系统提供这个实例对外提供获取该实例对象的方式 1)直接暴露(设置静态变量访问权限为public) 2)用静态变量的get方法获取实现方式饿汉式:直接创建对象,不存在线程安全问题懒汉式原创 2021-06-05 21:33:40 · 117 阅读 · 0 评论 -
<Java>你知道i=i++的运行结果是怎么计算的吗?
有如下一段代码,可以先尝试计算一些运行的结果 public static void main(String[] args) { int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println("i=" + i); System.out.println("j=" + j);原创 2021-06-05 20:26:58 · 659 阅读 · 1 评论 -
<Java>集合——Set(HashSet,TreeSet,LinkedHashSet)
一、Set的介绍Set是一个接口,存储无序的、不可重复的元素其实现类有以下3个:1、HashSet(常用)线程不安全的可存储null值2、LinkedHashSet是HashSet的子类,由于是链表结构,遍历其内部数据时,可以按照添加的顺序读取3、TreeSet可以按照添加对象的指定属性进行排序(实现Comparable或者是Comparator)二、HashSet1、特点不能保证元素的排列顺序不是线程安全集合元素可以是null2、要求判断两个元素相原创 2021-05-09 16:41:19 · 137 阅读 · 1 评论 -
<Java>集合——HashMap
一、HashMap1、构造方法示例:package HashMapPack;import java.util.*;public class HashMapDemo { public static void main(String[] args) { HashMap<Integer,String> hashmap=new HashMap<>(); int Sno[]={1,2,3,4,5}; String Name[原创 2021-05-09 13:53:50 · 119 阅读 · 0 评论 -
<Java>Stack与Queue
一、Stack示例:package StackPack;import java.util.Stack;public class StackDemo { public static void main(String[] args) { Stack<Integer> stack=new Stack<>(); for(int i=0;i<10;i++) { stack.push(i*2);原创 2021-05-09 09:55:23 · 193 阅读 · 0 评论 -
<Java>集合——List的基本用法(ArrayList,LinkedList)
一、ArrayList1、构造方法示例:package ArrayListPack;import java.util.*;public class ArrayListDemo { public static void main(String[] args) { //一、构造方法 //1、ArrayList() List<Integer> list=new ArrayList(); for(int i=0;i原创 2021-05-09 00:24:21 · 348 阅读 · 1 评论 -
<Java>LinkedList常用方法——增删查
增加:add(E e):在链表后添加一个元素;addFirst(E e):在链表头部插入一个元素;addLast(E e):在链表尾部添加一个元素;删除:remove() :移除链表中第一个元素;remove(index i):移除指定元素;pop():删除第一个元素poll():返回第一个元素并移除查:get(int index):按照下标获取元素;peek():获取第一个元素,但是不移除;peekFirst():获取第一个元素,但是不移除;peekLast():获取最后一个元素原创 2021-04-22 19:55:13 · 522 阅读 · 0 评论 -
浅析Java中的final关键字
谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。下面是本文的目录大纲:一.final关键字的基本用法二.深入理解final关键字一.final关键字的基本用法在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。下面就从这三个方面来了解一下final关键字的基本用法。1.修饰类当用final修饰一个类时,表明这个类不能转载 2021-04-20 17:14:53 · 85 阅读 · 0 评论 -
浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:public native int hashCode();根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法。一.hashCode方法的作用对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode转载 2021-04-20 15:55:21 · 145 阅读 · 0 评论 -
浅谈Java中的深拷贝和浅拷贝
假如说你想复制一个简单变量。很简单: int apples = 5; int pears = apples;不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。但是如果你复制的是一个对象,情况就有些复杂了。假设说我是一个beginner,我会这样写://创建类class Student { private int number; public int getNumber() { re转载 2021-04-19 21:07:30 · 89 阅读 · 0 评论 -
浅谈Java中的对象和对象引用
在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然。今天我们就来一起了解一下对象和对象引用之间的区别和联系。1.何谓对象?在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一。要理解什么是对象,需要跟类一起结合起来理解。下面这段话引自《Java编程思想》中的一段原话:“按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类转载 2021-04-19 20:54:46 · 139 阅读 · 0 评论 -
深入剖析Java中的装箱和拆箱
以下是本文的目录大纲:一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的三.面试中相关的问题一.什么是装箱?什么是拆箱?Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料。在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:Integer i = new Integer(10);而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer转载 2021-04-19 20:33:01 · 69 阅读 · 0 评论 -
浅谈Java中的equals和==
在初学Java时,可能会经常碰到下面的代码: String str1=new String("hello"); String str2=new String("hello"); System.out.println(str1==str2); //false System.out.println(str1.equals(str2)); //true为什么第4行和第5行的输出结果不一样?== 和equals方法之间的转载 2021-04-19 19:12:30 · 95 阅读 · 0 评论 -
<java>数组与集合的转换
方法: public static int[] toIntArr(ArrayList<Integer> arrList) { int res[]=new int[arrList.size()]; for(int i=0;i<res.length;i++) { res[i]=arrList.get(i); } return res; }测试:package S原创 2021-04-19 16:03:06 · 77 阅读 · 0 评论 -
<数据结构>二叉树的删除(java实现)
要求:递归删除节点1、如果删除的节点是叶子节点,则删除节点2、如果删除的节点是非叶子节点,则删除该子树删除节点前判断树是否为空,如果为空,则不进行操作。如果不为空,则再判断一下二叉树是否只有一个节点,如果是,则直接将二叉树置空。1、由于二叉树的单向的,因此不是判断当前节点是否是要删除的节点,而是判断当前节点的子节点是否需要删除。2、如果当前节点的左子节点不为空,并且左子节点就是要删除的节点,则this.left=null,并且返回(结束递归删除)3、如果当前节点的右子节点不为空,并且右子节点就是原创 2021-04-18 19:31:59 · 612 阅读 · 1 评论 -
<数据结构>二叉树的前序查找、中序查找和后序查找(java实现)
使用前序查找、中序查找、后序查找的方式,查询指定的节点以此图为例:节点信息为本次查找方法是基于<数据结构>二叉树的创建、前序遍历、中序遍历和后序遍历(java实现)编写的,查找方法是在heroNode节点中编写的方法前序查找1、先判断当前节点的no是否等于要查找的2、如果是,则返回当前节点,如果不是,则进行下一步3、判断当前节点的左子节点是否为空,如果不为空,则递归前序查找4、如果左递归前序查找,找到节点则返回,否则继续判断当前节点的右子节点是否为空,如果不为空,则继续向右递归前序查找,原创 2021-04-18 14:56:55 · 332 阅读 · 3 评论 -
<数据结构>二叉树的创建、前序遍历、中序遍历和后序遍历(java实现)
二叉树的概念1、每个节点最多只有两个子节点的树称为二叉树2、二叉树的子节点分为左节点和右节点3、如果二叉树的所有节点都在最后一层,并且节点总数为2^n-1,n为层数,那么称这个二叉树为满二叉树4、如果该二叉树的所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,那么称该二叉树为完全二叉树二叉树的遍历前序遍历:先输出父节点,再遍历左子树和右子树中序遍历:先遍历左子树,再输出父节点,再遍历右子树后序遍历:先遍历左子树,再遍历右子树,最后输出原创 2021-04-18 12:54:18 · 741 阅读 · 2 评论 -
<java>java 中 “==” 和 equals 的区别
在初学Java时,可能会经常碰到下面的代码:1 String str1 = new String("hello");2 String str2 = new String("hello");3 4 System.out.println(str1==str2);5 System.out.println(str1.equals(str2));为什么第4行和第5行的输出结果不一样?== 和equals方法之间的区别是什么?如果在初学Java的时候这个问题不弄清楚,就会导致自己在以后编转载 2021-04-17 08:56:16 · 66 阅读 · 0 评论 -
<LeetCode>剑指 Offer 22. 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.用两个指针,第一个指针先走k-1步,然后再两个指针一起走,这样就保证了第二个指针与第一个指针距离相差k-1,当第一个指针到达链表.原创 2021-04-03 16:23:13 · 122 阅读 · 0 评论 -
<LeetCode>剑指 Offer 18. 删除链表的节点(java实现)
剑指 Offer 18. 删除链表的节点给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题目中提到了给的是单向链表的头指针头指针与头结点的区别:头指针头结点头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可以存放链表的长度)头指针具有标志作用,所以常用头指针冠以链表的名字有了头结点,对在第一元素结点前插入结点和删原创 2021-04-11 17:44:19 · 84 阅读 · 0 评论 -
<数据结构>链表的增删改------java实现
1、定义结点Node这里结点的数据域是(int,String,String)下一节点next统一初始化为null并且提供一个有参构造函数public Node(int no,String name,String nickName)为了方便实例输出,还重写了方法toString()class Node{ //数据域 int no; String name; String nickName; //下一节点 Node next=null; //原创 2021-04-11 17:13:50 · 154 阅读 · 0 评论 -
<LeetCode>两数之和、数组中的重复数字、替换空格
两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。class Solution{ //两个指针,一个指针由前向后遍历,原创 2021-04-09 10:43:19 · 339 阅读 · 0 评论 -
<Java>抽象类
定义一个抽象类Person,其中含有一个抽象方法getDescription().public abstract class Person { public abstract String getDescription(); //抽象方法,继承的子类需要实现 private String name; public Person(String aName) { this.name=aName; } public String getName() { return name;原创 2021-04-06 15:40:54 · 420 阅读 · 0 评论 -
<Java>类对象的方法调用
假设要调用x.f(args),x是类C的一个对象,那么调用过程如下:编译器查看对象的声明类型和方法名。假设调用x.f(args),且隐式参数x声明为C类的对象。如果存在重载方法,例如f(int)和f(String),那么编译器会一一列举所有C类中名为f的方法和其超类中访问属性为public的方法(private属性无法访问)。至此,编译器已获得所有可能被调用的候选方法。接下来,编译器将查看调用方法时提供的参数列表,若存在一个与提供的参数列表完全匹配的方法,则调用此方法,这个过程称为重载解析。原创 2021-04-06 14:35:51 · 764 阅读 · 0 评论