哪能刷java题_牛客网刷题(纯java题型 1~30题)

8c07384c9fb0bef2122d9b662136d4b9.png

应该是先extend,然后implement

class test extends A implements B {

public static void main(String[] args) {

}

}

复制代码

999b41e9b9a2544b1dc8f28081ebebb9.png

java中四类八种基本数据类型

整数类型:byte,short,int,long

浮点类型: float,double

逻辑型: boolean

字符类型: char

140732c5ee4411c9721bd773c4664634.png

浏览器根据html中指定的编码格式对参数进行编码,Tomcat根据指定的格式对参数进行解码 ,所以getParameter得到的参数的编码是由客户端和web容器配置共同决定的

43b93a643e4cf25bf92cdeba918b70b0.png

重载,指的是@overload

重写,指的是@override

重写override是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

重载overload,是用在同一函数体中,方法名称不变,方法签名改变

构造函数是不可以使用final修饰的,所以我觉得构造函数不可以是内联函数 (不知道这么说是否正确)

所谓的内联函数,就是函数在被调用的地方直接展开,编译器在调用的时候不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度,对应java语言中也有一个关键字final来知名那个函数式内联的.内联部已订好,当被指定为内联的方法体很大的时候,展开的开销可能就已经超过了普通函数调用的时间,引入内联反而降低了性能,因此在选择这个关键字的时候需要慎重,不过,在以后高版本的JVM中,在处理内敛的时候做出了优化,他会根据方法的规模来决定是否展开调用

构造函数可以是内联函数

构造函数可以设置默认的参数

构造函数在定义类对象的时候自动执行

9c97041d69a9a092dc48ea579662f373.png

FileInputStream,从文件中以字节流读取

FileReader,从文件中以字符流读取

FileWriter,向文件中,写入字符

27d6589b6f494b3de7233e9dfffd2872.png

接口中的变量,默认是public static final

接口中的方法,默认是public abstract

c7a37d8194c99faf2b6f5f724cee35a1.png

Collection类型的集合只能装入Object类型的数据,题中传入的是0,但是会自动装箱为Integer

JVM形成对象后会放入堆中,listlist1和listlist2都指向堆中的同一个对象

instanceof是用来判断对象的类型,也就是对象属于哪个类的实例,因为指向的是同一个对象,所以都为Integer对象,也就是都为true

b7623d04879c2a8bc9b25d4e4a4d05dc.png

67a25baf6e2e19a144f2ecf2002bd127.png

Super super = new Sub(); // 向上转型不需要向值类型转换

Sub sub = (Sub)new Super(); // 向下转型必须要强制类型转换

这道题考察的是多态,对于多态,可以总结为:

1,父类引用指向子类对象

2,父类引用只能调用父类的field和method,不能调用子类的field和method,会报错

3,上面说只能调用父类中的field和method,如果子类中的method覆盖了父类中的method,那么使用父类的引用,调用的将是子类中重写的method,而不是父类中的method; 如果子类field与父类field重名,使用父类的引用,调用field的话,调用的是父类中的field的值

3,子类"覆盖"父类的变量不会报错

5af46e313b7dd1d5e1b568796e044dac.png

74b1b6e6ac4c8e50eed232776af8dd4e.png

25dae12ef2f4d1874a36ba698315f943.png

b0cd80e130a696abf543855e81b98e10.png

5f5b1073e86efadafd433ee2efb987e4.png

getDeclaredMethods():

Returns an array containing {@code Method} objects reflecting all the declared methods of the class or interface represented by this {@code Class} object, including public, protected, default (package)

access, and private methods, but excluding inherited methods.

翻译:返回类的所有声明的方法,包括这个类/接口中的方法(public,private,protected,default),但是不包括这个类所继承的超类中的方法

getMethods():

Returns an array containing {@code Method} objects reflecting all the public methods of the class or interface represented by this {@code Class} object, including those declared by the class or interface and those inherited from superclasses and superinterfaces.

翻译:返回这个类/接口中的所有public方法,包括这个类/接口的超类/父接口中的public方法

同理: getDeclaredMethods() 和 getFields()

3769817c105c138a27fad125a751553a.png

补充知识:

public class ArrayList

extends AbstractList

implements List,

RandomAccess, 说明ArrayList支持随机访问

Cloneable, 说明ArrayList支持克隆

java.io.Serializable 说明ArrayList支持序列化

ArrayList的动态扩容机制:

d6daf09def4a3ad97cb09c2430ffcb3d.png

2f73908190ed38b04f72d033fd5ecc00.png

cc85bf2d2bbaedd9b11b59d3c82d2b45.png

ArrayList扩容机制总结:

如果是通过无参构造器ArrayList()构造,那么初始大小为0,然后,随着add元素,不断的扩容,新容量 = 旧容量的 * 1.5

例如: 先是size=0 的Arraylist,然后add,扩容为DEFAULT_SIZE = 10 ,然后添加第11个元素的时候,是扩容为15个,添加到16个元素的时候,扩容到22个

如果是通过ArrayList(initialSize),则会直接指定数组的大小,不需要扩容

4839be2a00957a4c5663937e35ff0cdc.png

ded87d76d81ca2e74f10b7e6543fe7c5.png

ConcurrentHashMap使用segment来分段和管理锁

static class Segment extends ReentrantLock impliments Serializable{

}

public class ReentrantLock implements Lock,Serializable

interface Lock

