Java中类跟数据相关问题_1
# Java中类跟数据相关问题_1
# Java的 8种基本数据类型是哪些?
Short、int、long、float、double、boolean、char、byte
一些理解记忆:
计算机存储是用二进制,高低电位,代表01,因此有了基础单位bit(二进制),
为了表示更多的数字,规定用8位表示一个字节byte。同时为了方便计算中的正确与错误,因此有boolean,
为了表示更多的数,整数和小数,于是有了short、int、long跟 float、double
最后发现需要特殊的字符,于是又加上了字符-char。后来String代替了char,但String不是基本类型。String 底层为char[]
# 字节和字符的区别?
字节是存储容量的基本单位(byte),字符是数字,字母,汉字以及其它语言的各种符号.
1字节 = 8个二进制单位;(位--简写bit)。一个字符由一个字节或多个字节的二进制单位组成
# Java开发中定义JavaBean的时候,为什么使用包装类型而选不用基本类型?
- 对象默认值:Java中的基本类型如int默认值是0,char默认值为空格,boolean默认值为false等。而它们对应的包装类(如Integer,Character,Boolean等)的默认值则是null。
- 集合类需要:如果我们想要将一些对象存入集合类中,则必须使用包装类,因为集合类不允许存储基本类型的元素。
- 面向对象的实现,包装类型是一个对象,更切合Java的面向对象思想,
# 什么是装箱和拆箱?
装箱:自动将基本数据类型转化为包装类型
拆箱:自动将包装类型转化为基本数据类型
# Integer包装类型的常量池?【扩展】
1.由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等(因为new生成的是两个对象,其内存地址不同)
Integer i = new Intger(100);
Integer j = new Intger(100);
System.out.print(i==j); //false
2
3
2.Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本类型int比较时,Java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)
Integer i = new Integer(100);
int j = 100;
System.out.print(i==j); //true
2
3
3.非new生成的Integer变量和new Integer()生成的变量比较时,结果为false.(因为非new生成的Integer变量指向的是Java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i==j); //false
2
3
4.对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false.
Integer i = 100;
Integer j = 100;
System.out.print(i==j); //true;
Integer i = 128;
Integer j = 128;
System.out.print(i==j); //false
2
3
4
5
6
注意:Java在编译Integer i = 100; 时.会翻译成Integer i = Integer.valueOf(100); 而Java API中的Integer 类型的valueOf的定义如下,Java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j =127时,就会直接从缓存中取,就不会new了
# 类
# Java中重载和重写的区别?
重载:发生在同一个类里面两个或者是多个方法的方法名相同,但是参数不同的情况
重写:子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回值类型。覆盖者可能不会限制它所在覆盖的方法的访问。
# Java中的是否可以覆盖(重写)一个private或者static的方法?
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
java中也不可以覆盖private的方法,因为private修饰的变量和方法只能在当前类中使用,如果是其他的类继承当前类是不能访问到private变量或方法的,当然也不能覆盖。
# ==和 equals 的区别
①、==:用于比较两个对象的引用,即它们是否指向同一个对象实例。
如果两个变量引用同一个对象实例,==
返回 true
,否则返回 false
。
对于基本数据类型(如 int
, double
, char
等),==
比较的是值是否相等。
②、equals() 方法:用于比较两个对象的内容是否相等。默认情况下,equals()
方法的行为与 ==
相同,即比较对象引用,如在超类 Object 中:
public boolean equals(Object obj) {
return (this == obj);
}
2
3
然而,equals()
方法通常被各种类重写。例如,String
类重写了 equals()
方法,以便它可以比较两个字符串的字符内容是否完全一样。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
一个例子送上:
String a = new String("sugar");
String b = new String("sugar");
// 使用 == 比较
System.out.println(a == b); // 输出 false,因为 a 和 b 引用不同的对象
// 使用 equals() 比较
System.out.println(a.equals(b)); // 输出 true,因为 a 和 b 的内容相同
2
3
4
5
6
7
8
# String有哪些常用方法
length()
- 返回字符串的长度。charAt(int index)
- 返回指定位置的字符。substring(int beginIndex, int endIndex)
- 返回字符串的一个子串,从beginIndex
到endIndex-1
。contains(CharSequence s)
- 检查字符串是否包含指定的字符序列。equals(Object anotherObject)
- 比较两个字符串的内容是否相等。indexOf(int ch)
和indexOf(String str)
- 返回指定字符或字符串首次出现的位置。replace(char oldChar, char newChar)
和replace(CharSequence target, CharSequence replacement)
- 替换字符串中的字符或字符序列。trim()
- 去除字符串两端的空白字符。split(String regex)
- 根据给定正则表达式的匹配拆分此字符串。