在做CVTE在线测评时遇到的几个问题

记录一下在做测评时遇到的几个问题。


1.count(*)和count(列名)

cout(*)统计的是结果集的总条数

count(列名)统计的是除了结果集中列值不为空(不为null)的记录的总条数


2.关于==和equals的

public class T13 {
	public static void main(String[] args) {
		String s1="hello"+"world";
		String s2=new String(s1);

		if(s1==s2)
			System.out.print("s1==s2");
		else if(s1.equals(s2))
			System.out.print("s1 equals s2");
	}
}
运行结果为:

s1 equals s2

做题时犹豫了一下下,最后还是选对了。

之前总结过:http://blog.csdn.net/csummm4/article/details/20486443正好用上了。


3.求程序的输出结果

#include 

int main() {
   int i=43;
    printf("%d",printf("%d",printf("%d",i)));
    return 0;
}

运行结果:

-------------------------------------------------
4321
-------------------------------------------------
百度了一下原因:

printf的返回值是打印的字符数
先打印最里层的43
然后43为2个字符,中层的printf打印2
然后2为一个字符,最外层的printf打印1
这就是结果4321

4.关于String和StringBuffer的

以下JAVA语句片段创建了几个对象?

String A ,B,C;
A="a";
B="b";
A=A+B;
StringBuffer D=new StringBuffer("abc");
D=D.append("567");

A.3

B.4

C.5

D.6

选的C,5个。

因为String对象是不可变得,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.

Java为了节省内存空间和运行时间,在编译阶段就把所有的字符串文字放到一个文字池中,而运行时文字池成为常量池的一部分。如果当前准备新创建的字符串对象的值在这个池子中已经存在,那么就不会生成新对象,而是复用池中已有的字符串对象。flyweight 模式的精髓就是对象复用。不过,只有采用Object s = “Hello”方式(而非用”new“关键字)声明String对象的时候这个规则才会被应用。

第5行是创建了2个对象,一个是"abc",一个是new出来的。

例如String s=new String("abc"),这里"abc"本身就是pool中的一个对象,而在运行时执行new String()时,将pool中的对象复制一份放到heap中,并且heap中的这个对象引用交给s持有,这条语句就创建了两个String对象。

而StringBuffer的可变序列的字符串对象,当对他进行修改的时候不会像String那样重新建立对象

另外StringBulier也是可变序列的字符串对象,只是不是线程安全的,StringBuffer是线程安全的。





你可能感兴趣的:(在做CVTE在线测评时遇到的几个问题)