- 博客(116)
- 资源 (3)
- 收藏
- 关注
原创 Java基础知识总结(84)
如果Lambda 表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现 所有的抽象方法即可;Lambda 表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部 类的成员变量(包括实例变量和类变量)。匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法;Lambda 表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认 方法。
2024-05-05 23:01:36 424
原创 Java基础知识总结(83)
用@FunctionalInterface注解标注,接口可以包含多个默认方法、类方法,私有方法。Lambda 表达式只能实现一个方法,因此它只能为 只有一个抽象方法的接口(函数式接口)创建对象。形参列表:Java编译器可以自动推断参数类型,因此可以省略参数的数据类型,其次,如果参数列表只有1个参数时,小括号可以省略。List<String> list = List.of("张麻子","师爷","黄老爷");//如果注解中有且只有一个注解,并且属性名称叫做value,使用注解是可以不写属性名称的。
2024-05-05 23:01:03 758
原创 Java基础知识总结(82)
ConcurrentHashMap中的一个段称为Segment,Segment继承了ReentrantLock,所以一个段又是一个ReentrantLock。JDK 1.7的ConcurrentHashMap的锁机制基于粒度更小的分段锁,分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,分段锁技术将Key分成一个一个小Segment存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。
2024-04-30 23:28:48 154 1
原创 Java基础知识总结(81)
和非线程安全的ArrayList很像,其核心方法是,add()、set()、remove()等方法,CopyOnWriteArrayList是线程安全的,由于要操作整个数组,开销比较大,在操作数组的过程中,其数组长度通常保持的很小,不会出现较大的扩容,添加一个元素就新数组长度就增加1,只读操作多于可变操作。不直接在原有内存块上进行写操作,而是将内存复制一份,在新的内存中进行写操作,写完之后,再将原来的指针(或者引用)指向新的内存,原来的内存被回收。开销较小,不需要在内核态和用户态之间的。
2024-04-30 23:27:44 241
原创 Java基础知识总结(80)
AQS是CLH队列的一个变种,主要原理和CLH队列差不多,AQS队列内部维护的是一个FIFO的双向链表,这种结构的特点是每个数据结构都有两个指针,分别指向直接的前驱节点和直接的后继节点。当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点。添加完成后,自旋获取前一个节点的状态,判断前一个节点有没有释放锁,没有释放继续获取,获取到则执行同步代码块,获取不到该线程则处于死锁状态。4、头节点线程完成任务后,释放了同步状态,然后会唤醒它的后继节点,同时后继节点的线程被唤醒后还需要检查自己的前驱节点是不是头节点。
2024-04-29 21:53:38 523 1
原创 Java基础知识总结(79)
CONDITION(-2):waitStatus为-2时,表示该线程在条件队列中阻塞(主要在Condition中使用),表示节点在等待队列中,当持有锁的线程调用了CONDITION的signal()方法之后,节点会从该CONDITION的等待队列转移到该锁的同步队列上,去竞争锁(注意:这里的同步队列就是我们讲的AQS维护的FIFO队列,等待队列则是每个CONDITION关联的队列)。每个节点与等待线程关联,每个节点维护一个状态waitStatus,waitStatus的各种值以常量的形式进行定义。
2024-04-29 21:53:03 459
原创 Java基础知识总结(78)
1. 进入synchronized块的内存语义是把在synchronized块内使用到的变量从线程的工作内存中清除,这样在synchronized块内使用到该变量时就不会从线程的工作内存中获取,而是直接从主内存中获取。如果当前线程已经拥有该monitor,只是重新进入,则进入monitor的进入数加1,所以synchronized关键字实现的锁是可重入的锁。如果monitor的进入数为0,则该线程可以进入monitor,并将monitor进入数设置为1,该线程即为monitor的拥有者。
2024-04-28 23:05:59 498 1
原创 Java基础知识总结(77)
如一个变量被volatile修饰后,表示当一个线程修改共享变量后,其会立即被更新到主内存中,其他线程读取共享变量时,会直接从主内存中读取。修饰的方法叫做同步方法,修饰的代码块叫做同步代码块,被synchronized修饰的方法或则代码,也叫做临界区,临界区的特点在同一时刻有且只能有一个线程访问。然而,JMM 这样的规定可能会导致线程对共享变量的修改没有即时更新到主内存,或者线程没能够及时将共享变量的最新值同步到工作内存中,从而使得线程在使用共享变量的值时,该值并不是最新的。所有的共享变量都存储于主内存。
2024-04-28 23:04:58 744 1
原创 Java基础知识总结(76)
1. interrupt()是实例方法,用于为正在运行的线程添加中断标记,当线程正在运行时,该方法并不会影响线程的运行,如果线程处于WAITING或者TIMED_WAITING状态时,调用该方法时,线程会抛出中断异常。2. interrupted()是类方法,用于检测线程是否有中断标记,如果线程有中断标记,调用该方法时会清除标记,清除标记后再次调用该方法会返回false,除非再次为线程添加中断标记。//中断线程 并消除中断标记 如果线程有标记返回ture 没有标记返回false。//线程wait()
2024-04-27 23:25:28 714
原创 Java基础知识总结(75)
Thread类提供了setPriority(int newPriority)、getPriority()方法来设置和返回指定线程的优先级,其中setPriority()方法的参数可以是一个整数,范围是1~10之间,也可以使用Thread类的如下3个静态常量。每个线程执行时都具有一定的优先级,优先级高的线程获得较多的执行机会,而优先级低的线程则获得较少的执行机会。每个线程默认的优先级都与创建它的父线程的优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级。
2024-04-27 23:24:31 594 1
原创 Java基础知识总结(74)
2、被Thread.sleep()、LockSupport.park()方法所阻塞的线程有一个特点,当被阻塞线程的Thread.interrupt()方法调用时,被阻塞线程的中断标志将被设置,该线程将被唤醒。yield()只是让当前线程暂停一下,让系统的线程调度器重新调度一次,线程调度器会从线程就绪队列里获取一个线程优先级高的线程,当然完全可能的情况是:当某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行。
2024-04-25 23:30:47 463
原创 Java基础知识总结(73)
static void sleep(long millis,int nanos):让当前正在执行的线程暂停millis毫秒加nanos毫微秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度与准确度的影响。当前线程调用 sleep()方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()中的线程也不会执行,因此sleep()方法常用来暂停程序的执行。//此时只有main线程运行 调用sleep()休眠的是mian线程。
2024-04-25 23:29:34 651
原创 Java基础知识总结(72)
守护线程创建的线程也是守护线程。在守护线程中创建的线程,新的线程都是守护线程。如果T2线程执行过程中调用为了T1线程的join(long millis)方法,T2线程最多等待T1线程millis毫秒,到达时间后,如果T1线程没有结束,则和T2线程交替执行。join()方法相当于插入,例如在T2线程中调用了线程T1.join()方法,则T2线程会一直等待T1线程执行结束后再继续执行。在后台运行的,并为其他的线程提供服务的线程被称为“后台线程”,又称为“守护线程”,JVM的垃圾回收线程就是典型的后台线程。
2024-04-23 23:27:56 425
原创 Java基础知识总结(71)
注意:不要对处于死亡状态的线程调用start()方法,程序只能对新建状态的线程调用start()方法,对新建状态的线程两次调用start()方法也是错误的。System.out.println("线程的状态:"+t.getState());System.out.println("线程的状态:"+t.getState());System.out.println("线程的状态:"+t.getState());System.out.println("线程抛出异常后:"+t.isAlive());
2024-04-23 23:27:13 426
原创 Java基础知识总结(70)
/只关乎在运行过程中的取消状态,参数决定cancel执行与否,与返回值无关。//为了让线程thread1尽快执行,让主线程休眠2秒。//为了让线程thread1尽快执行,让主线程休眠2秒。//为了让线程thread1尽快执行,让主线程休眠2秒。* 线程在等待其他线程释放锁时,会处于该状态。//线程执行之后取消 无法取消 返回false。//继承Callable接口,并实现call()方法。//线程执行过程中返回false。//线程执行前 返回false。//线程执行之后 返回true。
2024-04-22 20:22:42 409 1
原创 Java基础知识总结(69)
当一个程序进入内存运行时,即变成一个进程,堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源。因为Runnable接口中没有start()方法,因此启动线程时,必须将继承了Runnable接口的类的对象通过Thread类的构造进行包装,然后调用Thread#start()方法启动线程。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。* 任务被中断,被取消,或者发生异常,都会返回true。
2024-04-22 20:21:29 365
原创 Java基础知识总结(68)
如果对象流中的对象和新类中包含同名的实例变量,而实例变量类型不同,则反序列化失败,类定义应该更新serialVersionUID类变量的值。如果对象流中的对象比新类中包含更多的实例变量,则多出的实例变量值被忽略,序列化版本可以兼容,类定义可以不更新serialVersionUID的值。如果需要让某个对象支持序列化机制,则必须让它的类是可序列化的(继承serializable接口,该接口是一个标记接口,实现该接口无须实现任何方法,它只是表明该类的实例是可序列化的)//反序列化student对象。
2024-04-21 17:47:44 524
原创 Java基础知识总结(67)
int read(char[]cbuf,int off,int len):从输入流中最多读取len个字符的数据,并将其存储在字符数组cbuf中,放入数组cbuf中时,并不是从数组起点开始,而是从off位置开始,返回实际读取的字符数。int read(char[]cbuf):从输入流中最多读取cbuf.length个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数。int read():从输入流中读取单个字符,返回所读取的字符数据(字符数据可直接转换为int类型)。
2024-04-21 17:45:11 336
原创 Java基础知识总结(66)
null && files.length > 0) { //遍历路径和文件列对象 for (File file : files) { //判断是否是文件 if (file.isFile()) { //调用方法写入 filenames.add(file.getAbsolutePath());i++) { //将数据写入 os.write(files.get(i).getBytes());
2024-04-20 20:47:20 409
原创 Java基础知识总结(65)
输入和输出都涉及到方向的问题,这里的输入和输出都是从程序运行所在的内存角度划分的,也就是说从硬盘或者网络读取到程序运行内存中的流叫做输入流,反之从内存中写入硬盘的流则叫做输出流,换句话说,输入流和输出流都是以当前程序运行的内存作为参照物。Java中I/O流是实现输入/输出的基础,可以方便的实现输入和输出操作,Java中把不同的输入/输出源抽象表述为“流”,通过流的方式运行Java程序使用相同的方式来访问不同的输入/输出源,这里的流可以理解为字节序列,
2024-04-20 20:46:27 339
原创 Java基础知识总结(64)
今天主要学习了I/O流,重点为字节流的输入输出,练习了常用的方法。//如果是路径,需要继续递归调用方法并传递文件对象参数继续遍历输出文件和路径。System.out.println("共用时"+(end-start)/1000+"秒");//append:是指是否在原有内容后追加,默认为FALSE。//append参数为true:在原有内容后追加。//append参数为true:在原有内容后追加。//File对象的索引子文件和路径。//如果文件不存在,则自动创建。//如果文件不存在,则自动创建。
2024-04-19 23:44:24 430
原创 Java基础知识总结(63)
输入和输出都涉及到方向的问题,这里的输入和输出都是从程序运行所在的内存角度划分的,也就是说从硬盘或者网络读取到程序运行内存中的流叫做输入流,反之从内存中写入硬盘的流则叫做输出流,换句话说,输入流和输出流都是以当前程序运行的内存作为参照物。Java中I/O流是实现输入/输出的基础,可以方便的实现输入和输出操作,Java中把不同的输入/输出源抽象表述为“流”,通过流的方式运行Java程序使用相同的方式来访问不同的输入/输出源,这里的流可以理解为字节序列,输出流只能向其写入数据,而不能从中读取数据。
2024-04-19 23:43:12 308
原创 Java基础知识总结(62)
Exception:程序中出现的非正常情况,其中异常又分为两类,RuntimeException(运行时异常)和CheckedException(检查时异常),这两类异常都是Exception的子类,其中RuntimeException及其子类不需要开发者显示处理。Error:和虚拟机有关的问题,如系统崩溃、虚拟机错误等,这些错误无法恢复或者不可能被抓取,将导致应用程序中断,应用程序通常无法处理这些错误,因此不应该用异常处理方法来处理Error。//该方法抛出的是检查时异常,要求开发者显示处理。
2024-04-18 23:40:09 451
原创 Java基础知识总结(61)
允许程序在创建集合时指定集合元素的类型(允许程序在创建对象或者调用方法时动态的指定),所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参将在声明变量、创建对象、调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。//编译错误 add()方法有参数类型E作为集合的元素类型,所以传给add的参数必须是E类对象或者其子类的对象,但是在上例中不知道E是什么类型,所以无法将任何对象添加进集合。* 允许在定义接口、类时声明类型形参、类型形参在整个接口、类中当成类型使用。
2024-04-18 23:38:39 550
原创 Java基础知识总结(60)
Map.Entry lastEntry()∶ 返回该 Map 中最大 key 所对应的 key-value 对,如果该 Map为空或不存在这样的 key-value 对,则都返回 null。//返回该 Map 中位于key 前一位的 key-value 对(即小于指定key 的最大 key 所对应的 key-value 对)。//返回该 Map 中位于key 后一位的 key-value 对(即大于指定key 的最小 key 所对应的 key-value 对)。如果该 Map 为空,则返回 null。
2024-04-17 23:29:47 623
原创 Java基础知识总结(58)
/如果该位置处是树 else if (e instanceof TreeNode) ((TreeNode<K,V>)e).split(this, newTab, j, oldCap);//计算扩容阈值 newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);//如果这个位置上只是一个Node,没有链表 if (e.next == null)
2024-04-17 05:49:38 370
原创 Java基础知识总结(57)
if ((p = tab[i = (n - 1) & hash]) == null)//判断tab[i]是否有元素 //如果没有元素则直接存放 tab[i] = newNode(hash, key, value, null);//如果key不相等,判断哈希表已有的节点是不是红黑树 else if (p instanceof TreeNode) //如果是红黑树则以树的方式插入元素 e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
2024-04-17 05:41:56 436
原创 Java基础知识总结(56)
System.out.println(map.containsValue("田福军"));System.out.println("键值对的数量:"+map.size());System.out.println("所有的value值"+s);System.out.println("键值对的数量:"+map.size());System.out.println("键值对的数量:"+map.size());//在这里进行了自动装箱 map.put(2,"孙玉厚");//清空map map.clear();
2024-04-15 23:21:23 475
原创 Java基础知识总结(55)
并不是取出最先进入队列的元素,而是取出队列中最小的元素,从这个意义上来看,PriorityQueue已经违反了队列先进先出的规则。队列的头部保存在队列中存放时间最长的元素,队列的尾部保存在队列中存放时间最短的元素。
2024-04-15 23:16:37 463
原创 Java基础知识总结(54)
else{ //实例化新节点 Node newNode = new Node(last,o,null);//实例化新节点 per指向索引节点的前置节点,next指向索引节点的后置节点。//将索引节点的前置节点指向索引节点的后置节点。
2024-04-14 23:05:49 432
原创 Java基础知识总结(52)
/ 对拼接结果使用intern,则会将对象放置在常量池中,如果已经存在,则返回已经存在的对象地址,Java1.6是将字面值放置在常量池中,Java1.7是将引用地址放置在常量池中。(8)Math工具类 Math提供了基本的加减乘除以为,还提供了一些复杂的数学运行,三角函数,对数运算等,Math类还提供了两个常量PI和E。nextXxx():获取下个输入项,输入项可以是基本类型数据,如果是字符串则直接使用next()如果再有变量引用该字符串时,直接返回常量池中字符串的引用,而不创建对象。
2024-04-13 22:55:05 432
原创 Java基础知识总结(52)
/ StringBuilder replace(int start , int end , String str)将当前字符串中start到end之间的内容全部用str的内容替换;//replace(String string) 返回一个新的字符串,它是通过用 `newChar` 替换此字符串中出现的所有 `oldChar` 得到的。// StringBuilder delete(int start ,int end)将当前字符串中从start(包含)开始到end(不包含)之间的内容移除;
2024-04-13 22:54:27 390
原创 Java基础知识总结(51)
(6)枚举类: 在特定情况下,一个类的对象是有限且固定的,这种实例有限且固定的类,Java中称为枚举类。枚举类和普通类的差异: 1、枚举类可以实现一个或多个接口,使用 enum 定义的枚举类默认继承了java.lang.Enum 类,而不是默认继承 Object 类,因此枚举类不能显式继承其他父类。} public void test() { //内部类中可访问外部类的私有成员 System.out.println("外部类的私有变量:"+age);但外部类不能访问内部类的实现细节,例如内部类的成员变量。
2024-04-12 19:59:52 505
原创 Java基础知识总结(50)
(3)关于环境变量配置的问题 配置环境变量path时,变量值应为JDK安装路径下的bin目录 存放JDK核心代码的是lib目录 (4)this关键字需要注意的点 在构造方法中可以通过this关键字来调用有参构造方法 (5)super关键字需要注意的点 super关键字用来访问父类内容时,在子类成员方法中,访问父类的成员变量,在子类的成员方法中,访问父类的成员方法,在子类的构造方法中,访问父类的构造方法。short(2字节):-2^15~2^15-1。byte(1字节):-2^7~2^7-1。
2024-04-12 19:57:31 629
原创 Java基础知识总结(49)
(2)成员变量 成员变量包括类变量(用static修饰的变量)和实例变量(不用static修饰的变量) 一个类在使用之前要经过类加载、类验证、类准备、类解析、类初始化等几个阶段 类变量: 类变量在类准备阶段起开始存在,直到系统完全销毁这个类。实例变量属于对象,通过对象.实例变量类当用,当然类变量也可以使用对象.类变量来访问。但是需要注意的是,通过对象.实例变量调用实例变量的过程中,该实例变量仍然属于类,而不属于当前的对象 如: package cn.bytecollege.variable;
2024-04-10 22:51:38 399
原创 Java基础知识总结(48)
当把一个子类对象直接赋值给父类引用变量时,当运行时调用该变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就是相同类型的变量、调用同一个方法是呈现出多种不同的行为特征,这就是多态。传递性∶ 对任意x,y,z,如果x.equals(y)返回 ture,y.equals(z)返回 true,则x.equals(z)一定返回 true。Java中创建对象时,有两种类型,等号左边的编译时类型,等号右边叫做运行时类型,当编译时类型和运行时类型不一致时,就会产生多态。
2024-04-10 22:49:09 696
原创 Java基础知识总结(47)
studentArray[i] = new Student("周八",18,'男',"13830521813","陕西省西安市雁塔区", "2510188091@qq.com");
2024-04-09 23:10:08 371
原创 Java基础知识总结(46)
4、在同一个类中,实例方法可以调用类方法,因为类方法的初始化在实例方法的初始化之前,实例方法被调用时,内部类已经被加载了。//方法调用结束后 JVM中change方法栈帧被回收,打印对象的age变量,此时age变量的值已被改变。//实例化cat对象 JVM会在堆内存中为Cat类实例化的对象分配内存,并将对象的地址存储在栈内存中。2、不用static修饰的方法叫做实例方法,实例方法属于对象,调用方法时必须先创建对象,对象.方法名。2、this可以在方法中访问调用类中的其他实例方法,this可以省略。
2024-04-09 23:01:39 526
Java基础笔记-8-23
2023-12-10
Java基础笔记-8-19
2023-12-10
Java基础笔记-8-16
2023-12-10
Java基础笔记-8-15
2023-12-10
Java基础笔记-8-5
2023-12-10
Java基础笔记-8-4
2023-12-10
年会必备节目清单 《敬业阵线联盟》 网页版播放器
2023-12-08
基于Jetty+Servlet+Jsp+MySQL+MyBatis技术实现的简单博客系统
2023-10-19
node-v14.17.1-win-x64
2023-08-02
基于asp.net技术 学生留言板的设计与实现
2022-05-20
基于ASP.NET的电商系统的设计与实现
2022-05-20
基于在线WebApi资源调用的Web前端应用《天气易搜》
2022-04-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人