Java基础
文章平均质量分 76
Splaying
Studying
展开
-
Class类入门
1. Class类简介Java反射的源头是一个Class类,每一个类在内存中都有且只有一个Class对象。java源文件经过编译后生成一个.class字节码文件,然后JVM虚拟机运行时是去加载.class字节码文件。JVM加载时会为每一个类创建一个Class类型的对象(Class本身也是一个类),一个Class对象包含了特定的某个结构(类 / 接口 / 枚举 / 注解 / 基础数据类型 / 空类型 / 数组 …)的有关信息。Class本身也是一个类Class对象只能由系统建立对象一个原创 2021-04-11 10:15:11 · 158 阅读 · 0 评论 -
类加载与初始化内存分析
1. 类加载步骤类加载到内存中一个完整的生命周期总共有五大步骤(七小步骤):加载、链接、初始化、使用、卸载。其中链接部分又分为三小步骤(验证、准备、解析)。下面主要分析加载、链接与初始化。加载:将.class字节码文件内容加载到内存中,并且将这些静态数据转换成方法区的运行时数据结构,然后在堆中生成一个代表这个类的java.lang.Class对象。链接:将Java类的二进制代码何必管道JVM的运行状态之中的过程。验证: 确保加载的类信息符合JVM规范,没有安全方面的问题。准备:正原创 2021-04-11 12:17:40 · 123 阅读 · 0 评论 -
volatile关键字
1. 简介为了保证线程的安全性问题,Java语言提供了两种关键字volatile 和 synchronized关键字。volatile关键字保证:可见性,有序性(禁止指令重排序)。可以synchronized关键字保证:可见性,原子性,有序性。其中volatile并没有解决原子性的问题,对于一些原子操作volatile修饰的变量还是无法保证线程的安全性问题,这时就必须使用synchronized关键字或者其他同步手段。2. 可见性先来看一下多线程的工作模型,线程工作时每个线程都有原创 2021-03-27 11:18:11 · 762 阅读 · 0 评论 -
一生产者多消费者模型 / 多生产者一消费者模型
1. 异常问题(wait问题)wait中断:在调用处立即中断并且释放锁,该线程转入等待队列。当收到持有同一把锁的线程notify通知后进入锁池队列,再次获得同步锁之后才会继续执行。这里的继续执行是从上次中断处继续向下执行。package 多线程核心.生产者与消费者问题.一生产多消费操作栈假死与异常;import java.util.ArrayList;class MyService{ private ArrayList list = new ArrayList(); synchr原创 2021-04-01 18:32:52 · 724 阅读 · 0 评论 -
Java初识并发
1. 信息共享多线程中最重要的一点就是并发问题,但是对于刚开始学的时候并不是很清楚并发到底是用来解决什么问题的。很难去想到一个合理的例子表达出并发的想要解决的问题。粗粒度:子线程和子线程之间以及main线程之间缺乏信息交流细粒度:线程之间有信息交流通讯,线程之间有数据的共享交流。假设现在一共有100张票要售出,现在有四个售票点一起卖这100张票,那么首先要明确这四个售票点一共只能卖100张,不能多卖但是可以少卖。关于继承Thread类的信息共享问题,继承Thread类的子类在实现多线程信息共原创 2020-10-17 11:52:10 · 84 阅读 · 0 评论 -
synchronized的可重入锁
1. synchronized锁重入锁重入的概念:在使用synchronized时,当一个线程得到一个对象锁后再次请求此对象锁时是可以得到该对象锁的。即在一个synchronized方法/块的内部调用本类的其他synchronized方法/块时,是永远可以继续得到锁的(死递归会异常)。class Service { synchronized public void service1(){ System.out.println(Thread.currentThread().get原创 2021-03-20 15:23:48 · 1596 阅读 · 0 评论 -
多线程的中断方法
1. 无法停止的线程interrupt方法 “停止线程” ,这个方法其实是一个伪停止,并不是像break那样直接跳出去就完事了,它仅仅是给当前线程中做了一个停止的标记并不是真正停止线程。/* 1. interrupt方法并不会中断当前正在运行的线程。 2. 只是在这个线程状态上打上中断标记。 3. interrupt会抛出InterruptedException异常。 */class MyThread extends Thread{ @Override原创 2021-03-20 15:09:37 · 628 阅读 · 0 评论 -
synchronized方法和代码块
同步由于多线程并发存在数据不安全问题,为了保证数据的安全性需要一些特殊的手段来维持。数据不安全主要是针对修改来说的,如果一个数据只能读不能修改几乎不会产生什么安全问题。只有修改数据的时候容易产生一些差错导致多线程并发造成数据不安全。从操作系统的角度来看多线程访问临界资源时并且对临界资源做一定的修改就会产生错误,操作系统为了保证临界资源的安全性,保证每次访问临界资源的线程有且只有一个。多线程访问时会进入等待队列依次排队等待。Java多线程并发出现数据不安全问题的原因也大致相同,因为某些操作不是原原创 2020-10-23 23:02:21 · 2472 阅读 · 0 评论 -
Java多线程死锁
1. 死锁的概念死锁:多个线程各自占有一些共享资源,并且相互等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形。某一个同步块同时拥有两个以上对象的锁时就可能会发生死锁的问题。简单点说就是多个线程相互抱着对方需要的资源形成僵持状态例如有小明,小王两个小孩去拿玩具枪和玩具车两个玩具,小明先拿到了玩具车,小王拿到了玩具枪,并且双方都想获得对方的玩具,而且都不愿意先放弃自己手中当前的玩具(没有信任),这样就会形成一个僵持,都想获得对方的资源。class Car原创 2020-10-25 17:45:10 · 147 阅读 · 0 评论 -
Java多线程基础
1. 概念进程:进程是系统分配资源的最小单位,可以简单地认为一个进程就是一个运行的程序,任务管理器中的每一个在运行的任务都是一个进程。线程:线程是进程调度的最小单元,每一个进程至少有一个线程,也可以一个进程有多个线程。多进程:操作系统同时运行多个任务,但是感官上并没有中断的效果,实际上操作系统还是将时间划分为若干个时间段(非常短),每个时间段执行不同的任务。单核CPU的情况下每个任务按照串行的方式交替执行,多核CPU的情况下多进程可以采用并行的方式同时执行。多线程:由于多进程管理方式太过于笨重让CP原创 2020-10-16 13:47:47 · 105 阅读 · 0 评论 -
Java线程状态
1. 线程状态创建状态:当用new操作符创建一个线程时, 例如new Thread(),线程还没有开始运行,此时线程处在初始(新建)状态。就绪状态:也叫可运行状态,当前线程创建完毕通过start方法启动线程后,线程状态就由创建状态转为就绪状态了。但是当前线程不一定处于run方法,在操作系统的层面说当前线程已经获得了除CPU以外的所有资源。运行状态:当处在就绪状态的线程获得了CPU的使用时间,那么当前线程就从就绪状态转为运行状态,开始执行run方法体。阻塞状态:处于运行状态的线程突然被原创 2020-10-20 22:59:07 · 173 阅读 · 0 评论 -
多线程的脏读问题
脏读脏读:多个线程共享资源调,一些线程还在进行写入修改操作,而另外一些线程读取到了尚未写入完成可能进行事务回滚的数据。class User { private String username = "A"; private String password = "AA"; synchronized public void setValue(String use, String pwd){ try { //可能会进行事务的回滚,即写入数据不成功还是原来的原创 2021-03-20 15:50:23 · 670 阅读 · 0 评论 -
wait方法 与 notify方法
1. 线程状态图这是线程的7状态模型图,常见的7大状态之间的转换关系也在上面。多线程之间的通信主要用到4个方法,wait()、wait(long time)、notify()、notifyAll(),其他方法在多线程基础中都有介绍。wait():作用是使当前线程从调用处中断并且释放锁转入等待队列,直到收到notify或者notifyAll的通知才能从等待队列转入锁池队列,没有收到停止会一直死等。wait(long time):相比wait多了一个等待的时间time,如果经过time(毫秒)时原创 2021-03-31 16:57:17 · 12749 阅读 · 2 评论 -
PTA (统计文字中的单词数量并按出现次数排序)
现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。注1:单词之间以空格(1个或多个空格)为间隔。注2:忽略空行或者空格行。基本版:统计时,区分字母大小写,且不删除指定标点符号。进阶版:统计前,需要从文字中删除指定标点符号!.,?????。 注意:所谓的删除,就是用1个空格替换掉相应字符。统计单词时需要忽略单词的大小写。输入说明若干行英文,最后以!!!为结束。输出说明单词数量出现次数排名前10的单词(次数按照降序排序,如果次数相同,则按照键值的字母升序排序)及原创 2020-10-26 22:44:08 · 2175 阅读 · 0 评论 -
PTA (简单图书查询应用)
简单图书查询应用。先定义Book类,Book类中包含 属性 int price, String name; 方法 setPrice(int c) int getPrice() public void setName(String n) public String getName(), 构建图书表如下:名称,价格 “Java基础教程”, 29 “XML基础教程”, 21 “JSP基础教程”,22 “C++基础教程”,29 “J2ME编程”, 34 “操作系统”, 32 “数据库技术”,29 现输入,一新原创 2020-10-21 21:52:56 · 397 阅读 · 0 评论 -
PTA (统计文字中的单词数量并按出现次数排序)
现在需要统计若干段文字(英文)中的单词数量,并且还需统计每个单词出现的次数。注1:单词之间以空格(1个或多个空格)为间隔。注2:忽略空行或者空格行。基本版:统计时,区分字母大小写,且不删除指定标点符号。进阶版:统计前,需要从文字中删除指定标点符号! . , : * ?,注意:所谓的删除,就是用1个空格替换掉相应字符。统计单词时需要忽略单词的大小写。输入说明若干行英文,最后以!!!为结束。输出说明单词数量出现次数排名前10的单词(次数按照降序排序,如果次数相同,则按照键值的字母升序排序原创 2020-10-29 22:37:35 · 2392 阅读 · 0 评论 -
PTA (找到共同的选修课)
每个同学喜欢的编程语言各不相同,请编程找出大家都喜欢的一门编程语言。输入格式:输入的第一行是记录的个数第一行之后为每个同学的编程语言记录,姓名与编程语言直接使用英文冒号分开,编程语言之间使用空格分开。输出格式:输出为共同喜欢的编程语言(如果结果为空,则输出 none )。输入样例:3gcs:java js phpcxy:js python c++sds:c++ c js输出样例:js字符串必须按照行读入,但是读入的时候需要注意当输入学生个数之后的换行会被当做第一个字符串。原创 2020-10-25 19:48:18 · 1685 阅读 · 2 评论 -
PTA (jmu-Java-02基本语法-08-ArrayList入门)
jmu-Java-02基本语法-08-ArrayList入门本习题主要用于练习如何使用ArrayList来替换数组。新建1个ArrayList strList用来存放字符串,然后进行如下操作。提示:查询Jdk文档中的ArrayList。注意:请使用System.out.println(strList)输出列表元素。输入格式输入n个字符串,放入strList。直到输入为!!end!!时,结束输入。在strList头部新增一个begin,尾部新增一个end。输出列表元素输入:字符串str判原创 2020-10-21 20:53:32 · 1228 阅读 · 0 评论 -
jmu-Java-05集合(泛型) GeneralStack
以前定义的IntegerStack接口,只能用于存放Integer类型的数据。然而对于栈来说,不管内部存放的是什么类型的数据,基本操作与元素的具体类型无关。1. 编写一个通用的GeneralStack接口,接口中的操作对任何引用类型的数据都适用。一旦定义完毕,只能存放一种类型的数据,比如只能存放String或只能存放Integer。GeneralStack接口方法如下:push(item); //如item为null,则不入栈直接返回null。pop();原创 2020-10-24 21:33:46 · 720 阅读 · 0 评论 -
PTA (利用集合类排序)
利用集合类排序借助集合类对输入的n个字符串按照字典序排序。输入格式:共有若干行,每行一个字符串,最后一行总是"###"。输出格式:按字典序排序好的用空格分隔的一行字符串。输入样例:bbbaaaababaaaacabc输出样例:在这里给出相应的输出。例如:aaa aaaa abab bbb cabc思路直接建立一个TreeSet容器或者建立一个String数组然后排序输出也可以,按照字典序升序输出。简单点就是TreeSet做法比较快import java.util.I.原创 2020-10-21 21:57:49 · 240 阅读 · 0 评论 -
PTA (面向对象进阶--02-接口-Comparator)
Arrays.sort可以对所有实现Comparable的对象进行排序。但如果有多种排序需求,如有时候需对name进行降序排序,有时候只需要对年龄进行排序。使用Comparable无法满足这样的需求。可以编写不同的Comparator来满足多样的排序需求。1.编写PersonSortable2类属性:private name(String)、private age(int)有参构造函数:参数为name,agetoString方法:返回格式name-age2.编写Comparator类编写Name原创 2020-10-29 20:11:30 · 430 阅读 · 0 评论 -
PTA (统计一段文字中的单词个数并按单词的字母顺序排序后输出)
统计一段文字中的单词个数并按单词的字母顺序排序后输出现需要统计若干段文字(英文)中的不同单词数量。如果不同的单词数量不超过10个,则将所有单词输出(按字母顺序),否则输出前10个单词。注1:单词之间以空格(1个或多个空格)为间隔。注2:忽略空行或者空格行。注3:单词大小写敏感,即’word’与’WORD’是两个不同的单词 。输入说明若干行英文,最后以 !!! 为结束。输出说明不同单词数量。 然后输出前10个单词(按字母顺序),如果所有单词不超过10个,则将所有的单词输出。输入样例F原创 2020-10-22 22:56:20 · 2550 阅读 · 0 评论 -
PTA (office文档页码打印)
在office软件(word,excel)中,有时只需要打印整个文档中的一部分,就需要用户选择需要打印的页码范围。目前输入的页码范围格式定义为:以逗号分割,可以使用-表示连续页码。例如:1,3,5-9,20。表示需要打印的页码为1,3,5,6,7,8,9,20。本题目要求读入一行字符串,作为需要打印的页码范围。需要注意以下几点:1、页码范围输入可以不按顺序。例如:5,3,7,9-10,1-2;2、连续的页码定义也可能不会按照由小到大的顺序输入。例如:1,9,5,20-15,10;3、输入原创 2020-10-25 19:32:29 · 790 阅读 · 0 评论 -
PTA (ArrayListIntegerStack)
jmu-Java-05集合-01-ArrayListIntegerStack定义IntegerStack接口,该接口描述了一个存放Integer的栈的常见方法:public Integer push(Integer item); //如item为null,则不入栈直接返回null。否则直接入栈,然后返回item。public Integer pop(); //出栈,如栈为空,则返回null。public Integer peek(); //获得栈原创 2020-10-21 21:53:20 · 261 阅读 · 0 评论 -
PTA (JAVA-求整数序列中出现次数最多的数)
JAVA-求整数序列中出现次数最多的数要求统计一个整型序列中出现次数最多的整数及其出现次数。输入格式:在一行中给出序列中整数个数N(0<N≤1000),依次给出N个整数,每个整数占一行。输出格式:在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。输入样例:在这里给出一组输入。例如:103 2 -1 5 3 4 3 0 3 2输出样例:在这里给出相应的输出。例如:3 4这道题只需要建立一个HashMap<Integer,Int原创 2020-10-21 22:06:22 · 2650 阅读 · 2 评论 -
PTA (学生成绩读取与排序)
从键盘录入多行学生成绩的信息,每行表示一个学生的一门课的成绩,最后一行以“exit”结束。每行文本的格式为:学号,姓名,课程名,成绩。程序能够读取学生及其成绩,将具有相同学号的学生及其成绩读取到一个Student(学生类)类对象的列表(List)stuList中; 2)程序在读取完学生及其成绩的数据后,能够将stuList中的学生按照平均成绩降序排列(如果平均成绩相同,学号数字小的排在前面), 并输出排序后的学生学号、姓名和成绩。输入格式:多行表示的学生成绩,每一行是一个学生的姓名、学号、课程名、成绩(原创 2020-10-28 22:22:07 · 3436 阅读 · 0 评论 -
PTA (特立独行的幸福)
7-12 特立独行的幸福 (25分)对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的原创 2020-10-22 23:05:34 · 1666 阅读 · 0 评论 -
PTA (Java字符串集合求并集)
从键盘接收N个英文字符串(其中不同的字符串数量大于10),从头开始取5个不同的字符串放入一个集合S1,然后接着取5个不同的字符串放入另一个集合S2,按照字母顺序输出S1和S2的并集中的每个字符串(字符串区分大小写)输入格式:一行以空格分开的英文字符串(不同的字符串数量大于10)。输出格式:按照字母顺序(先比较字符串首字母,首字母相同的比较字符串第二个字母,以此类推)输出的S1和S2并集的字符串。输入样例:android python java javaee javase database jav原创 2020-10-25 19:39:02 · 660 阅读 · 0 评论 -
DataInputStream 和 DataOutputStream流
1. 简介DataInputStream 和 DataOutputStream流是基于 InputStream流 和 OutputStream流衍生出的子类,当然他们还基于父类DataInput 和 DataOutput。它们是针对Java基本数据类型读取/写入操作的。这两个类读写的文件都是针对机器的,DataOutputStream写出去的数据不是给人看的是给机器看的。而DataInputStream只能读取DataOutputStream写出去的文件。使用DataOutputStream流写入t原创 2021-03-22 12:50:32 · 2480 阅读 · 0 评论 -
PrintStream 和 PrintWriter打印流
1. 简介PrintWriter 和 PrintStream两个打印流,打印流简单点说就是像输出在Console中一样,只不过现在是输出到文件中。PrintStream是字节打印流,以字节的形式将数据写入到文件中。PrintWriter是字符打印流,以字符的形式将数据写入到文件中。两者的具体用法几乎没差别,仁者见仁智者见智。2. PrintStream字节打印流构造方法比较多,可以以自己想要的方式,指定是否行刷新,字符集,是选择文件还是路径构造,一把来说都会使用指定字符集的,指原创 2021-03-27 20:03:36 · 420 阅读 · 0 评论 -
InputStreamReader 和 OutputStreamReader流
1. 简介1. 常见的编码格式ASCII码:由一个字节表示,只支持一些基础字符和数字以及一些键盘上的符号…UTF8: 万国码,支持所有国家的语言文字。针对Unicode码表的可变长字符编码,一般采用2个左右的字节表示一个字符。GB2312: 是一种常见的简体中文编码,采用1个或2个字节表示一个字符。GBK: 简体中文,对GB2312的扩充。2. 字符流的父类(抽象类)Reader字符输入流类,Writer字符输出流类。...原创 2021-03-24 23:28:48 · 685 阅读 · 0 评论 -
ObjectInputStream 和 ObjectOutStream流
1. 简介对象流:ObjectInputStream 和 ObjectOutStream,DataInputStream/DataOutputStream流只是解决了Java8种基础数据类型的流,而对象流不仅仅有读写Java的8种基础数据类型还可以将一个实例化的对象写入磁盘。序列化:将一个实例化对象写入磁盘叫做序列化。反序列化:将一个写入磁盘的的实例化读取出来转化为一个对象叫做反序列化。需要序列化的对象类一定要实现Serializable接口。2. 序列化(ObjectOutpu原创 2021-03-23 15:14:24 · 2846 阅读 · 1 评论 -
BufferedReader 和 BufferedWriter流
1. 简介BufferedReader 和 BufferedWriter流是一个字符缓冲流,用来加快读取速度的。以减少访问磁盘的次数。详解请参考字节缓冲流 点击这里相对于基础的InputStreamReader和OutputStreamWriter流加入了缓冲区,并且加入了一些新的方法,可以按行读取,按行写入…2. BufferedReader流有两个构造方法,第一个构造方法是传入一个字符流的实现类,此时默认的缓冲区大小是8KB,第二个构造方法是传入一个字符流的实现类并且制定缓冲区大小。根据需求原创 2021-03-26 14:25:28 · 1799 阅读 · 0 评论 -
File类
1. File类简介File类是Java提供的一种针对文件 / 文件夹进行操作的IO流;主要用于文件和目录的创建、文件的查找和文件的删除等;操作的文件是磁盘中真是存在的文件。构造方法,File提供了四种构造方法。//通过给定的父抽象路径名 和 子路径名字符串创建一个新的File实例。File(File parent, String child);//通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。File(String pathname) //根据 parent 路原创 2021-03-28 22:27:10 · 66 阅读 · 0 评论 -
Propreties类
1. 基础介绍Properties是一个文件配置集合类,但是它常常用来加载一些配置文件因此也经常和IO流混在一起使用。Properties类继承了Hashtable<Object,Object>类,并且内部存取键值对也是用的HashTable实现的,也是一个线程安全的类。实现Serializable接口,虽然实现了序列化接口但是它的key - value方法都只是支持String -> String的一个键值对,可能实现序列化接口的用途在于使用序列化版本号来做唯一标识;原创 2021-03-29 23:03:42 · 245 阅读 · 0 评论 -
FileInputStream 和 FileOutStream流
FileInputStream流简介:FileInputStream实现类继承自抽象父类InputStream类,是一个基于字节输入流的类。利用FileInputStream类可以从硬盘文件中读取数据到内存中供程序使用。如果所填路径下文件不存在会爆出文件找不到异常。1. 三种构造方法常用的构造方法是第一种和第三种。//通过打开与实际文件的连接创建一个FileInputStream ,该文件由文件系统中的File对象fileFileInputStream(File file)File file =原创 2021-03-21 20:06:53 · 1183 阅读 · 2 评论 -
BufferedInputStream 和 BufferedOutputStream流
1. 简介BufferedInputStream / BufferedOutputStream流字节缓冲流,字节缓冲流通常需要配合InputStream / OutputStream类衍生出的字节流类使用,这两个流是用来加快读取/写入速度的。具体的功能就是下图蓝色圈指出的。说白了就是减少内存和外部磁盘的交互次数。而是否使用字节数组一次性读取多个字节是红色框指出的。说白了就是减少程序频繁去内存中读取数据。2. BufferedInputStream字节输入缓冲流1. 两种构造方法//原创 2021-03-21 23:52:27 · 846 阅读 · 0 评论 -
I/O流基础知识
1. I/O流简介IO流:I的全称是Input,O的全称是Output。表示读取,流可以看做是程序传输数据的通道。作用:解决程序请求资源,输出资源的问题。特性:流是一个管道,该管道具有先进先出的特性,最先写入的数据最先被读取到;并且必须顺序读取。每一种流不能同时肩负输入,输出两种功能。必须单一的是输入流或者输出流。2. 流的分类按照流向分类,可以分为输出流和输出流。1.1、输入流:从本地文件,网络资源等中获取资源到我们的程序中1.2、输出流:从我们的程序中输出一些资原创 2021-03-21 17:53:40 · 2068 阅读 · 0 评论 -
Lambda表达式
1. Lambda表达式介绍简介:Lambda 表达式是 JDK8 的一个新特性,可以避免匿名内部类定义过多,极大地优化代码结构写出更优雅的 Java 代码。JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效。函数式接口:理解函数式接口是学习Lambda表达式的关键,对于任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。对于函数式接口我们就可以通过Lambda表达式来创建该接口的对象。//无参无返回函数interface Lambda{原创 2020-10-17 21:30:04 · 101 阅读 · 1 评论 -
Java异常
概念异常:所谓异常就是程序运行时可能出现的一些错误,比如试图打开一个根本不存在的文件等,异常处理将会改变程序的控制流程,让程序有机会对错误做出处理。原创 2020-09-28 22:37:51 · 213 阅读 · 0 评论