【Java入门知识】

Java基础知识

1、关键字

2、标识符

3、基本类型和引用类型

4、public、default、protected、private

5、构造方法:

6、this 和 super

7、== 和 equals

8、字符容器(String、StringBuffer、StringBuilder)

9、File(Java 文件操作)

10、流  

11、字符问题

12、接口(implements)

13、泛型

14、枚举

15、hashcode和equals  (MD5的计算是目前最广泛的哈希算法)

16、网络通信(Socket)

17、system.out.print():  类名.成员变量.静态方法

18、语法基础

 // 陌生单词:compile编译、deprecation过时、PermGen永久代(方法区)、Heap堆内存

 

1、关键字

修饰符:  abstract、class、final、private、protected、public、static、7

数据类型:boolean、byte、char、double、float、int、long、short、void、9

语句组成:break、case、catch、continue、default、do、else、extends、finally、 for、if、implements、import、instanceof、interface、new、package、 return、super、switch、sychronized、this、throw、throws、try、while26

特殊含义关键字:assert、const、goto、enum、native、strictfp、transient、volatile、7

assert: 断言,用于调试,多被junit代替,IDE默认不开启。

const:预留关键字。

goto:预留关键字。

enum: 枚举。

native: 本地方法。

strictfp: 精确浮点,可用于类、接口、方法。

transient: 免除变量序列化。===》Serilizable 将一个对象按照同一个格式转化成字节流。

volatile: 被设计用来修饰被不同线程访问和修改的变量。==可见性

非java关键字:true、false、sizeof、null、serilizable、

 

 

2、标识符

  标识符是用来标识类名、变量名、方法名、类型名、数组名及文件名的有效字符序列。

  1、标识符由字母、数字、下划线、美元符号组成,长度不受限制。

  2、第一个字符不能为数字。

  3、标识符不能是关键字。

  4、标识符不能是true、false、null(字面常量)

 

 

3、基本类型和引用类型

Java中基本类型有四类八种,也称为原生类、内置类。其余的都属于引用类型

  整数:(byte1、short2、int4、long8)       引用类型:(Byte、Short、Integer、Long)

  浮点:(float4、double8)                        引用类型:(Float、Double)

  字符型:(char2)                                    引用类型:(Character)

  逻辑型:(bolean1)                                引用类型:(Boolean)

 

nume(枚举)是特殊数据类型,即是一种类,又比类多一些约束。

String是一个类。

 

  一个字符常量表示一个字符或一个转义字符,被一列ASCII单引号包裹。

 数组无论是定义实例变量还是局部变量,若没有初始化,都会被自动初始化。

   char[] ch = new char[3];  //默认空格

   int []  arr = new int[2];  //默认0

   String[] string = new String[2];  //默认null

 

Byte类型引用包装类默认为null,byte的默认值为0,byte[-128,127]

char类型存储unicode码,占两个字节16位,默认值为’’,默认使用GBK编码,可存中文汉字。UTF-8一个汉字占3个字节,GBK占两个字节。

java中的小数类型默认值为double.

 

------------------------------有待整理----------------------------

包装类型:Integer a=1; a=2; 在方法内===>等于重新new一个a对象,

 在方法外===>等于改变a的指向地址,

包装类对象做基本操作(拆比较、计算)会拆箱,不再是引用传递。

引用类型一般有 数组(数组是一种对象,有行为,大小一旦确定,不能改变)、类、接口。

a = Integer.parseInt(“1024”);==>parseInt把String对象类型转换为 int。

b= Integer.ValueOf(“1024”).intValue(); ===>ValueOf把String转换为Integer类型,(JDK支持装箱拆箱),intValue(); 把Integer类型转化为int类型。

 

Integer i01 = 59;会调用Integer的valueOf方法,判断是否在[-128,127]之间,返回引用或新建对象。

int i02 = 59;基本类型,存储在栈中。

Integer i03 = Integer.valueOf(59);直接返回引用(IntegerCache中的对象引用)

Integer i04 = new Integer(59); 直接创建一个新的对象

i01 == i02; ===>Integer会拆箱成int,做值之间比较  true

i02 == i04; ====>Integer会拆箱成int,做值之间比较 true

 

 

包装类相关:

  两种不同类型的引用不能进行”==”比较,例如:Integer和Double

包装类也重写equals,没有常量池,Integer  s = new Integer(q);Integer t = new Integer(q);强制在堆内存创建 q 对象实例。

s.equals(q);在进行equals比较之前,会对q调用Integer.valueOf;进行自动装箱,由于IntegerCache中已经存在q,所以,直接创建了一个新的Integer实例,但值也是q,比较值,满足条件,返回真。

 

 ------------------------------有待整理----------------------------

 

 

