接着《java基础知识01》,再来聊聊剩下的那些知识点。
1、String字符串:
字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。用length()方法获取长度。
2、StringBuffer字符串缓冲区:
特点:
容器通常具备一些固定的方法:append()、insert()、delete()、replace()等。
3、StringBuilder字符串缓冲区:
JDK1.5出现StringBuiler;与StringBuffer区别如下:
4、包装类:
注意int ---> Integer 和 char ---> Character,这两个基本类型对应的包装类不是首字母大写就可以,其他的对应的包装类都是首字母大写,注意区分。
5、Collections:
操作集合的工具类,提供了大量的操作集合的方法,十分方便,且方法都是静态方法。
6、Arrays:
操作数组的工具类,提供了大量的操作数组的方法,里面的也都是静态方法。看下面这个常用方法:
asList方法:将数组转换成list集合。
String[] arr = {"abc","kk","qq"};
List<String> list = Arrays.asList(arr);// 将arr数组转成list集合。
1、集合和数组的区别:
image.png
2、Set集合:
无序(存入和取出顺序有可能不一致),不可以存储重复元素,必须保证元素唯一性。它的各个实现的特点如下:
3、List集合:
有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。它的实现有三个:
4、Map集合:
以键值对形式存储元素,其各个实现的特点如下:
5、集合使用技巧:
IO流就是用来处理设备上的数据的,输入和输出是以内存为参照物。InputStream,输入流,把计算机的数据输入到内存,所以是读;OutputStream,输出流,把内存中的数据输出到计算机,所以是写。
1、IO流分类:
2、IO流继承体系:
(1).字节流:
InputStream:是表示字节输入流的所有类的超类。
OutputStream:此抽象类是表示输出字节流的所有类的超类。
(2).字符流:
Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。
下面介绍几个流的用法,看下面例子:
/*创建可以读取文本文件的流对象,FileReader让创建好的流对象和指定的文件相关联。*/
FileReader fr = new FileReader("demo.txt");
int ch = 0;
while((ch = fr.read())!= -1) { //条件是没有读到结尾
System.out.println((char)ch); //调用读取流的read方法,读取一个字符。
}
fr.close();
/* =======================下面这种自定义缓冲区的方式更高效=============================== */
FileReader fr = new FileReader("demo.txt"); //创建读取流对象和指定文件关联。
//因为要使用read(char[])方法,将读取到字符存入数组。
//所以要创建一个字符数组,一般数组的长度都是1024的整数倍。
char[] buf = new char[1024];
int len = 0;
while(( len=fr.read(buf)) != -1) {
System.out.println(new String(buf,0,len));
}
fr.close();
/* ==================================== 高效写数据 ======================================*/
FileWriter fw = new FileWriter("bufdemo.txt");
BufferedWriter bufw = new BufferedWriter(fw);//让缓冲区和指定流相关联。
for(int x=0; x<4; x++){
bufw.write(x+"abc");
bufw.newLine(); //写入一个换行符,这个换行符可以依据平台的不同写入不同的换行符。
bufw.flush();//对缓冲区进行刷新,可以让数据到目的地中。
}
bufw.close();//关闭缓冲区,其实就是在关闭具体的流。
/* ==================================== 高效读数据 ======================================*/
FileReader fr = new FileReader("bufdemo.txt");
BufferedReader bufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine())!=null){ //readLine方法返回的时候是不带换行符的。
System.out.println(line);
}
bufr.close();
3、流的操作规律:
从上面的流体系可以看到,Java提供了很多的流供我们使用,感觉很复杂。那么使用的时候该如何选择呢?就得明确以下几点:
(1). 明确目的:
(2). 操作的数据是否是纯文本数据?
(3). 虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?
(4). 需要在基本操作上附加其他功能吗?比如缓冲。如果需要就进行装饰,那就用带Buffer的流。
(5). 凡是操作设备上的文本数据,涉及编码转换,必须使用转换流。
4、File类:
将文件系统中的文件和文件夹封装成了对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。这些是流对象办不到的,因为流只操作数据。常用方法如下:
(1). 创建:
boolean createNewFile(); //在指定目录下创建文件,如果该文件已存在,则不创建。
boolean mkdir(); //创建此抽象路径名指定的目录。
boolean mkdirs(); //创建多级目录。
(2). 删除:
boolean delete(); //删除此抽象路径名表示的文件或目录。
void deleteOnExit(); //在虚拟机退出时删除。
// 注意:在删除文件夹时,必须保证这个文件夹中没有任何内容,才可以将该文件夹用delete删除。
// java删除文件不走回收站。要慎用。
(3). 获取:
long length(); //获取文件大小。
String getName(); //返回由此抽象路径名表示的文件或目录的名称。
String getPath(); //将此抽象路径名转换为一个路径名字符串。
String getAbsolutePath(); //返回此抽象路径名的绝对路径名字符串。
String getParent(); //返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回 null。
long lastModified(); //返回此抽象路径名表示的文件最后一次被修改的时间。
File.pathSeparator; //返回当前系统默认的路径分隔符,windows默认为 “;”。
File.Separator; //返回当前系统默认的目录分隔符,windows默认为 “\”。
(4). 判断:
boolean exists();// 判断文件或者文件夹是否存在。
boolean isDirectory(); //测试此抽象路径名表示的文件是否是一个目录。
boolean isFile(); //测试此抽象路径名表示的文件是否是一个标准文件。
boolean isHidden(); //测试此抽象路径名指定的文件是否是一个隐藏文件。
boolean isAbsolute(); //测试此抽象路径名是否为绝对路径名。
(5). 重命名:
boolean renameTo(File dest); //可以实现移动的效果。剪切+重命名。
(6). String[] list():列出指定目录下的当前的文件和文件夹的名称。包含隐藏文件。
如果调用list方法的File 对象中封装的是一个文件,那么list方法返回数组为null。如果封装的对象不存在也会返回null。只有封装的对象存在并且是文件夹时,这个方法才有效。
所谓网络编程,其实可以简单的理解为就是在两个或两个以上的设备之间传输数据。
1、相关概念:
有了IP + 端口,就可以标识唯一的一台计算机上的一个唯一的程序了。但是网络程序之间还需要进行数据交换,所以还需要了解网络通讯。
这样的网络编程结构被称作客户端/服务器结构,简称C/S结构。这种结构的程序通用性差,一个程序的客户端只能和与之对应的服务器通讯,而不能和其他服务器通讯。我们还有另一种方式,就是使用浏览器作为通用客户端与服务器进行通讯,这种使用浏览器作为客户端的结构称作浏览器/服务器结构,简称B/S结构。
2、 网络编程步骤:
(1). 客户端网络编程步骤:
(2). 服务端网络编程步骤:
3、Java网络编程:
和网络编程相关的API位于java.net包下。
(1). 部分相关API如下:
(2). UDP方式案例:
客户端:
public static void main(String[] args)throws Exception {
//1,建立udp的socket服务。
DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,不指定系统会随机分配。
//2,明确要发送的具体数据。
String text = "演示udp传输";
byte[] buf = text.getBytes();
//3,将数据封装成了数据包。
DatagramPacket dp = new DatagramPacket(buf,
buf.length,InetAddress.getByName("10.1.31.127"),10000);
//4,用socket服务的send方法将数据包发送出去。
ds.send(dp);
//5,关闭资源。
ds.close();
}
服务端:
public static void main(String[] args) throws Exception{
//1,创建udp的socket服务。
DatagramSocket ds = new DatagramSocket(10000);
//2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
// 3,通过socket服务的接收方法将收到的数据存储到数据包中。
ds.receive(dp);//该方法是阻塞式方法。
// 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。
System.out.println(ip+":"+port+"--"+text);
// 5,关闭资源。
ds.close();
}
(3). TCP方式案例:
客户端:
public static void main(String[] args) throws Exception{
Socket s = new Socket("10.1.31.69",10002);
OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。
out.write("tcp演示".getBytes());
s.close();
}
服务端:
public static void main(String[] args) throws Exception{
ServerSocket ss = new ServerSocket(10002);//建立服务端的socket服务
Socket s = ss.accept();//获取客户端对象
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
//可以通过获取到的socket对象中的socket流和具体的客户端进行通讯。
InputStream in = s.getInputStream();//读取客户端的数据,使用客户端对象的socket读取流
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//如果通讯结束,关闭资源。注意:要先关客户端,在关服务端。
s.close();
ss.close();
}
Java有23中设计模式,这里只挑几个常用的说一说,想深入了解可以研读《Java设计模式》这本书。
1、单例模式:
什么叫单例,就是保证一个类在内存中只有一个对象。Runtime()方法就是单例设计模式进行设计的。
(1). 保证对象唯一的思路:
(2). 实现步骤:
(3). 代码实现:
class Single{
private Single(){} // 将构造方法私有化
private static Single s = null; // 私有静态的本类对象
public static synchronized Single getInstance(){ // 静态公共的返回对象的方法
if(s==null)
s = new Single();
return s;
}
}
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
2、模板方法模式:
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。简单的说就是很多相同的步骤,只是在某一些地方有差别,那么就可以使用这种模式。
public abstract class GetTime{
public long getTime(){
long start = System.currentTimeMillis;
//表示要计算运行时间的代码
code();
long end = System.currentTimeMillis;
return end-start;
}
public abstract void code();
}
public class forDemo extends GetTime{
//重写抽象方法
public void code(){
for(int x=0;x<1000;x++){
System.out.println(x);
}
}
}
public class test{
GetTime gt=new forDemo();
gt.getTime();
}
这样就可以计算那个for循环运行的时间了。
《java基础知识01》和本文简陋的总结了一些java基础的知识点,由于本人只是个小白,只能在此抛砖引玉,望各位大神多多指点!