当我们走出校园,步入社会,必须得找工作,那么作为it小白你必须拥有过硬的基础应用知识,才能慢慢的适应工作的节奏,以下内容则都是基础中的基础,需要全部进行掌握,因为这里可能有你面试时需要回答的面试题。
一:equals方法
这个方法的返回值是Boolean型,是通过地址来对对象进行判断
System.out.println(Math.ceil(-11.2));
String num1 = "hello world";
String num2 = "hello world";
String num3 = "hello";
//在Java中equals是通过对象的地址值来进行比较的 = 则是通过值来进行
int address = System.identityHashCode(num1);
int address1 = System.identityHashCode(num2);
int address2 = System.identityHashCode(num3);
System.out.println("对象的地址:"+address);
System.out.println("对象1的地址:"+address1);
System.out.println("对象2的地址:"+address2);
System.out.println("判断对象与对象1是否相等"+num1.equals(num2));
System.out.println("判断对象与对象2是否相等"+num1.equals(num3));
注意:通过System.identityHashCode()来获取对象的地址值
结果进行输出:
那么符号=(等号)呢?
等号则是通过对属性值的比较来判断是否相等。
二:StringBuilder类与String的区别
String是字符串,它的内容是不可变的,但是StringBuilder封装的内容则是将内容放在一个容器中,可以对容器中的内容进行修改,也就是可变的。
将对象封装在StringBuilder类中可以对对象进行各种的操作:反转.添加.删除等操作,可以进入源代码类中对类中的方法进行了解package java.lang包下面
功能案例:反转(功能很多,可以通过源码进行了解)
String str = "abcd"; StringBuilder stringBuilder = new StringBuilder(str); String reverse = stringBuilder.reverse().toString(); System.out.println(reverse);
控制台输出:
三:String创建对象
首先咱们先了解一下Java中堆栈的区别
在Java语言中,栈一般存放方法和基本类型,这里要注意一下,String并不是一个基本的类型,堆一般存放着对象和数组。
String创建对象通常情况下分为两种
String str = "abcd";
String str1 = new String("abcd");
这两种创建对象的方式拥有很大区别
String str = "abcd";
区别一:创建的对象存在堆内存中,内容只会有一份,意思就是出现相同的内容,在堆内存中,并不会增加,会用已有的这一个。
String str1 = new String("abcd");
而这种创建对象的方法,则是每一次都会new一个对象在堆内存中。
这种区别可以这样的理解:方法二实现的流程是先去常量池中创建对象,然后在通过new方法去创建对象,而方法一则是因为在如果常量池中,已经有了这个对象,那么则不会进行创建对象这一步骤,如果没有则是实现方法二的执行流程
new String("a") + new String("b")这行代码执行会创建几个对象
1:中间有一个+这是属于拼接字符串,会创建一个StringBuilderu对象
2:创建一个String对象 new String("a")
3:会在常量池中放一个a对象
4:创建一个String对象 new String("b")
5:会在常量池中放一个b对象
6:调用StringBuilder类中的tostring对象输出ab
四:抽象类与普通类的主要区别
1:修饰符:必须通过 abstract 关键字来进行修饰。
公式1:(修饰类)修饰符abstract class 类名{}
公式2:(修饰成员方法)修饰符 abstract 返回类型 方法名()
2:抽象类不能被实例化,只能通过创建子类对象。(抽象的意思就是不具体,所以不能 new )
3:抽象类子类的两个选择:
一:重写父类的所有抽象方法
二:把类定义为抽象类抽象类成员的特点:
- 成员变量:
可以有普通的成员变量
也可以有成员常量- 成员方法:
可以有普通方法,也可以有抽象方法
可以既可以有抽象方法, 也可以有非抽象方法
有构造方法 并且构造方法可以重载
五:什么是接口?
1:语法格式:[修饰符] interface 接口名 [ extends 父接口名列表]{}
注意:被[ ] 定义的都是可选的,有或者没有都可以。
2:类和接口是实现关系,用implements 类表示
class 类名 implements 接口名
注意: 接口修饰的成员方法中都有默认的修饰方法 public abstract
想要在接口的实现类中的方法实现,必须出现方法重写
接口继承关系的特点:
接口与类是实现的关系接口与接口之间的关系:继承关系 ,可以是单继承或者是多继承关系(格式 接口 extends接口1,接口2…
继承与实现的区别
1:继承是体现 is a的关系 ,在父类中定义共性的内容
2:实现体现的是like a的关系,接口中定义扩展功能
举例介绍:在动物类中 马 狗 猪 猴子都有名字 都睡觉 都吃饭 这是共性内容,把这些定义在父类中。在日后,猴子有了爬树的功能,而这就是定义在接口中。
接口的成员特点
1:成员变量的特点:接口没有成员变量,只有公有的.静态的常量
接口会有默认值(public static final)常量名=常量值
2:接口成员方法特点
(JDK7及以前)公有的,抽象方法:
public sbstract 返回值类型 方法名();
(JDK8以后)可以有默认方法和静态方法:
默认 public default 返回值类型 方法名(){}
静态 static 返回值类型 方法名(){}
(JDK9以后)可以有私有方法:
private 返回值类型 方法名(){}
3:接口构造方法的特点:
接口不能实例化,也没有初始化的成员所以没有构造方法
更多的关于接口和抽象类的内容可以去界面抽象类,接口基础讲解
六:IO流
I:input指的是对硬盘读操作
O:output指的是对硬盘的写操作
IO流的分类
第一种分类:则是上面介绍的输入(I)输出(O)流:读写操作
第二种分类:根据读取数据的方式不同
字节流:指的是读取数据的多少,字节流每一次读取一个字节也就是8个二进制位,但是这种流读取的文件是万能的,就是什么类型的文件都可以读取,例如:文本文件,图片,声音文件,视频文件等。
读取demo.txt中的文字内容,文档中是以下的内容:m不想睡醒的梦
第一次读取:“a”
第二次读取:文字”不“得前8个二进制位
第三次读取:文字”不“得后8个二进制位
字符流:一次读取只能读取一个字符,"a"是一个字符,"不"也是一个字符,但是它得读取文件类型则不是万能的了,只能读取普通文本文件(.java、.ini、.py .txt),不能读取图片视频声音等文件。
读取demo.txt中的文字内容,文档中是以下的内容:m不想睡醒的梦
第一次读取:“a”
第二次读取:”不"
第三次读取:"想"
FileInputStream
“万能”读取数据流
这里要读取的文件demo1.txt内容是:abcdefghc
案例:读取文本内容
方法一:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Fileinputstream {
public static void main(String[] args) throws IOException {
FileInputStream file = null;
try {
file = new FileInputStream("C:/Users/lenovo/Desktop/demo1.txt");
// System.out.println(file.read()); //read()方法返回的则是文件第一个字节的ACILL值
byte[] bytes = new byte[4]; //通过数组的方式去读取数据,数组的长度则实现每一次读取字节的长度
int readcount = 0;
// file.read(bytes);
// for(byte y : bytes){
// System.out.println(y); //
// }
while ((readcount = file.read(bytes)) != -1){
System.out.println(new String(bytes,0,readcount)); //通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if (file !=null){
file.close();
}
}
}
}
输出结果:一次只读取数组长度的内容模块
方法二:
import java.io.FileInputStream;
import java.io.IOException;
public class Fileinputstram_02 {
public static void main(String[] args) throws IOException {
FileInputStream file = null;
try {
file = new FileInputStream("C:/Users/lenovo/Desktop/demo1.txt");
// System.out.println("查看读取该文件的总字节数:"+file.available()); //通俗的来讲就是这个文件在内存中占了多少个字节
// int num1=file.read();
// System.out.println(num1);
// System.out.println("查看还有多少个字节没有读:"+file.available());
byte[] bytes = new byte[file.available()];
file.read(bytes);
System.out.println(new String(bytes)); //控制台进行输出:abdefgh
//跳过几个字节的内容再开始读取内容
file.skip(1);
System.out.println(file.read()); //控制台进行输出:98 跳过97这一个字节
} catch (Exception exception) {
exception.printStackTrace();
}
finally {
if(file != null){
file.close();
}
}
}
}
七:Socket类与ServerSocket
Socket类实现的是不同计算机进行字节流的传递,可以这样的理解Socket实现的是不同计算机通过端口号实现内容的传递,
ServerSocket则是在客户/服务器通信模式中,服务器通过创建监听端口的ServerSocket,它负责接收客户端发送的连接请求,生成服务器与客户端连接需要的Socket。
案例:通过代码简单的模拟客户端与服务器信息的交互
客户端代码(附带详细的解释)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Socket_client {
//服务器的端口号和ip地址
public static final int port =8080;
public static final String host = "localhost";
public static void main(String[] args) throws IOException {
System.out.println("client is starting.....");
while(true) {
Socket socket = null;
try {
//连接服务器
socket = new Socket(host, port);
//读取服务器所传递出来的信息
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向服务器传递信息
PrintStream out = new PrintStream(socket.getOutputStream());
System.out.println("请输入 \t");
//将客户端输入的数据发送到服务器中
String str = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.println(str);
//接收服务器所传递输出来的数据,并打印出来
String ret = input.readLine();
System.out.println("服务器返回的数据是:" + ret);
//判断是否关闭此次连接
if ("ok".equals(ret)) {
System.out.println("客户端关闭连接");
Thread.sleep(500);
break;
}
out.close();
input.close();
} catch (Exception e) {
System.out.println("客户端异常:" + e.getMessage());
} finally {
if (socket != null) {
socket.close();
}
}
}
}
}
服务器代码(附带详细的解释)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static final int port = 8080;//监听的端口号
public static void main(String[] args) {
System.out.println("Server is starting...\n");
Server server = new Server();
server.init();
}
public void init() {
try {
//创建一个ServerSocket,这里可以指定连接请求的队列长度
//new ServerSocket(port,3);意味着当队列中有3个连接请求是,如果Client再请求连接,就会被Server拒绝
ServerSocket serverSocket = new ServerSocket(port);
while (true) {
//从请求队列中取出一个连接
Socket client = serverSocket.accept();
// 处理这次连接
new HandlerThread(client);
}
} catch (Exception e) {
System.out.println("服务器异常: " + e.getMessage());
}
}
//通过线程来实现内容的接收和发送
private class HandlerThread implements Runnable {
private Socket socket;
public HandlerThread(Socket client) {
socket = client;
new Thread(this).start();
}
public void run() {
try {
// 读取客户端数据
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientInputStr = input.readLine();//这里要注意和客户端输出流的写方法对应,否则会抛 EOFException
// 处理客户端数据
System.out.println("客户端发过来的内容:" + clientInputStr);
// 向客户端回复信息
PrintStream out = new PrintStream(socket.getOutputStream());
System.out.print("请输入:\t");
// 发送键盘输入的一行
String s = new BufferedReader(new InputStreamReader(System.in)).readLine();
out.println(s);
out.close();
input.close();
} catch (Exception e) {
System.out.println("服务器 run 异常: " + e.getMessage());
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) {
socket = null;
System.out.println("服务端 finally 异常:" + e.getMessage());
}
}
}
}
}
}
结果测试
客户端向服务器传递数据1
服务器接收到客户端传递的数据,并回复一个2
客户端接收到数据2,并回复ok,结束此次连接
服务器向客户端传递ok表示连接的结束
通信成功