4、public、default、protected、private

   访问权限 主要区别在于 异包子类。

 

5、构造方法:

  构造方法可以被public、private、Protected修饰,不能被继承。

 

 private 修饰构造方法:

当构造方法为private级别时,意味着只能在当前类访问它,不能被继承,不能被其他程序用new创建实例对象。

 

protected 修饰构造方法:

如果构造函数是protected,那么该类可以继承,可以在被包内其他类中产生实例,但是无法在包外或者子类以外的地方产生实例.

 

6、this 和 super

  this: 表示某个对象,this可以出现在实例方法和构造方法中,但不可出现在类方法中。

  this出现在构造方法中,代表当前对象,一般省略。

  this出现在实例方法中,代表正在调用当前方法的对象,成员变量和局部变量重名时出现,多出现在set方法中,对象的成员变量。

 

 super:子类一旦隐藏了继承的成员变量(子类重写了父类方法、父类的构造方法、static方法),那么子类创建的对象就不再拥有该变量,该变量就归super关键字所拥有。

在子类的构造函数中默认有super();

父类没有无参构造时,需在子类的构造方法中显式调用super(“xxx”);

  只有在重写了父类的方法之后,再调用父类的方法需要使用super调用。  

父类静态方法不能被子类重写,只是被隐藏,也需要使用super调用。

 

7、==  和 equals

   == 比较类型和值(也可以说是比较地址)。在基本类型上,比较值,在对象引用类型上,比较地址。

   equals 底层也采用 == 做比较,但String中重写了Object中的此方法,用于比较字符串的内容。

 

  Object中equals的源码,没有重写equals时,底层直接用“==”做判断。而String中重写了方法。

  public boolean equals(Object obj){
     return (this==obj);
}

String 重写后的equals方法:

 public boolean equals(Object anObject) {
        if (this == anObject) {  // 判断是不是本身
            return true;
        }
        if (anObject instanceof String) {   // 判断 是不是属于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) {    // 判断是不是某个值为 0
                    if (v1[i] != v2[i])   // 判断对应位置的值 是不是一致
                        return false;
                    i++;
                }
                return true;   // 内容完全符合,就返回 true
            }
        }
        return false;
    }

以上的equals方法中,存在一个问题,使用 a.equals(b)时,很有可能会抛出NullPointExceprion,所以可以考虑使用下面的方法:使用org.apache.commons.lang包下的StringUtils.equals(String str1, String str2)方法

源码:

public static boolean equals(String str1, String str2){
        return str1 != null ? str1.equals(str2) : str2 == null;
    }
  //忽略大小写进行比较
    public static boolean equalsIgnoreCase(String str1, String str2) {
        return str1 != null ? str1.equalsIgnoreCase(str2) : str2 == null;
    }

StringUtils.equals这个方法了吧。他已经帮你绕过了那个坑。

 

8、字符容器(String、StringBuffer、StringBuilder)

 String传递是引用传递,StringBuffer、StringBuffer是引用传递===>可改变内容,不可改变引用地址。

 String s = new String(“xyz”);  分常量池和堆。

  xyz可能存在于两个地方,编译期遇到”xyz”,检测到常量池没有xyz存在,就在常量池中创建一个xyz常量。

     new String(“xyz”)会在执行时,在堆中创建一个实例。==>指向常量池?

 

三者的主要区别在于 运行速度 和 线程安全上。 

       首先,运行速度上,StringBuilder  > StringBuffer > String 。

     String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。实例如下:

String a = "abc";
System.out.println(a);
a = a + "def";
System.out.println(a); 

代码先输出 abc,然后输出 abcdef。原理上看是修改了 a 字符串 的内容,而实际上在执行到第三行的之后,JVM对 a 字符串进行了 gc 回收操作,然后创建了一个新的字符串,用来存储“abcdef”的值。Java中对于String的处理是一旦创建是不能被修改的,所以Java中对于String的处理 是一个不断创建和不断回收的过程,所以执行非常慢。

     StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。在使用了StringBuild之后,实例如下:

String  a = "abc"+"def";
StringBuilder sb = new StringBuilder().append("abc").append("def");
System.out.println(a);
System.out.println(sb。toString());

可以发现,StringBuilder的执行速度并没有String的执行速度快,这是因为String a = "abc"+"def" 的作用等同于

String  a = “abcdef” 。

 如果写成以下形式,执行速度就不一样了:

String a = "abc";
String b = "def";
String a = a + b; 
System.out.println(a);

   如此一来,Jvm就会不断的创建和回收 String对象,从而实现其功能。

 

    然后,是线程安全的问题。

        三者中,只有StringBuffer是线程安全的。主要应用于缓存中。因为多数方法都是使用了synchronized修饰的,所以进行操作需要获取到同步方法的权限。StringBuilder的方法没有被sychronized关键字修饰,所以是不安全的。            

 

