牛客练习笔记-JAVA 10/3

目录

题目:

1.下面有关java hashmap的说法错误的是?

2.下面程序的输出结果是什么?

3.下面有关SPRING的事务传播特性,说法错误的是?

4.如何获取ServletContext设置的参数值?

5. 对于线程局部存储TLS(thread local storage),以下表述正确的是

6.Statement和PreparedStatement

7.程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。关于变量的叙述,正确的是()

8.下面哪些赋值语句是正确的()

9.JDK1.8版本之前,抽象类和接口的区别,以下说法错误的是

10、下面有关servlet中init,service,destroy方法描述错误的是?

11..下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader()

知识总结:

1.在这里帮大家总结一下hashMap和hashtable方面的知识点吧:

2.  Hashtable和HashMap的区别:

3. Spring事务的传播属性是怎么回事?它会影响什么?

4.Statement、PreparedStatement和CallableStatement

每日一记:

1.有了Reader、Writer为什么还需要InputStream、OutputStream

2.HashMap 和 Hashtable 有什么区别?

3.关于ConcurrentHashMap?


题目:

1.下面有关java hashmap的说法错误的是?

A HashMap 的实例有两个参数影响其性能:“初始容量” 和 “加载因子”。

B HashMap 的实现不是同步的,意味着它不是线程安全的

C HashMap通过开放地址法解决哈希冲突

D HashMap中的key-value都是存储在Entry数组中的

正确答案:C

使用的是链地址法。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
HashMap底层就是一个数组结构,数组中的每一项又是一个链表。

2.下面程序的输出结果是什么?

//看注释这种快排的思路就很清晰了,这是只从一个方向遍历的快排
public class A2 {
	public static void main(String[] args) {
		int[] a = { 2, 4, 6, 8, 3, 6, 9, 12 };
		quickSort(a, 0, a.length - 1);
		for (int i = 0; i <= a.length - 1; i++)
			System.out.print(a[i] + " ");
	}

	private static void quickSort(int[] a, int start, int end) {
		if (start < end) {
			int p = core(a, start, end);
			quickSort(a, start, p - 1);
			quickSort(a, p + 1, end);
		}
	}

	private static int core(int[] a, int start, int end) {
		int x = a[end];
		int i = start;  //记录遍历完后最后一个数应该放在的位置,初始就是start,
因为如果前面没有数比最后一个数大,那么下面遍历完后最后一个数就应该放在start的位置
		for (int j = start; j <= end - 1; j++) { //遍历的目的是把参与排序的这
轮数中比最后一个数大的数都放到最后一个数前面
			if (a[j] >= x) {
				swap(a, i, j);   
				i++;  //每遇到一个比最后一个数大的数,最后一个数应该放的位置就+1
			}
		}
		swap(a, i, end); //这里一交换后就把最后一个数放在了正确的位置,
这样左边的数都比最后一个数大,右边的数都比最后一个数小
		return i;
	}

	private static void swap(int[] a, int i, int j) {
		int tmp = a[i];
		a[i] = a[j];
		a[j] = tmp;
	}
}

A 找到最大值        B 找到最小值

C 从大到小的排序        D 从小到大的排序

3.下面有关SPRING的事务传播特性,说法错误的是?

A PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行

B PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常

C PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起

D PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚

正确答案:B

PROPAGATION_REQUIRED:表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务

4.如何获取ServletContext设置的参数值?

A context.getParameter()

B context.getInitParameter()

C context.getAttribute()

D context.getRequestDispatcher()

getParameter()是获取POST/GET传递的参数值;
getInitParameter获取Tomcat的server.xml中设置Context的初始化参数

getAttribute()是获取对象容器中的数据值;
getRequestDispatcher是请求转发

5. 对于线程局部存储TLS(thread local storage),以下表述正确的是

A 解决多线程中的对同一变量的访问冲突的一种技术

B TLS会为每一个线程维护一个和该线程绑定的变量的副本

C 每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了

D Java平台的java.lang.ThreadLocal是TLS技术的一种实现

正确答案:ABD

你的答案:ABCD

参考答案:ABD C:同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其它线程的副本冲突。

6.Statement和PreparedStatement

A Statement sta=con.createStatement(); ResultSet rst=sta.executeQuery("select * from book");

B Statement sta=con.createStatement("select * from book"); ResultSet rst=sta.executeQuery();

C PreparedStatement pst=con.prepareStatement(); ResultSet rst=pst.executeQuery("select * from book");

D PreparedStatement pst=con.prepareStatement("select * from book"); ResultSet rst=pst.executeQuery();

正确答案:AD

你的答案:BC

参考答案:A,D是正确的;创建Statement是不传参的,PreparedStatement是需要传入sql语句

说一下preparedStatement和statement的区别与联系:在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。   PreparedStatement 接口继承 Statement ,   PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句
select colume from table where colume=1;select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行计划,可以重用

7.程序中常采用变量表示数据,变量具有名、地址、值、作用域、生存期等属性。关于变量的叙述,正确的是()

