• [技术干货] 40个问题让你快速掌握Java多线程的精髓(2)
    Q: 上题的suspend和resume可以怎么替换,来解决死锁问题?A: 可以用wait和noitfy来处理(不过尽量不要这样设计,一般都是用run内部带1个while循环的)public class Test {    public static Object lockObject = new Object(); //拿来做临时锁对象    public static void main(String[] args) throws InterruptedException {         Thread thread = new MyThread();        thread.start();        Thread.sleep(1000);         System.out.println("主线程试图占用lockObject锁资源");        synchronized (Test.lockObject) {            // 用Test.lockObject做一些事            System.out.println("做一些事");        }        System.out.println("恢复");         synchronized (Test.lockObject) {            Test.lockObject.notify();        }     }} class MyThread extends Thread {    public void run() {        try {            synchronized (Test.lockObject) {                System.out.println("占用Test.lockObject");                Test.lockObject.wait();            }            System.out.println("MyThread释放TestlockObject锁资源");        }        catch (Exception e){}    }}如此执行,结果正常:Q: 下面这例子为什么会运行异常,抛出IllegalMonitorStateException错误?    public static void main(String[] args) throws InterruptedException {        Thread thread = new MyThread();        thread.start();        thread.notify();    }A: notify和wait的使用前提是必须持有这个对象的锁, 即main代码块 需要先持有thread对象的锁,才能使用notify去唤醒(wait同理)。改成下面就行了:        Thread thread = new MyThread();        thread.start();        synchronized (thread) {            thread.notify();        }Q: Thread.sleep()和Object.wait()的区别A:sleep不会释放对象锁, 而wait会释放对象锁。Q:Runnable接口和Callable的区别。A: Callable可以和Futrue配合,并且启动线程时用的时call,能够拿到线程结束后的返回值,call方法还能抛出异常。Q:thread.alive()表示线程当前是否处于活跃/可用状态。活跃状态: 线程已经启动且尚未终止。线程处于正在运行或准备开始运行的状态,就认为线程是“存活的thread.start()后,是否alive()一定返回true?public class Main {    public static void main(String[] args) {        TestThread tt = new TestThread();        System.out.println("Begin == " + tt.isAlive());        tt.start();        System.out.println("end == " + tt.isAlive());    }}A:不一定,有可能在打印时,线程已经运行结束了,或者start后,还未真正启动起来(就是还没进入到run中)Q: 线程A如下:public class A extends Thread {    @Override    public void run() {        System.out.println("this.isAlive()=" + this.isAlive());    }}把线程A作为构造参数,传给线程BA a = new A();Thread b = new Thread(a);b.start()此时会打印什么?A:此时会打印false!因为把a作为构造参数传入b中, b执行start时, 实际上是在B线程中去调用了 A对象的run方法,而不是启用了A线程。如果改成A a = new A();a.start()那么就会打印true了Q:把FutureTask放进Thread中,并start后,会正常执行callable里的内容吗?public static void main(String[] args) throws Exception {    Callable<Integer> callable = () -> {    System.out.println("call 100");    return 100;    };     FutureTask<Integer> task = new FutureTask<>(callable);    Thread thread = new Thread(task);    thread.start();}A:能正常打印
  • [技术干货] 40个问题让你快速掌握Java多线程的精髓(1)
    多线程可以理解为在同一个程序中能够同时运行多个不同的线程来执行不同的任务,这些线程可以同时利用CPU的多个核心运行。多线程编程能够最大限度的利用CPU的资源。本文将通过以下几个方向为大家讲解多线程的用法。1.Thread类基础2.synchronized关键字3.其他的同步工具CountDownLatchFutureTaskSemaphoreCyclicBarrierExchanger原子类AtomicXXX4.线程池5.Thread状态转换6.Volatile7.线程群组一、Thread类基础Q: Thread的deprecated过期方法是哪3个?作用是啥A:stop(), 终止线程的执行。suspend(), 暂停线程执行。resume(), 恢复线程执行。Q: 废弃stop的原因是啥?A:调用stop时,会直接终止线程并释放线程上已锁定的锁,线程内部无法感知,并且不会做线程内的catch操作!即线程内部不会处理stop后的烂摊子。如果其他线程等在等着上面的锁去取数据, 那么拿到的可能是1个半成品。变成题目的话应该是下面这样,问会输出什么?public class Test {     public static void main(String[] args) throws InterruptedException {         System.out.println("start");        Thread thread = new MyThread();        thread.start();        Thread.sleep(1000);        thread.stop();        // thread.interrupt();     }} class MyThread extends Thread {    public void run() {        try {            System.out.println("run");            Thread.sleep(5000);        } catch (Exception e) {            //处理烂摊子,清理资源            System.out.println("clear resource!");        }    }}Q: stop的替代方法是什么?A: interrupt()。调用thread.interrupt()终止时, 不会直接释放锁,可通过调用interrupt()或者捕捉sleep产生的中断异常,来判断是否被终止,并处理烂摊子。上题把thread.stop()改成thread.interrupt(),在Thread.sleep()过程中就会抛出interrupException(注意,InterrupExcetpion是sleep抛出的)因此就会输出clear resource。如果没有做sleep操作, 可以用isInterrupted()来判断自己这个线程是否被终止了,来做清理。另外注意一下interrupt和isInterrupted的区别:Q: suspend/resume的废弃原因是什么?A: :调用suspend不会释放锁。如果线程A暂停后,他的resume是由线程B来调用的,但是线程B又依赖A里的某个锁,那么就死锁了。例如下面这个例子,就要知道会引发死锁:public class Test {    public static Object lockObject = new Object();    public static void main(String[] args) throws InterruptedException {         System.out.println("start");        Thread thread = new MyThread();        thread.start();        Thread.sleep(1000);         System.out.println("主线程试图占用lockObject锁资源");        synchronized (Test.lockObject) {            // 用Test.lockObject做一些事            System.out.println("做一些事");        }        System.out.println("恢复");        thread.resume();     }} class MyThread extends Thread {    public void run() {        try {            synchronized (Test.lockObject) {                System.out.println("占用Test.lockObject");                suspend();            }            System.out.println("MyThread释放TestlockObject锁资源");        }        catch (Exception e){}    }}答案输出MyThread内部暂停后,外部的main因为没法拿到锁,所以无法执行后面的resume操作。
  • 10个问题让你快速避开java中的jdbc常见坑
    Connection.setAutoCommit(boolean)用于事务提交。setAutoCommit(true), 则执行的所有sql执行都会作为单个事务直接提交并运行setAutoCommit(false), 则必须等调用conn.commit()才会提交运行Q: setAutoCommit默认是true还是falseA: 默认是true。Q: setAutoCommit(true)的缺点是什么?A: 如果一次性执行多个sql语句, 中间sql出错时,就会造成脏数据。Q: setAutoCommit(false)后,如果出了错却没有在catch中进行Connection的rollBack操作,会发生什么?A; 操作的表就会被锁住,造成数据库死锁fetchSizefetchSize 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数fetchSize越 大, 客户端内存占用越 大,读取数据库次数越 少,速度越 快。Q: Oracle和Mysql中的fetchSize有什么区别?A: Oracle会每次网络传输fetchSize条数据到客户端, MYSQL则会一次性全部传送到客户端,因此Mysql中的fetchSize是一种模拟游标。PreparedStatementQ:相比Statement的好处?A:PreparedStatement是预编译的,比Statement速度快,执行效率高,因此即使sql中不带参数也最好使用PreparedStatement代码的可读性和可维护性更好(相比于sql拼接)PreparedStatement可以防止SQL注入攻击,而Statement却不能Q:prepareStatement是statement接口的实现吗?A:prepareStatement不是实现,而是继承的接口CallableStatementCallableStatement继承自PreparedStatementCallableStatement接口添加了 调用存储过程 核函数以及处理输出参数(INOUT)的方法。即存储过程就用CallableStatementConnection Pool连接池优点:减少连接创建次数更快的系统整体响应速度统一连接管理,减少失误性的连接未关闭。ResultSet作用: 缓存数据结果集Statement st = conn. createStatement (int resultSetType, int resultSetConcurrency) ResultSet rs = st.executeQuery(sqlStr)滚动,就是指调用.next()或者.previous()或者移动到对应行resultSetType 是设置 ResultSet 对象的类型可滚动,或者是不可滚动。取值如下(见单词知意):ResultSet.TYPE_FORWARD_ONLY 只能向前滚动ResultSet.TYPE_SCROLL_INSENSITIVE, 支持前后滚动,对修改不敏感ResultSet.TYPE_SCROLL_SENSITIVE 支持前后滚动,对修改敏感resultSetConcurency 是设置 ResultSet 对象能够修改的,取值如下:ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。Q:Connection、statement、ResultSet的关闭顺序是?A:先ResultSet、再Statement、最后再connection。因为这种操作很麻烦,最好使用jdbc连接池,或者try-with-resource数据库知识Q:事务的ACID属性是什么?A:A是 atomicity原子性, 事务内的行为一次性执行完,要么就回退C是consistency一致性 有a+b=c的限制条件,然后a变化的同时,b也必须跟着变化I是isolation隔离性 事务隔离,即事务的中间执行过程,对另外一个事务不可见。D是durability持久性 提交i成功后,修改不会改变,也会被记录。Q: 脏读、不可重复读和幻读是什么?A:脏读:数据被更新了,但是还没提交, 然后另一个事务读到了更新后的数据,结果事务回滚了,导致读的数据其实是脏数据,不可重复读: 1个事务要读2次数据(注意是单条数据),结果第一次读和第二次读数据不一致了。幻读: 1个事务读了2次 数据,发现2次的记录数不一致(注意事项记录数)————————————————
  • 10个问题让你快速避开java中的jdbc常见坑
    Connection.setAutoCommit(boolean)用于事务提交。setAutoCommit(true), 则执行的所有sql执行都会作为单个事务直接提交并运行setAutoCommit(false), 则必须等调用conn.commit()才会提交运行Q: setAutoCommit默认是true还是falseA: 默认是true。Q: setAutoCommit(true)的缺点是什么?A: 如果一次性执行多个sql语句, 中间sql出错时,就会造成脏数据。Q: setAutoCommit(false)后,如果出了错却没有在catch中进行Connection的rollBack操作,会发生什么?A; 操作的表就会被锁住,造成数据库死锁fetchSizefetchSize 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数fetchSize越 大, 客户端内存占用越 大,读取数据库次数越 少,速度越 快。Q: Oracle和Mysql中的fetchSize有什么区别?A: Oracle会每次网络传输fetchSize条数据到客户端, MYSQL则会一次性全部传送到客户端,因此Mysql中的fetchSize是一种模拟游标。PreparedStatementQ:相比Statement的好处?A:PreparedStatement是预编译的,比Statement速度快,执行效率高,因此即使sql中不带参数也最好使用PreparedStatement代码的可读性和可维护性更好(相比于sql拼接)PreparedStatement可以防止SQL注入攻击,而Statement却不能Q:prepareStatement是statement接口的实现吗?A:prepareStatement不是实现,而是继承的接口CallableStatementCallableStatement继承自PreparedStatementCallableStatement接口添加了 调用存储过程 核函数以及处理输出参数(INOUT)的方法。即存储过程就用CallableStatementConnection Pool连接池优点:减少连接创建次数更快的系统整体响应速度统一连接管理,减少失误性的连接未关闭。ResultSet作用: 缓存数据结果集Statement st = conn. createStatement (int resultSetType, int resultSetConcurrency) ResultSet rs = st.executeQuery(sqlStr)滚动,就是指调用.next()或者.previous()或者移动到对应行resultSetType 是设置 ResultSet 对象的类型可滚动,或者是不可滚动。取值如下(见单词知意):ResultSet.TYPE_FORWARD_ONLY 只能向前滚动ResultSet.TYPE_SCROLL_INSENSITIVE, 支持前后滚动,对修改不敏感ResultSet.TYPE_SCROLL_SENSITIVE 支持前后滚动,对修改敏感resultSetConcurency 是设置 ResultSet 对象能够修改的,取值如下:ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。Q:Connection、statement、ResultSet的关闭顺序是?A:先ResultSet、再Statement、最后再connection。因为这种操作很麻烦,最好使用jdbc连接池,或者try-with-resource数据库知识Q:事务的ACID属性是什么?A:A是 atomicity原子性, 事务内的行为一次性执行完,要么就回退C是consistency一致性 有a+b=c的限制条件,然后a变化的同时,b也必须跟着变化I是isolation隔离性 事务隔离,即事务的中间执行过程,对另外一个事务不可见。D是durability持久性 提交i成功后,修改不会改变,也会被记录。Q: 脏读、不可重复读和幻读是什么?A:脏读:数据被更新了,但是还没提交, 然后另一个事务读到了更新后的数据,结果事务回滚了,导致读的数据其实是脏数据,不可重复读: 1个事务要读2次数据(注意是单条数据),结果第一次读和第二次读数据不一致了。幻读: 1个事务读了2次 数据,发现2次的记录数不一致(注意事项记录数)部分参考资料https://blog.csdn.net/u011543448/article/details/79441066
  • Java静态代码检查工具 CodePecker
    CodePecker1、 完全自主知识产权,全部由国内信息安全技术人员研发,避免了外国同类产品的安全隐患。目前本产品已获得软件注册权登记证书6项,分别是《JAVA/JSP语言Codepecker源代码分析软件V1.0》(软著登字第0670475号)、《C/C++语言Codepecker源代码缺陷分析系统V1.0》(软著登字第1090327号)、《Python语言Codepecker源代码缺陷分析系统V1.0》(软著登字第1050911号)、《Python语言Codepecker源代码缺陷分析系统V2.0》(软著登字第1090900号)、《PHP语言Codepecker源代码缺陷分析系统V1.0》(软著登字第1031250号)、《PHP语言Codepecker源代码缺陷分析系统V2.0》(软著登字第1090899号)。2、 界面友好:CodePecker采用全中文界面,全程中文界面支持,无论是操作界面、支持的文件目录类型,还是输出的报告均为中文,大大提升了国内用户的使用方便程度,从而大幅提升了工作效率。而国外同类产品都是英文的,只能输出英文的报告,有些中文目录也无法支持。CodePecker在使用过程中,操作简单易用,不需要复杂的检测流程,检测结果简单明了,并有详细的缺陷分析,同时提供了缺陷分析的追踪定位,用户只需要简单的鼠标操作,就能够对缺陷传播定位。同时鉴于开发人员对信息安全知识的了解,在缺陷类型中会有详细的缺陷点评,即使开发人员不熟悉此缺陷类型,通过缺陷点评,也能迅速的了解掌握此类缺陷。3、实现了云计算平台(http://wwww.cloudcp.cn),CodePecker产品目前已经将云计算的理念很好的融合进来,可以实现云计算平台下运行。整个软件的操作界面可以实现Web方式,用户可以通过网页进行操作,B/S的方式可以将操作系统的影响降到最低,只要有一台可以上网的电脑和浏览器,无论什么操作系统都可以使用CodePecker远程进行源代码扫描,不会因为测试人员或是开发人员的电脑配置影响扫描速度,扫描的速度完全取决于主机的性能。而国外产品主要还是单机软件,虽然目前也在不断地向SaaS的方向进行过渡,但还没有成熟的产品或服务推向市场。4、符合国际标准,支持检测多种缺陷和质量类型:CodePecker团队成员有着多年的源码安全检测经验,依靠业内知名专业的安全团队的研究,CodePecker漏洞知识库已包含多种语言多达数百条缺陷类型,每条漏洞都有详尽的描述和修补建议,同时积极与国际化接轨,大部分缺陷类型都可以映射到CVE和OWASP等权威国际安全组织公布的缺陷分类中。缺陷类型涵盖了常见操作系统、数据库、Web工程和应用程序的绝大多数可以远程利用的漏洞以及本地安全漏洞。缺陷检测覆盖常见的多种语言、多种缺陷类别,包括跨站注入、Sql注入、拒绝服务等高危缺陷漏洞类型,也包括空指针引用,资源为释放、变量未初始化等代码质量缺陷类型。从多个维度全面覆盖代码安全问题,并积极更新最新研究结果和关注国内外最新安全研究动态,同步更新研究成果,保证缺陷知识库内容的覆盖广度和深度。5、高效快速的缺陷分析:通过优化的数据流分析技术、缺陷类型的智能识别、检测规则依赖关系等源码扫描技术的运用,再加上安全团队根据多年的源码检测经验和国内外安全信息缺陷结果,以及完善的缺陷检测规则,CodePecker缺陷检测软件在源码检测速度和检测结果的准确性做到了一个很好的平衡,既保证了检测的速度,又保证了缺陷检测的质量。6、低误报率和漏报率:采用业内领先的深度缺陷扫描分析技术,CodePecker软件对同样的目标系统进行检测时,能提供过程内(Intra-procedure)、过程间(Inter-procedure)等各种层次的分析,全面深入地开展缺陷检测,全面降低了检测结果中的误报率和漏报率,检测精度、准度高。7、可自定义的缺陷类型检测规则:系统本身提供了25个大类,169种的缺陷类型检测,用户可以根据具体的需求对被检测代码做一个全量分析,也可以根据业务需求,针对自己系统关心的缺陷进行定制检测。如在大型应用系统中,存在各系统中,存在各种级别的缺陷类型,检测结果可能偏多,会干扰错误排查,用户可只针对高危或者某几类类缺陷做有针对性的深度检测,只关注特定的缺陷类型,从而达到检测效果。
  • [技术干货] java设计模式--模板模式
    有些时候我们做某几件事情的步骤都差不多,仅有那么一小点的不同,在软件开发的世界里同样如此,如果我们都将这些步骤都一一做的话,费时费力不讨好。所以我们可以将这些步骤分解、封装起来,然后利用继承的方式来继承即可,当然不同的可以自己重写实现嘛!这就是模板方法模式提供的解决方案。所谓模板方法模式就是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板方法模式就是基于继承的代码复用技术的。在模板方法模式中,我们可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中。也就是说我们需要声明一个抽象的父类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法让子类来实现剩余的逻辑,不同的子类可以以不同的方式来实现这些逻辑。所以模板方法的模板其实就是一个普通的方法,只不过这个方法是将算法实现的步骤封装起来的。模板方法模式包含如下角色:AbstractClass: 抽象类 ConcreteClass: 具体子类
  • [技术干货] java设计模式--访问者模式
    访问者模式俗称23大设计模式中最难的一个。除了结构复杂外,理解也比较难。在我们软件开发中我们可能会对同一个对象有不同的处理,如果我们都做分别的处理,将会产生灾难性的错误。对于这种问题,访问者模式提供了比较好的解决方案。访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式。同时我们还需要明确一点那就是访问者模式是适用于那些数据结构比较稳定的,因为他是将数据的操作与数据结构进行分离了,如果某个系统的数据结构相对稳定,但是操作算法易于变化的话,就比较适用适用访问者模式,因为访问者模式使得算法操作的增加变得比较简单了。访问者模式包含如下角色:Vistor: 抽象访问者ConcreteVisitor: 具体访问者Element: 抽象元素ConcreteElement: 具体元素 ObjectStructure: 对象结构
  • [技术干货] java设计模式---代理模式
    代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。代理模式包含如下角色: Subject: 抽象主题角色 Proxy: 代理主题角色 RealSubject: 真实主题角色
  • [行业动态] 【4月7日 AI 快讯】所有判决被推翻,美最高法院:Java版权世纪大案,谷歌战胜甲骨文
    产业五大关键因素激发平台IT架构潜能数字化转型、平台化IT架构、数据中台等概念,早已成为各行各业热议的焦点话题。利用数字化平台在企业的IT架构之上,实现高效协作和业务敏捷,是每个企业数字化转型的根本诉求。然而,在具体实践中,每家企业对数字化应用、平台和IT架构也都有不同的认识。2021/04/06 18:25原文链接为什么信不过AI看病?数据集小、可靠性差,AI医疗任重道远解决了这些难题,正确、值得信赖的 AI 医疗诊断或许才能实现。2021/04/06 14:39原文链接阿联酋起源人工智能研究院(IIAI)诚邀优秀人才加盟起源人工智能研究院 (IIAI, Inception Institute of Artificial Intelligence)于阿联酋首都阿布扎比成立, 并迅速成为中东地区领先的AI机构2021/04/06 10:54原文链接OpenAI CEO:AI将产生足够财富,每年支付每个成年人13500美元最近,OpenAI公开的让人印象最为深刻的技术当属每天喷出4亿个单词、效果十分出色的文本生成器GPT-3。在OpenAI的工作每天都在提醒负责人Sam Altman,社会经济变化的幅度比大多数人认为的要快得多。2021/04/06 10:30原文链接入门279位嘉宾、19个论坛议程全公开,第五届未来医疗100强大会亮点抢先看!2021年4月16日-18日,第五届未来医疗100强大会将以“生命的计算”为主题,在苏州吴江与大家会面。2021/04/06 14:44原文链接模型鲁棒性好不好,复旦大学一键式评测平台告诉你选择封面 复旦大学自然语言处理实验室发布模型鲁棒性评测平台 TextFlint。2021/04/06 14:43原文链接新晋图灵奖得主Jeff Ullman受质疑,反对者:他享受了不该享受的荣誉他写出了传世的经典教材「龙书」,却因为出格的言论招来了争议。2021/04/06 14:37原文链接所有判决被推翻,美最高法院:Java版权世纪大案,谷歌战胜甲骨文甲骨文起诉谷歌侵犯版权,曾在联邦巡回上诉法院两次赢得了诉讼。但最终,美国最高法院推翻了此前的一系列裁决。2021/04/06 14:34原文链接其他标贝科技推出智能语音开放平台 提供语音合成与语音识别开发者可以在平台操作界面创建多个智能语音应用2021-04-06 16:09:53原文链接Keras将死于谷歌之手?reddit网友写“送葬文”,引发热议6岁的Keras经历了什么?2021-04-06 13:12:25原文链接只要你一句话,马斯克就得留扫把头,项目已开源丨Adobe等出品一句话就能P图2021-04-06 12:55:08原文链接谷歌甲骨文Java专利大战终审判决:安卓使用Java不构成侵权Android对甲骨文Java API的有限复制构成合理使用。2021-04-06 12:54:45原文链接学会扶墙的机器人:没有什么能让我倒下扶稳墙,摔不倒2021-04-06 12:51:19原文链接AI前线马斯克的SpaceX 星链网速破200Mbps,月收费99美元所有测试都是在 Apple iPad Mini 上进行的,可参考 4G 网络的下行速率基本可以达到 100Mbps~150Mbps2021-04-06 14:55原文链接
  • [技术干货] 用java写Student类的功能
    1)编写一个Java程序片断,以定义一个表示学生的类Student。这个类的属性有“学号”、“班号”、“姓名”、“性别”、“年龄”,方法有“获得学号”、“获得班号”、“获得性别”、“获得姓名”、“获得年龄”。2)为类Student增加一个方法public String toString( ),该方法把Student类的对象的所有属性信息组合成一个字符串以便输出显示。编写一个Java Application程序,创建Student类的对象,并验证新增加的功能。 package xin;import java.util.Scanner;public class Student {    int number;    String classnumber;    int age;    String name;    String sex;       Student(int x,String y,int z,String p){    number = x;    classnumber = y;    age = z;    name = p;    }     int getNumber() {    return number;  //返回学号    }     String getSClassnumber() {    return classnumber;  //返回班号    }     int getAge() {    return age;     //返回年龄    }     String getName() {    return name;    //返回姓名     }     String getSex() {    return sex;   //返回性别     }    public String toString() {       return "学号:"+number+" 班号:"+classnumber+" 姓名:"+name+" 性别:"+sex+" 年龄:"+age;    }   public static void main(String args[]) {   boolean boo,a;   int number1,age1;   String classnumber1,st;   String name1,sex1;   Student stu = new Student(1,"s",1,"xaio");   Scanner reader = new Scanner(System.in);   System.out.println("请输入学号、班号、姓名、性别、年龄:");   stu.number = reader.nextInt();   stu.classnumber = reader.next();   stu.name = reader.next();   stu.sex = reader.next();   stu.age = reader.nextInt();   st = stu.toString();   System.out.println(st);   System.out.println("是否修改该学生信息?");   System.out.println("如果修改则输入true,反之false");    a = reader.nextBoolean();    if(a) {   System.out.println("请输入学号、班号、姓名、性别、年龄:");   number1 = reader.nextInt();   classnumber1 = reader.next();   name1 = reader.next();   sex1 = reader.next();   age1 = reader.nextInt();       System.out.println("学号:"+number1+" 班号:"+classnumber1+     " 姓名:"+name1+" 性别:"+sex1+" 年龄:"+age1);   }   else   {System.out.println("继续执行下一步");}      System.out.println("输入true继续,false退出");        boo = reader.nextBoolean();     System.out.println("*********************");      if(boo) {      main(args);   //函数调用      }      else      System.out.println("程序无法执行!!!!");   }}
  • [技术干货] Java程序员都要懂得知识点:原始数据类型(2)
    § 字符串Q: StringBuffer和StringBuilder的区别:A:StringBuffer是线程安全的,但是慢StringBuilder是线程不安全的(即可以多个线程同时读取他的内容),但是快。Q:String s = “123”+“456”+“789”;对于这种静态的拼接,用StringBuffer去拼接比用String去拼接要快,对吗?A:错,反编译代码后,我们发现代码是String s = “123456789”;因为对于静态字符串的连接操作,Java在编译时会进行彻底的优化,将多个连接操作的字符串在编译时合成一个单独的长字符串。因此要注意StringBuffer/Builder的适用场合: for循环中大量拼接字符串。如果是静态的编译器就能感知到的拼接,不要盲目地去使用StirngBuffer/BuilderPS:如果是字符串变量相加,会优化成StringBuilder做append如果是常量字符串相加, 则会直接拼接具体可以查看这篇博文,里面有展示这2 种情况的字节码。https://blog.csdn.net/weixin_34405557/article/details/89630362?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_paramQ:下面输出什么结果?为什么?String s1 = "Hello";String s2 = "Hello";String s3 = "Hel" + "lo";String s4 = "Hel" + new String("lo");String s5 = new String("Hello");String s6 = s5.intern();String s7 = "H";String s8 = "ello";String s9 = s7 + s8; System.out.println(s1 == s2);  // trueSystem.out.println(s1 == s3);  // trueSystem.out.println(s1 == s4);  // falseSystem.out.println(s4 == s5);  // falseSystem.out.println(s1 == s6);  // trueSystem.out.println(s1 == s9);  // falseQ:println(s1 == s2)输出 trueprintln(s1 == s3)输出 trueprintln(s1 == s4)输出 falseprintln(s4 == s5)输出 falseprintln(s1 == s6)输出 trueprintln(s1 == s9)输出 false字符串的==操作比较的是引用地址。如果是直接写死在代码里的常量字符串,则地址是固定的,都在常量池中。写死的常量字符串拼接,依旧会作为常量放**量池中。(常量池就是指,程序编译的时候,就已经知道了这个字符串)如果是String类型的,则引用地址是堆中的string对象地址,而非常量池中地址。(因为程序编译的时候,string里的内容不一定是确定的,因此不可能会放到常量池中)因此涉及string拼接的,都是和原先常量不等。s7和s8已经属于string对象,所以二者不属于常量拼接。intern会试图把字符串放**量池。具体原因可见:https://www.cnblogs.com/syp172654682/p/8082625.html§ 可变参数Q: 方法重载时,如何选择可变参数和固定参数?像下面输出啥: public static void main(String[] args) {        f(1);    }     public static void f(int ...a){        System.out.println("可变参数方法:"+Arrays.toString(a));    }     public static void f(int a){        System.out.println("固定长度 参数方法:"+a);    }A:输出固定长度参数方法。原则:如果重载方法中,固定参数方法能满足,优先用固定参数方法,不满足时再去选择可变参数方法。
  • [技术干货] Java程序员都要懂得知识点:原始数据类型(1)
    java原始数据类型有short、byte、int、long、boolean、char、float、double。原始数据是未处理的或简化的数据,它构成了物理存在的数据,原始数据具有多种存在形式,例如文本数据、图像数据、音频数据或几种类型数据的混合。以为关于Java原始数据类型的相关知识点总结。Q:java中数据类型大小会和平台是32位、64位相关吗?A:不相关,虚拟机原因平台兼容Q:java中解析数据时,需要考虑处理器的大小端问题吗?(即0x1234的12是放在高地址还是低地址)A:不需要。java由于虚拟机的关系,屏蔽了大小端问题,需要知道的话可用 ByteOrder.nativeOrder() 查询。在操作ByteBuffer中,也可以使用 ByteBuffer.order() 进行设置:。Q:java中short、int 、long的字节分别是多少?A:2、4、8Q: float、double是多少字节?A:4、8Q: java中byte、char是多少字节?C++中char是多少字节?A : java中是1和2, C++中char是1Q: java中boolean类型的大小?A: bool类型无空间大小(来自java编程思想)根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html官方文档的描述:boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its “size” isn’t something that’s precisely defined.布尔类型:布尔数据类型只有两个可能的值:真和假。使用此数据类型为跟踪真/假条件的简单标记。这种数据类型就表示这一点信息,但是它的“大小”并不是精确定义的。贴一下书中关于数据类型的描述:Q: 不可变类型有哪几种?A: short、int、long、float、double、byte、char、boolean的 包装类型, 以及String,这9种属于不可变类型。(这只是部分,还有其他的不可变类)不可变类型概念:里面的值的内容变了,对应的内存地址也会变化。Q:类里的成员如果是基本数据类型, 那么会自动初始化吗?初始化成什么?A: 会, 初始化为0或者false。Q: java中局部变量没初始化,会报错吗?A: 会Q: 布尔类型可以强制转化成其他类型吗?A : 不能。 boolean b = 1或者boolean b = “true” 是不可以的Q: 什么时候不能隐式转化?A: 如果会丢失精度,则不能隐式转化,比如long转int或者double转long这种。 编译器会强制我们使用强制转化Q: 8种原始数据类型的类型优先级排序是?A:(byte/short/char)<int<long<float<double即隐式转换都是从低往高转。Q:下面哪个是错误的?A:B选项是错误的。因为2个byte类型变量相加的时候,会自动转换成int类型,右边的int类型赋值给short类型便会报错。(好冷的知识)Q:float f = 1.1;有错吗?A:float浮点后面要加f。加f就代表是float类型,否则就是double类型浮点。float f = 1.1f;double d1 = 1.1;Q: 布尔类型可以做加减乘除吗?A : 不能Q: Integer N = 0; int n = N; 这时候会发生什么?A: 自动拆包Q:整型包装类型的比较,下面输出啥?Integer num1 = 128,num2 = 128;System.out.println(num1==num2);A:输出false。值的范围在-128~127的时候Integer可以直接用==比较大小,但是超出这个范围时,==就不管用了,要用equals。大致原因是在那个范围,Integer的对象会直接用缓存对象,所以地址都相同。不在那个范围,Integer对象会新生成1个对象,所以地址不同。另一个注意点: “==” 对于对象来说,比较的是地址。Q: java中哪2个类可以支持任意精度的整数 和任意精度的浮点数?A: BigInteger和BigDecimal这2个也属于不可变类。Q: java的数组一定需要我们手动初始化吗?A: 不需要,数组元素会自动初始化为null或者0或者false。Q:java支持C++里的运算符重载吗?A: 不支持Q: if(a=b) 可以吗?A: 不行,不能在条件表达式中放入赋值操作。除非a和b都是boolean类型。Q:浮点数相等的比较方式A:相等的话要像下面这样if(Math.abs(a-b))<1E-6F)如果用浮点的a==b或者a!=b做while循环退出判断,可能会导致死循环Q:下面的数组声明哪几个是对的?A. char[] chr1 = new char[]{‘A’,‘B’,‘C’};B. char[] chr2 = new char[3]{‘A’,‘B’,‘C’};C. char[][] chr3 = new char[][10];D. char[][] chr4 = new char[10][];E. char[] chr5 = new char[3];A:ADE是对的。
  • 哪位大佬能指导我一下怎么用这个cliudide写Java代码?自己的电脑由于某些原因无法下载软件,想通过这个上面的来进行操作
  • [二次开发] 使用flink连接kafka生产消费数据,运行FlinkKafkaJavaExample.jar代码,消费不了数据,报错
    【功能模块】【操作步骤&问题现象】1、运行样例代码FlinkKafkaJavaExample.jar代码,生产者可以生产数据,但是消费者不能消费数据,运行消费者命令会报错,如附件所示:2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [问题求助] java api demo 创建设备后,奇怪消失
    【功能模块】idea环境下运行CreateDeviceByAK【操作步骤&问题现象】1、创建设备 在第一张图 test_deviceName8 成功创建2、控制台重新登录后,test_deviceName8 消失,下图3、很奇怪。运行CreateDevice结果相同。【截图信息】【日志信息】(可选,上传日志内容或者附件)
总条数:2294 到第 页
上滑加载中