综上所述:

     在需要线程安全的情况下,应该使用StringBuffer。

    不考虑线程安全的情况下,应该使用StringBuilder,执行速度最快。

    在少量字符串操作的情况下,使用String最佳。

 

 

 

 

 

9、File(Java 文件操作)

1) File类是对文件整体或者文件属性操作的类,例如:创建文件,删除文件等,文件内容用IO流操作。

2) 能用文本文档打开的都是文本文件(文本打开乱码都不是文本文件),用特殊应用打开的都是二进制文件。

3) 输出过程到达文件或流的末尾,会抛出EOFException,正常情况异常 会被处理返回特殊值(read()会返回-1)。

 

10、流  字节流(字节数组)经过 解码 可转换为 字符流(字符串没有意义)= 字符流+编码集 = 字节流

字节流继承于InputStream、OutputStream

字符流继承 InputStreamReader/OutputStreamWriter    

 

1)InputStreamReader的构造函数:

 InputStreamReader(InputStream  in): 创建一个使用默认字符集的InputStreamReader.

InputStreamReader(InputStream in,Charset cs):创建使用给定字符集的InputStreamReader

InputStreamReader(InputStream in,CharsetDecoder dec):创建使用给定解码字符集的InputSt..

InputStreamReader(InputStream in,String charsetName):创建使用给定字符集的InputStream..

BufferedReader的构造函数:

BufferedReader(Reader in):创建使用默认大小输入缓冲区的缓冲字符输入流

BufferedReader(Reader in,int size):创建使用指定大小输入缓冲区的缓冲字符输入流

 

Writer的构造函数:

Protected ... Writer( ):创建一个字符流writer,其作用是同步到writer自身,

Protected...Writer(Object  lock):创建一个字符流writer,作用是同步到给定的对象

 

管道流:管道实际上是一个大小固定的缓冲区,管程对于管道两端的进程而言,就是一个文件,但它不是普通文件,它单独构成一种文件系统,并且只存在内存中,类似于半双工通信。管道的内存大小通常是内存上的一页,它的大小并不受磁盘容量大小的限制。当管道空时,进程读操作会堵塞,管道满时,写操作会堵塞。

PipedInputStream的构造函数:

PipedInputStream():创建一个尚未连接的PipedInputStream.

PipedInputStream(int pipeSize):创建尚未连接的PipedInputStream,并指定管道缓冲区的大小

PipedInputStream(PipedOutStream src):创建PipedInputStream,连接到管道输出流src

PipedInputStream(PipedOutputStream sc,int pipeSize):创建PipedInputSt...,指定大小,连接src。

 

11、字符问题

  java语言使用Unicode字符集,而ASCII是国际上使用最广泛的字符编码,BCD是一种数字压缩存储编码Unicode(又称统一码、万国码、单一码)是计算机学领域上的一项业界标准,包括字符集、编码方案等,为每种语言的每个字符设定了统一并且唯一的二进制编码,以满足跨语言,跨平台的文本转换。一个unicode(中英文一样)占两个字节(16bit)。

UTF-8、UTF-16、UTF-32都是将Unicode装换到程序数据的编码方案。

JVM使用UTF-16保存字符。

  编码(Unicode)就是一个编号(数字)到字符的一种映射关系,一对一的映射表。

  编码格式(UTF-8)就是序列化或存储编码中的那个编码的一种”格式”。

 

中文汉字在java(Unicode)中占两个字节,在utf-8中占三个字节,在gbk中占两个字节。

 

标准ASCII 只使用7个bit,扩展的ASCII 使用8个bit,ASCII 中包括一些不可打印字符,0-31分配给不可打印字符,

ANSI通常使用0x00--0x7f范围的一个字节来表示1个英文字符,即扩展的ASCII编码。代表本地编码格式。

  简体中文windows中,ANSI代表GBK,GB2312 是国标。

  繁体中文  ANSI代表 Big5。

  日文中   ANSI 代表shift_JIS。

 

12、接口(interface)

1. 接口中声明的成员变量默认为public static final成员。(不管是基础还是引用类型)且必须初始化。

2. 接口中的方法默认是public abstract且没有方法体,但可以有参数,不设访问权限。

3. 实现接口的类如果是普通类,必须重写接口的所有方法,且不能降低访问修饰符,显示标注为public。如果是抽象类,不用重写所有的抽象方法。

 4. 接口没有构造函数,所以不能实例化。

4. 在jdk1.8之后,接口添加了默认的方法,在返回值加上default关键字,然后还有方法体;在接口被实现时,可以直接继承或者重新声明。

5. 还添加了静态方法。

 