A 根据作用域规则,在函数中定义的变量只能在函数中引用

B 在函数中定义的变量,其生存期为整个程序执行期间

C 在函数中定义的变量不能与其所在函数的形参同名

D 在函数中定义的变量,其存储单元在内存的栈区

正确答案:AB         你的答案:ABD

这里主要说明D为什么是对的

首先说明栈内存和堆内存里存放的是什么

  • 栈内存中存放函数中定义的一些基本类型的变量和对象的引用变量;
  • 堆内存中存放new创建的对象和数组。

简单的来说,堆主要是用来存放对象的,栈主要是用来执行程序的

这么做是因为

  • 栈的存取速度快,栈数据可以共享,但是栈中的数据大小和生存期必须确定,缺乏灵活性中存放一些基本类型的对象和对象句柄
  • 堆是操作系统分配给自己内存,由于从操作系统管理的内存分配,所以再分配和销毁时都需要占用时间,因此用堆的效率非常低,但是优点在于编译器不需要指导从堆里分配多少存储控件,也不需要知道存储的数据要再堆里停留多长事件,因此用堆保存数据时会得到更大的灵活性

参考链接:https://blog.csdn.net/wangbo1998/article/details/80379016

8.下面哪些赋值语句是正确的()

A long test=012

B float f=-412

C int other =(int)true

D double d=0x12345678

E byte b=128

正确答案:ABD        你的答案:BD

参考答案:选ABD A和B中long和float,正常定义需要加l和f,但是long和float属于基本类型,会进行转化,所以不会报出异常。AB正确 boolean类型不能和任何类型进行转换,会报出类型异常错误。所以C错。 D选项可以这样定义,D正确。 E选项中,byte的取值范围是-128—127。报出异常: cannot convert from int to byte.所以E选项错误。

9.JDK1.8版本之前,抽象类和接口的区别,以下说法错误的是

A 接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。

B abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,实现多重继承。接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用。

C 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是 public abstract 类型的。

D abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"has-a"关系,interface表示的是"is-a"关系。

正确答案:D

D项: abstract class表示的是"is-a"关系,interface表示的是"like-a"关系

is-a:继承关系 has-a:从属关系 like-a:组合关系   参考9/30 第八题

      牛客练习笔记-JAVA 9/30-CSDN博客

10、下面有关servlet中init,service,destroy方法描述错误的是?

A.init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法

service()方法处理客户机发出的所有请求

destroy()方法标志servlet生命周期的结束

servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全

正确答案: D

题解:

servlet在多线程下其本身并不是线程安全的。

如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。

11..下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader()

A Thread
B Number
C Double
D Math
E ClassLoader

正确答案: A B E 你的答案:A B E (正确)
题解:
A:Thread可以被继承,用于创建新的线程
B:Number类可以被继承,Integer,Float,Double等都继承自Number类
C:Double类的声明为 public final class Doubleextends Numberimplements Comparable<Double> final声明的类不能被继承
D:Math类的声明为 public final class Mathextends Object 不能被继承
E:ClassLoader可以被继承,用户可以自定义类加载器

知识总结:

1.在这里帮大家总结一下hashMap和hashtable方面的知识点吧:

1.  关于HashMap的一些说法:

a)  HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。

b)  HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。

c)  HashMap实现不同步,线程不安全。  HashTable线程安全 d)  HashMap中的key-value都是存储在Entry中的。

e)  HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性

f)  解决冲突主要有三种方法:定址法,拉链法,再散列法。HashMap是采用拉链法解决哈希冲突的。 注: 链表法是将相同hash值的对象组成一个链表放在hash值对应的槽位;    用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。   拉链法解决冲突的做法是: 将所有关键字为同义词的结点链接在同一个单链表中 。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。拉链法适合未规定元素的大小。    

2.  Hashtable和HashMap的区别:

a)   继承不同。  public class Hashtable extends Dictionary implements Map

public class HashMap extends  AbstractMap implements Map

b)  Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。

c)  Hashtable 中, key 和 value 都不允许出现 null 值。 在 HashMap 中, null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为 null 。当 get() 方法返回 null 值时,即可以表示 HashMap 中没有该键,也可以表示该键所对应的值为 null 。因此,在 HashMap 中不能由 get() 方法来判断 HashMap 中是否存在某个键, 而应该用 containsKey() 方法来判断。

d)  两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

e)  哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

f)  Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。   注:  HashSet子类依靠hashCode()和equal()方法来区分重复元素。      HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值的,会去判断当前Map中是否含有该Key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。

3. Spring事务的传播属性是怎么回事?它会影响什么?

a. 七个事传播属性:

1. PROPAGATION_REQUIRED -- ⽀持当前事务,如果当前没有事务,就新建⼀个事务。这是最常⻅的选择。

2. PROPAGATION_SUPPORTS -- ⽀持当前事务,如果当前没有事务,就以⾮事务⽅式执⾏。

3. PROPAGATION_MANDATORY -- ⽀持当前事务,如果当前没有事务,就抛出异常。

