1.Java基础
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了1.Java基础,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含15094字,纯文字阅读大概需要22分钟。
内容图文
![1.Java基础](/upload/InfoBanner/zyjiaocheng/608/b89488268131441296052017fe184376.jpg)
Java基础
1、JDK 和 JRE 有什么区别?
- JDK:java 的开发工具包,提供了 java 的开发环境和运行环境。
- JRE:java 的运行环境,为 java 的运行提供了所需环境。
具体来说: JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。
简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
2、equals 和 == 的区别是什么?
- equals比较的是两个字符串内容是否相等;==比较的是两个字符串的内存地址是否相同。
- 对于基本类型和引用类型==的作用效果是不同的,基本类型:比较的是值是否相同;引用类型:比较的是内存地址是否相同;
- equals默认情况下是引用比较,只是很多类重写了object类中的equals方法,比如String、Integer等把它改成了值比较,所以一般情况下equals比较的是值是否相等。
3、两个对象的 hashCode()相同,则 equals()也一定相同吗?
不对,hashCode()相等的两个对象他们的equal()不一定相等。equals()相等的两个对象他们的hashCode()肯定相等。所以equals对比比hashcode对比更可靠。这也是为什么hashcode虽然效率高,但是还要使用equals的原因。
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
控制台输出:
str1:1179395 | str2:1179395
false
“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
重写的equals里一般比较的方法相对全面且复杂,效率比较低,而hashCode(),则只要生成一个hash值就可以比较了,效率比较高,
4、final 在 java 中的作用?
- final 修饰的类叫最终类,该类不能被继承。
- final 修饰的方法不能被重写(override)。
- final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
5、static 在 java 中的作用?
-
static修饰成员方法
static修饰的方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法和变量都必须依赖具体的对象才能够被调用。虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和变量的。
-
static修饰成员变量
给变量加上static关键字后,此变量变为全局变量,在编译时由内存分配一块内存空间,直到程序停止运行才会释放,无论哪一个方法修改了此变量,此变量就会改变,那么就是说该类的所有对象都会共享这块内存空间。并且,当再次new该类的对象时,static修饰的类成员不会被再次初始化,在程序运行过程中,static只会在第一次new时被初始化
-
static修饰代码块
当new一个类对象时,static修饰的成员变量首先被初始化,随后是普通成员,最后调用类的构造方法完成初始化。也就是说,在创建对象时,static修饰的成员会首先被初始化并且只会在第一次new时被初始化。static块可以优化程序性能,是因为它的特性:只会在类被初次加载的时候执行一次。
6、java 中的 Math.round(-1.5) 等于多少?
等于 -1。Math.round()四舍五入的原理 ; 正数去掉小数,负数去小数+1。所以 -1.5是 -2,+1之后的结果就是 -1。
7、String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:整型:byte,short,int,long,浮点型:float,double,字符型:char,Boolean型:boolean,而 String 属于对象。
8、java 中操作字符串都有哪些类?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。如果在项目中需要拼接字符串最好是采用StringBuffer 而非String.
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
9、String str="i"与 String str=new String(“i”)一样吗?
- String str=“i”;这句话的意思是把“i”这个值在内存中的地址赋给str,如果再有String str1=“i”;那么这句话的操作也是把“i”这个值在内存中的地址赋给str1,这两个引用的是同一个地址值,他们两个共享同一个内存。
- String str = new String(“i”);则是将new String(“i”);的对象地址赋给str,需要注意的是这句话是新创建了一个对象。如果再有String str1= new String(“i”);那么相当于又创建了一个新的对象,然后将对象的地址值赋给str1,虽然str的值和str1的值是相同的,但是他们依然不是同一个对象了。
- 内存的分配方式不一样:String str=“i”; 因为String 是final类型的,所以“i”应该是在常量池。而new String(“i”) ; 则是新建对象放到堆内存中。
10、如何将字符串反转?
- 使用StringBuilder的reverse方法(最快)
String str1 = new String("123456789");
/**
* 使用StringBuilder的reverse方法
*/
String str2 = new StringBuilder(str1).reverse().toString();
System.out.println("原字符串:" + str1);
System.out.println("字符串反转后:" + str2);
- 转换成字符数组,再使用StringBuilder拼接
/**
* 转换成字符数组,后通过StringBuilder拼接
*/
char[] mychar=str1.toCharArray();
StringBuilder sb=new StringBuilder("");
for(int i=mychar.length-1;i>=0;i--){
sb.append(mychar[i]);
}
String str2=sb.toString();
System.out.println("原字符串:" + str1);
System.out.println("字符串反转后:" + str2);
- 使用charAt(),并用StringBuilder拼接
String str1 = new String("123456789");
StringBuilder sb=new StringBuilder("");
for(int i=str1.length()-1;i>=0;i--){
sb.append(str1.charAt(i));
}
String str2=sb.toString();
System.out.println("原字符串:" + str1);
System.out.println("字符串反转后:" + str2);
- 使用递归的方法,实现字符串反转。
public static String reverse1(String str) {
int length = str.length();
if(length <= 1){
return str;
}
String left = str.substring(0, length / 2);
String right = str.substring(length / 2, length);
return reverse1(right) + reverse1(left);
}
11、String 类的常用方法都有那些?
1. 用字符数组value创建一个String对象
方法:
public String(char[] value)
实例:
char[] value ={"a","b","c","d"};
String str = new String(value);
//相当于String str = new String("abcd")
2. 用字符数组以x开始的n个字符创建一个String对象
方法:
public String(char chars[], int x, int n)
实例:
char[] value ={"a","b","c","d"}; //(0,1,2,3)
String str = new String(value, 1, 2);
//相当于String str = new String("bc");
3. 获取字符串长度:length
方法:
public int length()
实例:
String str = new String("478bhjd56");
int strlength = str.length();
4. 获取字符串某一位置的字符:charAt
方法:
public char charAt(int index)
实例:
String str = new String("43dfzyd"); //(0123456)
char ch = str.charAt(4);//ch = z
*注意:字符串中第一个字符索引是0,最后一个是length()-1。*
5.获取字符串的子串:substring
方法:
public String substring(int beginIndex)
//该方法从beginIndex位置起,
//从当前字符串中取出剩余的字符作为一个新的字符串返回。
public String substring(int beginIndex, intendIndex)
//该方法从beginIndex位置起,从当前字符串中
//取出到endIndex-1位置的字符作为一个新的字符串返回。
实例:
String str1 = newString("asdfzxc");
String str2 = str1.substring(2);//str2 ="dfzxc"
String str3 = str1.substring(2,5);//str3 ="dfz"
6.字符串的比较:compareTo、equals
public int compareTo(String str)
//该方法是对字符串内容按字典顺序进行大小比较,
//通过返回的整数值指明当前字符串与参数字符串的大小关系。
//若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
public boolean equals(Object obj)
//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
实例:
String str1 = new String("abc");
String str2 = new String("ABC");
int a = str1.compareTo(str2);//a=32
boolean c = str1.equals(str2);//c=false
7.查找子串在字符串中的位置:indexOf、lastIndexOf
方法:
public int indexOf(String str)
//用于查找当前字符串中字符或子串,返回字符或
//子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
public int indexOf(String str, intfromIndex)
//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
public int lastIndexOf(String str)
//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
public int lastIndexOf(String str, intfromIndex)
//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。123456789101112
8.字符串中字符的大小写转换:toLowerCase、toUpperCase
方法:
public String toLowerCase() // 字符串转小写
public String toUpperCase() //字符串转大写
实例:
String str = new String("JavaStudy");
String str1 = str.toLowerCase();
//str1 = "javastudy"
String str2 = str.toUpperCase();
//str2 = "JAVASTUDY"
9.字符串两端去空格:trim
String trim()
//去除字符串两端的空格,中间的空格不变,一般用于登陆注册时
实例:
String str = " z dali ";
String str1 = str.trim();
int a = str.length();//a = 8
int b = str1.length();//b = 6
System.out.println(a+"\n"+b);
10.将字符串分割成字符串数组:split
方法:
String[] split(String str)
实例:
String str = "sgs#jkc#eer";
String[] str1 = str.split("#");
for (int i = 0; i < str1.length; i++) {
System.out.println(str1[i]);
//输出结果是sgs jkc eer
}
11.基本类型转换为字符串:valueOf、getBytes
方法:
static String valueOf(xxx xx)
实例:
String s1 = String.valueOf(12.99);
System.out.println(s1);
//valueOf() 返回字符串的double类型数组
//getBytes() 返回字符串的byte类型数组
12.替换字符串:replace
方法:
public String replace(char oldChar, charnewChar)
//用字符newChar替换当前字符串中所有的oldChar字符,
//并返回一个新的字符串。
public String replaceFirst(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的
//第一个和字符串regex相匹配的子串,应将新的字符串返回。
public String replaceAll(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的所有
//和字符串regex相匹配的子串,应将新的字符串返回。
实例:
String str = "hjdfjdskdd";
String str1 = str.replace('h','g');
//str1 ="gjdfjdskdd"
String str2 =str.replace("hj","xxx");
//str2 = "xxxdfjdskdd"
String str3 =str.replaceFirst("d","c");
//str3 = "hjcfjdskdd"
String str4 =str.replaceAll("hj","xxx");
//str4 = "xxxdfjdskdd"
System.out.println(str1+"\n"+str2+"\n"+str3+"\n"+str4);
12、抽象类必须要有抽象方法吗?
不需要,注意:1、抽象类一定有abstract修饰、2、抽象类不一定要有抽象方法、3、有抽象方法的类一定是抽象类。
13、普通类和抽象类有哪些区别?
- 抽象类是包含抽象方法的类,其中的某些方法声明为abstract来表示一个类是抽象类。抽象类是一种模板模式,子类可以在这个模板上进行扩展。抽象类的存在还可以避免子类设计的随意性。实现了代码设计与实现的分离。
- (1)抽象类不可以被实例化,不可以new一个实例化对象。
(2)只要有抽象方法的类,必须定义成抽象类。
(3)抽象类可以包含属性、方法、构造方法。但是构造方法只能被子类调用,不可以用来实例化对象。
(4)抽象类只能用来继承,并且子类必须重写其抽象方法,除非子类自身也是抽象类。 - 注:抽象类中可以有普通方法。抽象方法只有方法声明,没有方法体。
14、抽象类能使用 final 修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,
final abstract 这样编写方法,编辑器也会提示错误信息。
15、接口和抽象类有什么区别?
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
16、java 中 IO 流分为几种?
-
Java中的流可以划分为字节流和字符流;分别由四个抽象类来表示:
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
字符流和字节流的区别
-
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
-
字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
-
字节流:一次读入或读出是8位二进制。通过字节的形式一个字节一个字节或者字节数组来操作文件中内容,可以操作一切文件。
-
字符流:一次读入或读出是16位二进制。通过单个字符或者是字符数组的形式来操作文件的,存在一定的局限性,是专门用于对文本文件操作的,默认的版本为GBK
设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
17、BIO、NIO、AIO 有什么区别?
-
BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
-
NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
-
AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
-
BIO是一个连接一个线程。NIO是一个请求一个线程。AIO是一个有效请求一个线程。
-
BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
-
NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
-
AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
适用场景:
-
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
-
NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
-
AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
18、Files的常用方法都有哪些?
1.Files.exists() 检查文件路径是否存在
public static void main(String[] args) {
Path path = Paths.get("E:/TXT游戏表.txt");
Boolean fileboolean = Files.exists(path,new LinkOption[]{ LinkOption.NOFOLLOW_LINKS});
System.out.println(fileboolean);
}
// true
通过这个方法判定文件是否存在时,首先得指定一个path路径,默认情况下符号链接会被追踪。
第二个参数是一个LinkOption数组,决定文件是否存在。LinkOption.NOFOLLOW_LINKS表明不追踪符号链接。如果目录或文件存在,则返回true,如果目录或文件不存在或者不知道其存在性,则返回false。
2.Files.createFile() 创建文件
public static void main(String[] args) throws IOException {
Path path = Paths.get("E:/Demo.txt");
Files.createFile(path);
}
3.Files.createDirectory() 创建文件夹
public static void main(String[] args) throws IOException {
Path path = Paths.get("E:/Demo");
Files.createDirectory(path);
}
1234
4.Files.delete() 删除一个文件或者目录
public static void main(String[] args) throws IOException {
Path path = Paths.get("E:/Demo");
Files.delete(path);
}
5.Files.copy()复制文件
public static void main(String[] args) throws IOException {
Path path1 = Paths.get("E:/Demo01.txt");
Path path2 = Paths.get("E:/Demo02.txt");
Files.copy(path1,path2);//把path1复制到path2中
}
6.Files.move() 移动文件
public static void main(String[] args) throws IOException {
Path path1 = Paths.get("E:/Demo01.txt");
Path path3 = Paths.get("E:/Demo03.txt");
Files.move(path1,path3);//将path1移动并修改为Demo03.txt
}
7.Files.size() 查看文件个数
public static void main(String[] args) throws IOException {
Path path1 = Paths.get("E:/Demo02.txt");
System.out.println(Files.size(path1));
}
- Files.read():读取文件。
- Files.write():写入文件。
19、前后端分离,后端怎么给前端返回一个字符串
1.比如我返回一个string类型的字符串,然后他在字符串的最外层又封装了一层,那就return “”;
一般后台都会有一层封装return resultmodoul(“你要返回的字符串”)
2.这种有new的就是没有封装的
内容总结
以上是互联网集市为您收集整理的1.Java基础全部内容,希望文章能够帮你解决1.Java基础所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。