13、泛型

   泛型防止代码编写出错,在编译期,泛型会被擦除,并不会影响运行速度。

 

14、枚举

     枚举是JDK1.5新增的特性,它是一种新的类型,表示特定的数据片段,类型安全,是特殊类,拥有成员变量和方法。 

  所有的枚举值都是类静态常量,在初始化时会对所有的枚举值对象进行一次初始化。

 

15、hashcode  和 equals  (MD5的计算是目前最广泛的哈希算法)

哈希又称散列,通过散列算法将任意长度的输入变成固定长度的输出,又称散列值,是一种压缩映射,散列值可能相同。

    1) 如果两个对象相等,那么他们一定有相同的哈希值。  

    2) 如果两个对象哈希值相等,它们不一定相等。需要用equals判断。

 

hash值: 具有等幂性(对象不变,做多少次计算hash值都不变)、

对等性(equals计算两个对象相等,而hash值一定对等)、

互异性(若两个对象equals为false,而hash值最好也不同)

hash值的计算一般采用 多个成员变量的hash值相加,或 加权值

对象的hash值做key。

 

16、网络通信(Socket)

服务器端:ServerSocket server = new ServerSocket(端口号);

服务器端的常用方法:

    ServerSocket(int port)、accept()、close()、getInetAddress()、getLocalPort()

客户端: Socket soc = new Socket(ip地址,端口号);  

客户端的常用方法:

    Socket(InetAddress address, int  port)、 Socket(String  host, int port)、close()  

 

17、system.out.print():  类名.成员变量.静态方法

  systemjava.lang的一个类,outsystem内的一个成员变量,这个变量是java.io.PrintStream类的对象。println()java.io.PrintStream类的方法,所以可以调用.成员变量.println()方法

18.  Json语法可以用来表示以下三个类型的值:

JSON对象中要求属性必须加双引号“”。

 

19. 接口相关

 

1. 接口中声明的成员变量默认为public static final成员。(不管是基础还是引用类型)且必须初始化。

2. 接口中的方法默认是public且没有方法体,但可以有参数。

3. 实现接口的类如果是普通类,必须重写接口的所有方法,且不能降低运用域,显示标注为public。如果是抽象类,不用重写所有的抽象方法。

 

4. 在jdk1.8之后,接口添加了默认的方法,在返回值加上default关键字,然后还有方法体;在接口被实现时,可以直接继承或者重新声明。

 

5. 还添加了静态方法。

 

1. 简单值:使用与JavaScript相同的语法,可以在JSON中表示字符串 数值 布尔值或者null。

2. 对象:对象作为一种复杂数据类型,表示的是一组有序的键值对。而每组键值对中的值可以是简单值,也可以是复杂数据类型的值。

3. 数组也是一种复杂的数据类型,表示一组有序的值的列表。可以通过索引来访问其中的值。数组的值可以是任意类型的简单值、对象或者数组。

 

 

 

18、语法基础

1、if(x=y)==>会出错,发生类型强转异常。(mismatch) 。

2、int x=1;float y=2;  x/y=1.0/2.0=0.5==>发生自动转型,byte-short-char-int-long-float-double  1 2 2 4 8 4 8

3、public class A extends B implements C{}  ===>先继承再实现

4、package在程序文件的第一句,且没有注释。

5、float f = 1.0f;  f必须有。否则默认为 double 

6、int a[] = null;  a[0] = 1;  抛出NullPointException。

7、<< 左移,乘以2的n次方, << 无符号左移,末尾补0,  >>> 无符号左移

8instanceOf运算符用来判断一个变量所引用的对象的实际类型(重点考察上转型看实际)是否可通过向上或向下转型转换。

9、强制转int型,会向下取整。 int(5.7) = 5

10、String str1 = new String(“hello”);   //正常创建对象保存在堆区

    String str2 =  “Hello”;    //创建的字符串,保存在字符串常量区

11、当使用Integer赋值的时候,java编译器会将其翻译成调用ValueOf()方法,比如 Integer i = 127,对于-128到127之间的数,Java会对其进行缓存,超过这个范围则新建一个对象。

12、 求数组的长度(容量):length。

   求字符串的长度:length()。

   求集合的长度:size().

13.  Java中的 i=i++ i=++i 问题 : 涉及到 临时变量的问题,会将i的值先存储起来,再做i=i+1,最后将存储起来的i赋值给 i

14.  如果在定义变量的时候,遇到float a = 10.0 =>会丢失精度,因为小数默认为double

 正确的写法应该是 float a = 10.0f

各个类型的字节数: 1  2  2  4  8  4  8

15. boolean类型只有两个值 分别是 true false,没有1或者0的说法。

 

 

 

 

// 陌生单词:compile编译、deprecation过时、PermGen永久代(方法区)、Heap堆内存

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值