4. PROPAGATIONREQUIRESNEW -- 新建事务,如果当前存在事务,把当前事务挂起。

5. PROPAGATIONNOTSUPPORTED -- 以⾮事务⽅式执⾏操作,如果当前存在事务,就把当前事务挂起。

6. PROPAGATION_NEVER -- 以⾮事务⽅式执⾏,如果当前存在事务,则抛出异常。

7. PROPAGATIONNESTED -- 如果当前存在事务,则在嵌套事务内执⾏。如果当前没有事务,则进⾏与 PROPAGATIONREQUIRED类似的操作。

b. 五个隔离级别:

1. ISOLATION_DEFAULT 这是⼀个PlatfromTransactionManager默认的隔离级别,使⽤数据库默认的事务隔离级别.

2. 另外四个与JDBC的隔离级别相对应:

3. ISOLATIONREADUNCOMMITTED 这是事务最低的隔离级别,它充许别外⼀个事务可以看到这个事务未提交的数 据。这种隔离级别会产⽣脏读,不可重复读和幻读。

4. ISOLATIONREADCOMMITTED 保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取 该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。

5. ISOLATIONREPEATABLEREAD 这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻读。它除了保证 ⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免不可重复读。

6. ISOLATION_SERIALIZABLE 这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏 读,不可重复读外,还避免了幻读。

c. 关键词:

1、幻读:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录;

2、不可重复读:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录;

3、脏读:事务1更新了记录,但没有提交,事务2读取了更新后的⾏,然后事务T1回滚,现在T2读取⽆效。

4.Statement、PreparedStatement和CallableStatement

1.Statement、PreparedStatement和CallableStatement都是接口(interface)。 
2.Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。 
3. 
Statement接口提供了执行语句和获取结果的基本方法; 
PreparedStatement接口添加了处理 IN 参数的方法; 
CallableStatement接口添加了处理 OUT 参数的方法。 
4. 
a.Statement: 
普通的不带参的查询SQL;支持批量更新,批量删除; 
b.PreparedStatement: 
可变参数的SQL,编译一次,执行多次,效率高; 
安全性好,有效防止Sql注入等问题; 
支持批量更新,批量删除; 
c.CallableStatement: 
继承自PreparedStatement,支持带参数的SQL操作; 
支持调用存储过程,提供了对输出和输入/输出参数(INOUT)的支持; 

Statement每次执行sql语句,数据库都要执行sql语句的编译 , 
最好用于仅执行一次查询并返回结果的情形,效率高于PreparedStatement。 

PreparedStatement是预编译的,使用PreparedStatement有几个好处 
1. 在执行可变参数的一条SQL时,PreparedStatement比Statement的效率高,因为DBMS预编译一条SQL当然会比多次编译一条SQL的效率要高。 
2. 安全性好,有效防止Sql注入等问题。 
3.  对于多次重复执行的语句,使用PreparedStament效率会更高一点,并且在这种情况下也比较适合使用batch; 
4.  代码的可读性和可维护性

每日一记:

1.有了Reader、Writer为什么还需要InputStream、OutputStream

ReaderWriter是用于处理字符数据的输入输出,而InputStreamOutputStream是用于处理字节数据的输入输出。   //字符流 字节流

虽然在许多情况下,我们常使用ReaderWriter来处理文本文件的输入输出,但是在某些情况下,我们可能需要直接处理字节数据。以下是一些使用InputStreamOutputStream的场景:

  1. 处理二进制数据:当我们需要读取或写入二进制文件,如图像、音频或视频文件时,可以使用InputStreamOutputStream来处理字节数据。
  2. 网络通信:在网络通信中,数据以字节流的形式传输。InputStreamOutputStream提供了读取和写入字节数据的方法,可以用于处理网络套接字或网络协议。
  3. 处理压缩文件:压缩文件通常以字节流的形式进行读写,例如常见的ZIPGZIPTAR格式。使用InputStreamOutputStream可以读取和写入压缩文件的字节数据。
  4. 低级别操作:在某些情况下,我们可能需要对底层的字节数据进行更底层的操作,例如读取特定数量的字节、跳过指定数量的字节等。InputStreamOutputStream提供了更灵活的字节级别的操作方法。

故尽管ReaderWriter方便地处理了字符数据的输入输出,但在处理字节数据、网络通信、压缩文件等方面,InputStreamOutputStream是特别设计用于处理字节数据的输入输出类,提供了更灵活、更底层的方法和功能。

2.HashMap Hashtable 有什么区别?

1)线程安全性不同 HashMap是线程不安全的,HashTable是线程安全,在多线程并发的情况下,可以直接使用HashTabl,但是使用HashMap时必须自己增加同步处理。 2)是否提供contains方法 HashMap只有containsValuecontainsKey方法;HashTablecontainscontainsKeycontainsValue三个方法,其中containscontainsValue方法功能相同。

3keyvalue是否允许null Hashtable中,keyvalue都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的valuenull

4)数组初始化和扩容机制 HashTable在不指定容量的情况下的默认容量为11,而HashMap16Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。 Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

3.关于ConcurrentHashMap?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值