2021年09月19日 java1

考点1:赋值运算符左值必须是变量

下面语句正确的是()

  • A x+1=5
  • B i++=1
  • C a++b=1
  • D x+=1
显示答案/隐藏答案正确答案: D

赋值运算符 左值必须是变量

首先赋值运算符“=”右值可以是任何常数、变量或者表达式(只要能生成一个值就行)。但左值必须是一个明确的、已命名的变量

常用的双元运算符:+=-=*=/=

解析:
A:x+1=5,赋值运算符左边是表达式,不对;
B:i++=1,从左到右运算是i=i+1=1,赋值运算符左边是表达式,错误;
C:a++b=1,赋值运算符左边为表达式,错误。
D:x+=1,既x=x+1,正确。

注意背一下各个运算符的先后顺序。

考点2:负数求余运算

以下代码段执行后的输出结果为

1
2
3
4
5
6
7
public class Test {
public static void main(String args[]) {
int x = -5;
int y = -12;
System.out.println(y % x);
}
}
  • A -1
  • B 2
  • C 1
  • D -2
显示答案/隐藏答案正确答案: D

换个角度去理解,y%x算得是y在除以x后还剩多少。这里显然是还剩-2没有除。

验算:

1
不论正负,都是a%b=a-a/b*b
1
2
3
4
5
-2=-12 - (-12/-5)*(-5)
=-12 - (2)*(-5)
=-12 - (-10)
=-12 + 10
=-2

在java中,求余运算,a%b,结果的符号和被除数a的符号一致。

1
2
3
4
System.out.println("-12 % -5= " + (-12 % -5));
System.out.println("-12 % +5= " + (-12 % +5));
System.out.println("+12 % -5= " + (12 % -5));
System.out.println("+12 % +5= " + (12 % +5));

运行结果:

1
2
3
4
-12 % -5= -2
-12 % +5= -2
+12 % -5= 2
+12 % +5= 2

当a为-12时,无论b是+5,还是-5。a%b的结果都是-2
当a为+12时,无论b是+5,还是-5。a%b的结果都是+2

1
2
3
4
System.out.println("-17 % -5= " + (-17 % -5));
System.out.println("-17 % +5= " + (-17 % +5));
System.out.println("+17 % -5= " + (17 % -5));
System.out.println("+17 % +5= " + (17 % +5));

运行结果:

1
2
3
4
-17 % -5= -2
-17 % +5= -2
+17 % -5= 2
+17 % +5= 2

考点3:使用迭代器遍历集合时,不可改变集合

list是一个ArrayList的对象,哪个选项的代码填到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?()

1
2
3
4
5
6
7
8
9
10
11
Iterator it = list.iterator();
int index = 0;
while (it.hasNext())
{
Object obj = it.next();
if (needDelete(obj))//needDelete返回boolean,决定是否要删除
{
//todo delete
}
index ++;
}
  • A it.remove();
  • B list.remove(obj);
  • C list.remove(index);
  • D list.remove(obj,index);
显示答案/隐藏答案正确答案: A

迭代器遍历集合时 不可调用集合对象的remove方法或add方法

如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。

通过for循环遍历集合时,如何调用集合的remove方法删除元素,又不报错

1
2
3
4
for(int i=0;i<list.size();i++){
list.remove(i);
i--;
}

迭代器在迭代过程中要注意的事项:
1.迭代器在迭代过程中不允许使用集合对象改变集合的元素个数。否则会报出:ConcurrentModificationException,即并发修改异常。
2.在迭代过程中如果需要改变集合中的元素个数,只能使用迭代器的方法去改变。如add()方法和remove()方法。

不使用迭代器时,可以通过集合对象remove和add

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);

for (int i = 0; i < list.size(); i++) {
if (i == 2) {
// list.remove(2);
list.remove(1);
}
}
System.out.println(list);

运行结果:

1
2
[0, 1, 2, 3, 4, 5]
[0, 2, 3, 4, 5]

使用迭代器遍历集合时,不可调用集合对象remove方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer i = iterator.next();
if (i == 2) {
// 报错:java.util.ConcurrentModificationException
list.remove(2);
// 报错:java.util.ConcurrentModificationException
// list.add(5);
// 正确做法
// iterator.remove();
}
}
System.out.println(list);

运行结果:

1
2
3
4
5
[0, 1, 2, 3, 4, 5]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at base.QiuYu.main(QiuYu.java:35)

使用迭代器遍历集合是不可调用集合对象的add方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);

Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer i = iterator.next();
if (i == 2) {
// 报错:java.util.ConcurrentModificationException
// list.remove(2);
// 报错:java.util.ConcurrentModificationException
list.add(5);
// 正确做法
// iterator.remove();
}
}
System.out.println(list);

运行结果:

1
2
3
4
5
[0, 1, 2, 3, 4, 5]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at base.QiuYu.main(QiuYu.java:27)