7ae7fc0867178a81bab50676b2e5aeee.png

public class HashMap

extends AbstractMap

implements Map,Cloneable,Serializable

public static List asList( T ... a) {

return new ArrayList(a);

}

private static class ArrayList{

//这个ArrayList为Arrays的内部类

}

18e5de829ffb8cabdea548ce5f88d679.png

91e8045b07847f506422ae70c2ac527b.png

SimpleDateFormat 是线程不安全的

b9acaa80fe98efb9ba1f14a81f9f6401.png

使用JDBC的完整流程:

加载JDBC驱动程序

提供链接URL

创建数据库连接

创建一个Statement

执行SQL语句

处理

关闭JDBC连接

577ab47933f206165f1fa15099065823.png

经过验证,以Stream结尾的都是字节流byte,以Reader,Writer结尾的都是字符流

需要注意的:

InputStreamReader:

An InputStreamReader is a bridge from byte streams to character streams: It

reads bytes and decodes them into characters using a specified {@link java.nio.charset.Charset charset}. The charset that it uses

may be specified by name or may be given explicitly, or the platform's default charset may be accepted.

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

OutputStreamReader:

An OutputStreamWriter is a bridge from character streams to byte streams:Characters written to it are encoded into bytes using a specified {@link java.nio.charset.Charset charset}. OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

33d7780985ea2b8f245169d552b27af5.png

考察Statement与PreparedStatement的使用与区别:

interface Statement extends Wrapper,AutoCloseable

interface PreparedStatement extends Statement

Statement是一个接口,用于为一条SQL语句生成执行计划,如果需要执行10条SQL语句,则需要生成十次执行计划

PreparedStatement继承自Statement,具有Statement的全部功能,主要用来解决使用Statement多次执行同一SQL语句的效率问题,PreparedStatement使用的是数据库支持预编译的功能,预先将SQL语句进行编译,多次执行同一条SQL语句的时候,只需要将编译好的SQL语句直接执行就可以,提高了效率,同时可以防止SQL注入,提高了安全性

构造PreparedStatement的时候需要传入SQL语句,进行预编译,excute的时候,excute里面不传入SQL

构造Statement的时候不需要传入SQL语句,excute的时候需要传入SQL语句

a0c9210cf0af2b050a78d3f163559a43.png

Object 类中wait(),notify(),notifyAll()方法的区别:

1)wait() notify(), notifyAll()

public final native void wait() throws InterruptedException ;

public final native void notify();

public final native void notifyAll();

都是native方法,都为final方法, 无法被override

2) 调用某个对象的wait()方法,能够让当前线程阻塞,前提是当前线程必须拥有此对象作为锁,而且obj.wait()方法必须位于synchronized(obj)中

3) 调用某个对象的notify()能够唤醒一个正在等待这个对象的线程,如果有多个县城都在等待此对象,则从中唤醒一个

4) 调用notifyAll()能够唤醒所有正在等待这个对象的monitor的线程

为什么这三个不是Thread中的方法,而是Object类中的方法?

当然由于Thread也是Object,所以Thread也可以调用此方法

原因: 由于每一个对象都可以拥有锁,所以让当前线程等待某个对象的锁,当然需要通过这个对象来操作了,而不是用当前线程来操作,因为当前线程可能会等待多个锁,如果通过线程来操作,就很复杂

上面已经提到,如果条用某个对象的wait()方法,当前线程必须拥有这个对象的锁,因此调用wait()方法必须在synchronized块或者synchronized方法中进行

调用某个对象的wait()方法,相当于让当前线程交出此对象的锁,然后进入等待状态,等待后续再次获得此对象的锁(Thread中的sleep方法使当前线程暂停一段时间,从而让其他线程有机会继续执行,但是在这期间sleep不是访对象锁)

notify()方法能够唤醒一个正在等待该对象的锁的线程,如果有多个线程,只能唤醒其中的一个,具体唤醒那个线程不确定

调用对象的notify()方法,当前线程也必须用用这个对象的synchronized,因此调用notify()方法必须在synchronized()中执行

Condition是在jdk 1.5中出现的,用来替代传统的Object的wait,notify()和notifyAll(),实现线程间的通信,使用Contion的await(),singal()这种方式来实现线程的协作更加安全和高效,阻塞队列使用的是Condition来模拟线程间的协作

Condition是一个接口

public interface Condition {

await();

signal();

signalAll();

}

Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition();

调用Condition的await()和signal()方法,必须都在lock.lock()的保护之内

wait()对应于await();

notify()对应于signal;

notifyAll()对应于signalAll();

d95f21693696988f5536a3b08f61604d.png

6884eefdd5ea67d55fe34aefa2dfb65a.png

ThreadLocal里面可以放一个值

ThreadLocal类用于创建一个线程本地变量

Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,他的键是threadLocal,值为变量的副本.通过ThreadLocal的get()方法可以获取到该线程变量对应的value

6217826da6252437680ff577543270b8.png

4389b6ac1ec704b355393263cde2d235.png

a73343b657204c1273b5a53d1b53eea5.png

不论是静态内部类,还是非静态内部类,都是外部类的一个属性,所以,对于非静态内部类,需要使用InstanceObject().new InnerClass(),对于静态内部类,可以使用new OuterClass.staticInnerClass()的方式来进行创建

无论是静态内部类,还是非静态内部类,都需要使用OuterClass.innerClassName来进行引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值