java基础知识收集
来源:互联网 发布:网站备案 知乎 编辑:程序博客网 时间:2024/06/06 12:38
1、开发Java程序步骤?
编辑源程序(以.java为后缀名保存)=>编译.java文件(生成.class文件)=>运行.class文件(输出程序结果)
2、Java程序的注释分类?
1、单行注释// 2、多行注释/**/ 3、文档注释/** */
3、Java领域分为哪些?
1、JavaSE、JavaEE、JavaME
4、Java的基本类型有哪些?
byte,char, short, int, long, float, double, boolean
5、变量命名规则?
1、简短且能清楚地表明变量的作用,通常第一个单词的首字母小写,其后单词的首字母大写
2、变量名首字符必须是字母、下划线或者美元符$,其后可以跟字母、数字、下划线已经美元符。
6、JAVA中常用的运算符有哪些?这些运算符之间的优先级怎么样?
1、算术运算符
2、比较运算符
3、赋值运算符
4、逻辑运算符
运算符之间的优先级:
算术运算符》比较运算符》逻辑运算符》赋值运算符
9、JAVA中数据类型之间的转换规则分为:
1、自动类型转换 2、强制类型转换
11、JAVA中常用的选择结构有哪些?
1、if
2、if...else
3、if...else...的嵌套
4、if...else if...else if...else...
5、switch
12、if...else if...else if...else与switch的使用场景是什么?
1、if...else if...else if...else一般使用在对值得范围进行判断
2、发现多个条件均为等值判断,更好的解决办法是使用switch。
13、在JAVA自定义一个生产10-100之间的随机数的公式?
int random=(int) (Math.random()*(max-min)+min)
int random=(int) (Math.random()*(100-10)+10)
14、switch语句中的表达式可以是什么类型数据?
答:表达式的值可以是byte、short、int和char类型的数据,但不能是float和double类型的数据。
15、switch判断表达式中break的作用是什么?
用来结束case匹配语句的执行。
17、while循环结构与do...while循环结构的不同?
while结构在循环的开始判断下一个迭代是否应该继续。do/while结构在循环的结尾来判断是否将继续下一轮迭代。do结构至少会执行一次循环体。
18、java中程序调试的步骤?
1、设置断点 2、单步运行3、观察变量
19、for循环结构与while循环结构的不同?
当循环次数确定时使用for循环否则使用while循环。
20、程序中break、continue、return跳转语句的不同?
1、break:跳出循环而执行循环后面的语句
2、continue:跳过循环体中剩余的语句而执行下一次循环
3、return结束方法的调用。
21、使用数组四步走是什么?
1、声明数组 2、分配空间3、赋值4、处理数据
22、数组的定义有哪些方式?
int[] arr=new int[5];
int arr[]=new int[5];
int[] arr=new int[]{1,2,3,4,5};
int[] arr={1,2,3,4,5};
23、编写一个程序实现费波拉契数列(就是后面的数字是前面两个数字的和),要求从1到20即可。请使用数组方式来实现
int[] num=new int[20];
num[0]=0;
num[1]=1;
for(int i=2;i<20;i++){
num[i]=num[i-1]+num[i-2];
}
for(int j=1;j<=20;j++){
if(j%5==0){
System.out.println();
}
System.out.print(num[j-1]+" ");
}
24、请打印杨辉三角。杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和(使用数组实现)
final int N=10;
int[] num=new int[N];
num[0]=1;
for(int i=1;i!=N;i++){
for(int j=0;j!=i;j++){
System.out.print(num[j]+"\t");
}
System.out.println();
num[i]=1;
for(int j=i-1;j!=0;j--){
num[j]=num[j]+num[j-1];
}
}
25、请描述什么是对象,什么是类?
对象是一个你能够看得到、摸得着的具体实体
类是模子,定义对象将会拥有的特征(属性)和行为(方法),类是抽象的概念,仅仅是模板
26、定义一个类的步骤什么?
1、定义类名 2、编写类的属性3、编写类的方法
27、成员变量和局部变量的区别是什么?
作用域不同
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
28、请描述方法的组成部分?
方法的签名与方法体构成。
29、JAVA中包的作用是什么?
1、允许类组成较小的单元(类似文件夹),易于找到和使用相应的文件
2、更好的保护类、属性和方法
3、防止命名冲突
30、包命名规范有哪些?
1、包名由小写字母组成,不能以圆点开头或结尾
2、包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名
3、包名后续部分依不同机构内部的规范不同而不同
31、定义一个方法,该方法带有一个字符串的参数,该方法的功能是实现大小写的转换,如:输入的是HoWAREyoU通过该方法就可以把她转换为hOwareYOu最后把转换的结果通过return返回。
public String charConvert(String str){
char[] chs=str.toCharArray();
for(int i=0;i<str.length();i++){
if((int)chs[i]>=65 && (int)chs[i]<=90){
chs[i]=(char)((int)chs[i]+32);
}else{
chs[i]=(char)((int)chs[i]-32);
}
}
String s=new String(chs);
return s;
}
32、String是最基本的数据类型吗?
String不是基本数据类型,基本数据类型包括byte、int、char、long、float、double、boolean和short。Java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。
33、Java有没有goto?
goto是Java中的保留关键字,但是现在没有在Java中使用。
34、说明一下类变量和实例变量的区别。
类变量是所有对象共有的,所有的实例对象都共用一个类变量,内存中只有一处空间存放类变量的值。如果其中一个对象改变了类变量的值,其他对象得到的就是改变后的结果。当类被加载到内存时,类变量就会分配相应的内存空间。
35、说明实例方法和类方法的区别?
方法前面有static关键字修饰的为类方法,否则为实例方法。 实例方法可以调用该类中的其他方法;类方法只能调用其他类方法,不能调用实例方法;当类文件加载到内存时,实例方法不会被分配内存空间,只有在对象创建之后才会分配。而类方法在该类被加载到内存时就分配了相应的内存空间。
36、数组有没有length()方法? String有没有length()方法?
数组没有length()方法,只有length的属性。String有length()方法。
38、char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为Java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的。
40、int和 Integer有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。
41、如果main方法被声明为private会怎样?
能正常编译,但运行的时候会提示”main方法不是public的”。
42、Java里的传引用和传值的区别是什么?
传引用是指传递的是地址而不是值本身,传值则是传递值的一份拷贝。
43、Java的”一次编写,处处运行”是如何实现的?
Java程序会被编译成字节码组成的class文件,这些字节码可以运行在任何平台,因此Java是平台独立的。
44、public static void main(String args[])这段声明里每个关键字的作用
public: main方法是Java程序运行时调用的第一个方法,因此它必须对Java环境可见。所以可见性设置为pulic.
static: Java平台调用这个方法时不会创建这个类的一个实例,因此这个方法必须声明为static。
void: main方法没有返回值。
String是命令行传进参数的类型,args是指命令行传进的字符串数组。
45、如果去掉了main方法的static修饰符会怎样?
程序能正常编译。运行时会抛NoSuchMethodError异常。
46、为什么Java里没有全局变量?
全局变量是全局可见的,Java不支持全局可见的变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突。
47、如何将String类型转化成Number类型?
Integer类的valueOf方法可以将String转成Number。下面是代码示例:
String numString = “1000″;
int id=Integer.valueOf(numString).intValue();
48、面向对象编程的原则是什么?
主要有三点,多态,继承和封装
49、什么是隐式的类型转化?
隐式的类型转化就是简单的一个类型赋值给另一个类型,没有显式的告诉编译器发生了转化。并不是所有的类型都支持隐式的类型转化。
代码示例:
int i = 1000;
long j = i; //Implicit casting
50、显式的类型转化是什么?
显式的类型转化是明确告诉了编译器来进行对象的转化。
代码示例:
long i = 700.20;
int j = (int) i; //Explicit casting
51、什么是Java虚拟机?
Java虚拟机是能移植到不同硬件平台上的软件系统。
52、Java的访问修饰符是什么?
访问权限修饰符是表明类成员的访问权限类型的关键字。使用这些关键字来限定程序的方法或者变量的访问权限。它们包含:
public: 所有类都可以访问 protected:同一个包内以及所有子类都可以访问 private:只有归属的类才能访问默认:归属类及相同包下的子类可以访问
53、&操作符和&&操作符有什么区别?
当一个&表达式在求值的时候,两个操作数都会被求值,&&更像是一个操作符的快捷方式。当一个&&表达式求值的时候,先计算第一个操作数,如果它返回true才会计算第二个操作数。如果第一个操作数取值为fale,第二个操作数就不会被求值。
55、声明变量和定义变量有什么不同?
声明变量我们只提供变量的类型和名字,并没有进行初始化。定义包括声明和初始化两个阶段String s;只是变量声明,String s = new String(“bob”);或者String s =“bob”;是变量定义。
56、Java支持哪种参数传递类型?
Java参数都是进行传值。对于对象而言,传递的值是对象的引用,也就是说原始引用和参数引用的那个拷贝,都是指向同一个对象。
57、你怎么理解变量?
变量是一块命名的内存区域,以便程序进行访问。变量用来存储数据,随着程序的执行,存储的数据也可能跟着改变。
58、怎么判断数组是null还是为空?
输出array.length的值,如果是0,说明数组为空。如果是null的话,会抛出空指针异常。
59、程序中可以允许多个类同时拥有都有main方法吗?
可以。当程序运行的时候,我们会指定运行的类名。JVM只会在你指定的类中查找main方法。因此多个类拥有main方法并不存在命名冲突的问题。
60、一个类能拥有多个main方法吗?
可以,但只能有一个main方法拥有以下签名:
public static void main(String[] args) {}
否则程序将无法通过编译。编译器会警告你main方法已经存在。
61、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
62、说说&和&&的区别。
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null && !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 & ++y>0) y会增长,If(x==33 && ++y>0)不会增长
&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。
63、Java中的“短路”是指什么
在java逻辑运算中使用逻辑运算符||与&&时将采取“短路”运算。举一个例子
if(a>0||a<1){
//代码1....
}
上面一段代码的执行过程是当a满足大于0的时候将不会再执行后面的a<1代码,这就是“短路”。
64、在JAVA中如何跳出当前的多重嵌套循环?
在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,
ok://定义的标号
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
System.out.println(“i=”+ i + “,j=”+ j);
if(j == 5) {
break ok;//跳出到指定的标号
}
}
}
另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
int arr[][] = {{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length && !found;i++){
for(int j=0;j<arr[i].length;j++){
System.out.println(“i=”+ i + “,j=”+ j);
if(arr[i][j] == 5){
found = true;
break;
}
}
}
65、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expression)中,expression只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
66、short s = 1; s = s + 1;有什么错? shorts = 1; s += 1;有什么错?
对于short s = 1; s = s + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于+= 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
67、char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。
备注:后面一部分回答虽然不是在正面回答题目,但是,为了展现自己的学识和表现自己对问题理解的透彻深入,可以回答一些相关的知识,做到知无不言,言无不尽。
68、用最有效率的方法算出2乘以8等于几?
最有效率的计算方式:int result = 2 << 3;
因为将一个数左移n位(二进制移位运算),就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算是cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。
69、冒泡排序实现
口诀:n个数字来比较,外层循环N-1,内层循环N-1-i,两两相比小靠前。
代码示例:
public static void main(String[] args) {
int[] number=new int[]{22,12,33,45,66};
int temp;
//冒泡排序
for(int i=0;i<number.length-1;i++){
for(int j=0;j<number.length-1-i;j++){
if(number[j]>number[j+1]){
temp=number[j+1];
number[j+1]=number[j];
number[j]=temp;
}
}
}
}
70、"=="和equals方法究竟有什么区别?
(单独把一个东西说清楚,然后再说清楚另一个,这样,它们的区别自然就出来了,混在一起说,则很难说清楚)
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();引用变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = new String(“quit”); input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须重写equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
71、静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如,对于下面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
public class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest() {
staticVar++;
instanceVar++;
System.out.println(“staticVar=”+ staticVar + ”,instanceVar=”+ instanceVar);
}
}
备注:这个解答除了说清楚两者的区别外,最后还用一个具体的应用例子来说明两者的差异,体现了自己有很好的解说问题和设计案例的能力,思维敏捷,超过一般程序员,有写作能力!
72、谈谈你对static关键词的理解
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,声明为static的方法有以下几条限制:
1) 它们仅能调用其他的static 方法。
2) 它们只能访问static数据。
3) 它们不能以任何方式引用this 或super。
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间。
73、是否可以从一个static方法内部发出对非static方法的调用?
不可以。
因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
74、Integer与int的区别
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况。
另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数Integer.parseInt(“数字字符串”);
Integer中还定义了表示整数的最大值和最小值的常量。
75、Math.round(11.5)等於多少? Math.round(-11.5)等于多少?
Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整(就是往大值靠拢),所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,所以,Math.floor(11.6)的结果为11,Math.floor(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
76、请说出作用域public,private,protected,以及不写时的区别
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示default (friendly)。
作用域
当前类
同一包内
子孙类
其他包
public
√
√
√
√
protected
√
√
√
×
default(不写)
√
√
×
×
private
√
×
×
×
备注:只要记住了有4种访问权限,4个访问范围,然后将全选和范围在水平和垂直方向上分别按排从小到大或从大到小的顺序排列,就很容易画出上面的图了。
77、public、protected和private这些访问权限修饰词的作用
1) public修饰的字段、属性可被所有的访问。
2) protected修饰的字段、属性只能被本类、本包以及其子类的访问。
3) private修饰的字段、属性只可以被本类访问。
78、写出JDK中常用的包名。
1) java.lang包:java的核心类库,包含了运行java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载 这个包
2) java.io包:java语言的标准输入/输出类库,如基本输入/输出流、文件输入/输出、过滤输入/输出流等等
3) java.util包:包含如处理时间的date类,处理变成数组的Vector类,以及stack和HashTable类
4) java.lang.reflect包:提供用于反射对象的工具
5) java.net包:实现网络功能的类库有Socket类、ServerSocket类
6) java.sql包:提供使用JAVA编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API
7) java.awt包:构建图形用户界面(GUI)的类库,低级绘图操作Graphics类,图 形界面组件和布局管理如Checkbox类、Container类、LayoutManger接口等,以及界面用户交互控制和事件响应,如Event类
79、Java是否有过程和函数?
在Java中可以存在过程和函数。在Java中,对于程序的各种功能的实现,都是通过方法实现的;而方法在运行的时候,就被称为过程。Java中的函数有main(),时间函数等。
80、String是最基本的数据类型吗?
基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
81、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
public Demo {
s = "Initial Value";
}
}
而非s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,它们的String类型属性s都指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。
82、String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。
接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。
StringBuffer sbf = new StringBuffer();
for(int i=0;i<100;i++){
sbf.append(i);
}
上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。
String str = new String();
for(int i=0;i<100;i++){
str = str + i;
}
在讲两者区别时,应把循环的次数搞成10000,然后用endTime-beginTime来比较两者执行的时间差异,最后还要讲讲StringBuilder与StringBuffer的区别。
String重写了equals方法和hashCode方法,而StringBuffer没有重写equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。
83、StringBuffer与StringBuilder的区别
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,运行效率高,如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
84、数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,有length的属性。String有有length()这个方法。
85、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param){
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:
param.append("a");
86、final关键词有哪些应用
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。
其初始化可以在两个地方:
一是其定义处,也就是说在final变量定义时直接给其赋值。
二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。
89、BS与CS的联系与区别。
C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或SQL Server。客户端需要安装专用的客户端软件。
B/S是Brower/Server的缩写,客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、InFORMix或SQL Server等数据库。在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
C/S 与 B/S区别:
1.硬件环境不同:
C/S 一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务.
B/S 建立在广域网之上的,不必是专门的网络硬件环境,例与电话上网,租用设备.信息自己管理.有比C/S更强的适应范围,一般只要有操作系统和浏览器就行
2.对安全要求不同
C/S 一般面向相对固定的用户群,对信息安全的控制能力很强.一般高度机密的信息系统采用C/S结构适宜.可以通过B/S发布部分可公开信息.
B/S 建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户。
3.对程序架构不同
C/S 程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑.
B/S 对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上.比C/S有更高的要求B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk 2000 Exchange 2000等,全面支持网络的构件搭建的系统. SUN和IBM推的JavaBean构件技术等,使B/S更加成熟.
4.软件重用不同
C/S 程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能.能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子
5.系统维护不同
C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级.升级难.可能是再做一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级.系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.
6.处理问题不同
C/S 程序可以处理用户面固定,并且在相同区域,安全要求高需求,与操作系统相关.应该都是相同的系统
B/S 建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的.与操作系统平台关系最小.
7.用户接口不同
C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高
B/S 建立在浏览器上,有更加丰富和生动的表现方式与用户交流.并且大部分难度减低,减低开发成本.
8.信息流不同
C/S 程序一般是典型的中央集权的机械式处理,交互性相对低
B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化,更像交易中心。
- java基础知识收集
- java weblogic oracle相关连接基础知识收集
- JAVA相关基础知识(收集,重新整理格式)
- 网络基础知识收集
- Linux 基础知识(收集)
- 数据挖掘 基础知识 收集
- sql基础知识收集
- Android基础知识资料收集
- oc的基础知识收集
- C/C++基础知识收集(不断更新)
- Java收集
- Java收集
- java 收集
- Java收集
- java收集
- Java基础知识
- java基础知识
- java基础知识
- LeetCode之Two Sum
- 排序1——冒泡排序
- vxWorks中的多核间的通信
- 《一个Android工程的从零开始》阶段总结与修改1-base
- hdu-1671-Phone List
- java基础知识收集
- MySQL中的事务
- 前端试题大综合练习(十)
- tomcat 小问题个人汇总
- spring-context.xml 文件配置的简单介绍
- 最小生成树(kruskal)
- oracle select表插入,多行插入
- Start my Computer Vision studying
- Java数据库查询简介