迭代器遍历集合时,如果要删除集合中的元素,只能调用迭代器对象的remove方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer i = iterator.next();
if (i == 2) {
// 报错:java.util.ConcurrentModificationException
// list.remove(2);
// 报错:java.util.ConcurrentModificationException
// list.add(5);
// 正确做法
iterator.remove();
}
}
System.out.println(list);

运行结果:

1
2
[0, 1, 2, 3, 4, 5]
[0, 1, 3, 4, 5]

考点4:不同的Map的key和value是否能为null

在Java中,关于HashMap类的描述,以下正确的是 ()

  • A HashMap使用键/值得形式保存数据
  • B HashMap 能够保证其中元素的顺序
  • C HashMap允许将null用作键
  • D HashMap允许将null用作值
显示答案/隐藏答案正确答案: ACD
Map集合类 key value
HashMap 允许为null 允许为null
TreeMap 不允许为null 允许为null
ConcurrentMap 不允许为null 不允许为null
HashTable 不允许为null 不允许为null

考点5:对象序列化

以下关于对象序列化描述正确的是

  • A 使用FileOutputStream可以将对象进行传输
  • B 使用PrintWriter可以将对象进行传输
  • C 使用transient修饰的变量不会被序列化
  • D 对象序列化的所属类需要实现Serializable接口
显示答案/隐藏答案正确答案: CD

static和transient的成员变量不能对象序列化

使用ObjectOutputStream和ObjectInputStream可以将对象进行传输.
声明为static和transient类型的成员数据不能被串行化。
因为static代表类的状态, transient代表对象的临时数据。

考点7:正则表达式

正则表达式语法中 \d 匹配的是?()

  • A 数字
  • B 非数字
  • C 字母
  • D 空白字符
显示答案/隐藏答案正确答案: A
正则表达式 描述
\d 匹配一个数字字符。等价于 [0-9]
\D 匹配一个非数字字符。等价于 [^0-9]
\f 匹配一个换页符。等价于 \x0c\cL
\n 匹配一个换行符。等价于 \x0a\cJ
\r 匹配一个回车符。等价于 \x0d\cM
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
\t 匹配一个制表符。等价于 \x09\cI
\v 匹配一个垂直制表符。等价于 \x0b\cK
\w 匹配字母、数字、下划线。等价于’[A-Za-z0-9_]‘。
\W 匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]‘。

考点6:数组的下标

已知声明并初始化二维数组

1
int arr[][]={{1,2},{3,4},{5,6}}

,则的arr[1][1]值为()

  • A 1
  • B 2
  • C 4
  • D 5
显示答案/隐藏答案正确答案: C

一定要记住数组中以0下标开始

考点8:List和Set的异同

列表(List)和集合(Set)下面说法正确的是?( )

  • A Set中至多只能有一个空元素
  • B List中至多只能有一个空元素
  • C List和Set都可以包含重复元素的有序集合
  • D List和Set都是有序集合
显示答案/隐藏答案正确答案: A

java里面讲的有序无序,指的是你按照顺序存进去数据,然后再按照顺序取出来,两者是一样的。比如List(0)我放的是“a”,那么我list.get(0)取出来也是“a”。并不代表我存了打乱顺序存1到10十个数,它会自己给按照升序或者降序给你排好序。

list有序有重;set无序无重

考点9:Servlet过滤器

在J2EE中,使用Servlet过滤器,需要在web.xml中配置()元素

  • A <filter>
  • B <filter-mapping>
  • C <servlet-filter>
  • D <filter-config>
显示答案/隐藏答案正确答案: AB

答案:AB
Servlet过滤器的配置包括两部分:
第一部分是过滤器在Web应用中的定义,由<filter>元素表示,包括<filter-name><filter-class>两个必需的子元素
第二部分是过滤器映射的定义,由<filter-mapping>元素表示,可以将一个过滤器映射到一个或者多个Servlet或JSP文件,也可以采用url-pattern将过滤器映射到任意特征的URL

字符编码过滤器示例

举个例子,如下图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 字符编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

没有<servlet-filter><filter-config>

考点10:反序列化 clone不调用构造器,new,反射newInstance调用构造器

下面的对象创建方法中哪些会调用构造方法 ()?

  • A new语句创建对象
  • B 调用Java.io.ObjectInputStream的readObject方法
  • C java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
  • D 调用对象的clone()方法
显示答案/隐藏答案正确答案: AC

readObject方法只是从文件中还原对象,clone只是一种复制拷贝对象。

7020520_1564402470654_E2A51A5DD194A70AC60F152482E33E06

考点11:String 基本类型转String

java中 String str = "hello world"下列语句错误的是?

  • A str+=' a'
  • B int strlen = str.length
  • C str=100
  • D str=str+100
显示答案/隐藏答案正确答案: ABC

A选项,单引号中不能有两个字符,
B选项,String对象没有.length属性,只有.length()方法
C选项,int类型的数据不能赋值给String类型的变量str