Python 官方文档:入门教程 => 点击学习
目录1. 你可以讲下你对String类有什么其他的了解吗?2. == 和 equals 的区别3. String s= new String(“nz”)创建了几个字符串对象?4. 你
在看String的源码过程中,可以发现String 内部实际存储结构为 char
数组,在String中有几个比较重要的构造函数:
// 默认的无参构造
public String() {
this.value = "".value;
}
// 以String为参数的构造方法
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
// 以char[] 为参数构造方法
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
// 以StringBuffer 为参数的构造方法
public String(StringBuffer buffer) {
synchronized(buffer) {
this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
}
}
// 以StringBuilder 为参数的构造方法
public String(StringBuilder builder) {
this.value = Arrays.copyOf(builder.getValue(), builder.length());
}
而在String类中有我们比较常见的方法如equals
方法,用于比较两个字符串是否相等。它其实重写了Object类的equals方法,它具体的比较过程如下:
具体源码如下:
public boolean equals(Object anObject) {
// 对象引用相同直接返回 true
if (this == anObject) {
return true;
}
// 判断需要对比的值是否为 String 类型,如果不是则直接返回 false
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
// 把两个字符串都转换为 char 数组对比
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
// 循环比对两个字符串的每一个字符
while (n-- != 0) {
// 如果其中有一个字符不相等就 true false,否则继续对比
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
而在String类中,也有一个与equals() 比较类似的方法 equalsIgnoreCase(),它主要是用于忽略字符串的大小写之后进行字符串对比。
当然,String类中也有很多我们常见常使用的方法:
compareTo()
:比较两个字符串indexOf():
查询字符串首次出现的下标位置lastIndexOf():
查询字符串最后出现的下标位置contains():
查询字符串中是否包含另一个字符串toLowerCase():
把字符串全部转换成小写toUpperCase():
把字符串全部转换成大写length():
查询字符串的长度trim():
去掉字符串首尾空格replace():
替换字符串中的某些字符split():
把字符串分割并返回字符串数组join():
把字符串数组转为字符串这些都是我们都可能在实际应用中使用的方法。
String 常见的创建方式有两种:new String() 的方式和直接赋值的方式。
所以会创建两个对象,一个是字符串常量池中的对象"nz",还有一个new创建在堆中的字符串对象s。然后引用的值指向到该字符串常量池的对象。
让我们简单测试下:
public static void main(String[] args) {
String s1 = "nz";
String s2 = new String("nz");
System.out.println(s1 == s2); // false
System.out.println(s1.equals(s2)); // true
}
我们可以分为线程私有和线程共享的两种情况
线程私有:程序计数器,本地方法栈,虚拟机栈
线程共享:堆和方法区
系统加载Class类型文件的主要步骤有加载–>连接–> 初始化,连接又可以分为验证–>准备–>解析
对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,都有一个独立的类名称空间。而类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。
主要有一下四种类加载器:
BootstrapClassLoader
)用来加载java核心类库,无法被java程序直接引用。ExtensionClassLoader
):它用来加载 Java 的扩展库。Java 虚拟机的实现会提供一个扩展库目录。该类加载器在此目录里面查找并加载 Java 类。ApplicationClassLoader
):它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类都是由它来完成加载的。可以通过ClassLoader.getSystemClassLoader()
来获取它。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。java.lang.ClassLoader
类的方式实现。而对于一个类加载的过程中,如果一个类加载器收到类加载的请求的时候,它首先不会自己去加载这个类,而是把这个请求委派给自己的父类加载器去完成,一直到顶层的启动类加载器时,只有当父加载无法完成这一加载请求时,就会往下一层一层的尝试去加载类。这种模式就是双亲委派模式,这中模式的好处可以使类有了层次划分,也保障安全。
本篇文章就到这里了,如果这篇文章对你也有所帮助,希望您可以多多关注编程网的更多内容!
--结束END--
本文标题: 每日六道java新手入门面试题,通往自由的道路第二天
本文链接: https://www.lsjlt.com/news/129542.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0