Java基础知识介绍
数组的定义及初始化方式
- 数组对象创建没有()
- 一维数组
- 静态初始化:
- String[] books = {"Thinking in Java","Effective Java"};
- String[] books = new String[] { "Thinking in Java","Effective Java" };
- 动态初始化:
- String[] books = new String[2]; //必须指定长度,然后单独赋值
- 静态初始化:
- 二维数组
- String[][] str = {{"a","b","c",},{"d","e","f",},{"g","h","i"}};
- String[][] str1 = new String[][]{{"a","b","c",},{"d","e","f",},{"g","h","i"}};
- String[][] arr = new String[3][4];
Java内存分配图

- 构造方法不能被继承
- this和super指的是同一个对象(当前对象自动含有的对本类和父类对象的引用)
- 方法的重载也是多态的一种形式
- final类可以被实例化
- abstract类不能被实例化,但是可以有构造方法
静态初始化只会在必要时刻才会进行
- 并非启动项目时就会加载所有的class类(static域初始化),而是仅加载启动程序所需要的基础的class,在程序上进行操作时会用到新的类,才会去加载类的class文件(类在初次使用时才会加载),若此对象有静态域,则会在此时进行加载(加载类时才会初始化静态域),然后初始化这个类对象。(构造器默认也是static方法,因此可以说,类是在其任何static成员被访问时加载的)
java对象创建过程
- 首先JVM查找CLASSPATH下类名称所在的路径,定位class文件。
- 加载class文件,执行静态数据对象初始化工作(只在class对象首次加载时初始化一次)。
- 使用 new 创建对象,首先在堆内存上为此对象分配足够的内存空间。
- 清空内存空间,执行对象的自动初始化。
- 执行所有出现在字段定义处的初始化。
- 执行构造器。
继承中的对象初始化过程
- 基类的静态属性、代码块(按代码的先后顺序)
- 导出类的类静态属性、代码块
- 基类的普通属性、代码块
- 基类的构造方法
- 导出类的普通属性、代码块
- 导出类的构造方法
- 类加载完成后(静态域初始化完成后)才会去调用方法如main(),才会创建对象,初始化普通域。
OOP
封装:
- 为数据、属性和方法设置适当的访问权限以隐藏具体实现细节,然后包装到一个类中。
- 封装的结果是产生一个带有特征和行为的数据类型。
继承(或实现):
多态:
抽象:
容器
一张图

三个知识点:
迭代器
使用Iterator遍历,最安全:所有实现了 Collection 接口的容器类都有一个 iterator() 方法用以返回一个实现了 Iterator 接口的对象
foreach 使用foreach遍历的集合必须实现 java.lang.Iterable 接口,必须重写 iterator 方法,返回一个实现了 Iterator 接口的对象
比较器:
- 实现实体对象的排序:需要实现Comparable接口
- 排序比较器(解耦,多种排序规则):实现 Comparator 接口
- List + Collections.sort();
- Tree
- Arrays
泛型:
- 泛型类:不能用在静态方法及属性上,不能用在catch语句块中
- 泛型方法:方法声明中加上“”表示这是一个泛型方法
- 泛型与继承的关系:若类 A 是类 B 的子类,则 List<A> 就不是 List<B> 的子类
- 通配符:
- ?,可以是任意类型
- ? extends A : 可以存放 A 及其子类
- ? super A : 可以存放 A 及其父类
- 可以读取声明为通配符的集合类的对象,不允许写入(null除外)
六个接口:
Collection:是高度抽象出来的集合,它包含了集合的基本操作和属性.
List:元素有序可重复,相当于动态数组,添加进List集合中的元素(或对象)所在的类一定要重写equals()方法,这里所说的顺序是指:元素插入的顺序与输出的顺序不一致.
Set:元素无序不可重复,底层是Map(Set 的不可重复就是利用了 Map 中键对象的不可重复性!),相当于数学中的集合,添加进Set集合中的元素所在的类要求重写equals() 和 hashCode()方法.
- 无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
- 不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
Map:数组中的链表,存储“键-值”对的数据,key使用Set存放,不允许重复 。value可以重复的,使用Collection来存放的。一个key-value对构成一个entry(Map.Entry),entry使用Set来存放。
Iterator:仅用来遍历集合Collection元素。
Comparable && Comparator
九个具体实现类:
- ArrayList:查询数据较快,效率高,底层是数组实现,数组元素相当于对象的成员变量,默认值与成员变量一样
- LinkedList:更适用于频繁的插入、删除操作
- HashSet:当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
- LinkedHashSet:使用链表维护了一个添加进集合中的顺序,能够按照添加顺序遍历,但并不代表有序(适用于频繁遍历的情况)
- TreeSet:有序,只能添加同一类型的元素,可以按照添加进集合中的元素的指定属性进行排序,排序是在添加数据时进行的,更改数据不会影响原来的顺序,不要修改数据,否则可能重复,解决办法是将属性修改为final类型,禁止修改。
- Collections:操作Collection及Map的工具类,大部分为static的方法。使用Collections.addAll(list, T...)要比list.addAll()效率高。
- HashMap:可以添加null键,null值。HashMap 判断两个 key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode 值也相等。HashMap 判断两个 value相等的标准是:两个 value 通过 equals() 方法返回 true。
- LinkedHashMap:原理同LinkedHashSet
- TreeMap:原理同TreeSet

Hashtable与HashMap的区别(面试):
- 主要:Hashtable是线程安全的,同步,效率相对较低
- 父类不同:Hashtable 是 Dictionary的子类,HashMap 是 AbstractMap 的子类
- null:Hashtable键值都不能为null,HashMap键最多一个null, 值可以有多个null
Properties:Hashtable的子类,(读写资源配置文件,键与值只能为字符串)
- 配置文件:
- properties:存储store(), 读取load()
- xml : 存储storeToXML(), 读取loadFromXML()
类路径加载资源文件:
- 配置文件:
// "/"表示bin目录
pro.loadFromXML(类.class.getResourceAsStream("/"));
// ""代表bin目录
pro.loadFromXML(Thread.currentThread().getContextClassLoader().getResourceAsStream(""));
容器的两种排序方式
- 自然排序:
- 要求添加进TreeSet中的元素所在的类实现Comparable接口
- 重写compareTo(Object obj),在此方法内指明按照元素的哪个属性进行排序
- 向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
- 内置类:
- 整数、小数:直接比较基本数据类型的大小 (Integer,Double)
- 字符:比较 unicode 编码之差
- 字符串:
- 如果其中一个字符串 是另外一个字符串的起始子串,返回长度之差
- 否则返回第一个不相等的 unicode 码之差
- java.util.Date : 根据日期的 long 形数比较
- 定制排序:
- 创建一个实现Comparator接口的实现类的对象并重写compare(Object o1,Object o2)方法
- 在此compare()方法中指明按照元素所在类的哪个属性进行排序
- 将此实现Comparator接口的实现类的对象作为形参传递给TreeSet的构造器中
- 向TreeSet中添加元素即可。若不实现此接口,会报运行时异常
- java.util.Arrays,asList() 方法返回的是一个自己的内部类 java.util.Arrays.ArrayList 产生的固定大小的特殊的数组。
- 排序时属性相同(return 0)对象也就相同了,因要求重写的compareTo()或者compare()方法与equals()和hashCode()方法保持一致。
IO流


多线程与并发
程序、进程与线程
程序:Program,静态概念
进程:Process 动态概念,作为资源分配的单位。
- 正在运行的程序,其实就是一个应用程序运行时的内存分配空间,占用特定的地址空间,每个进程都是独立的,由3部分组成:CPU,DATA,CODE
- 缺点:内存的浪费,CPU的负担
线程:Thread,调度和执行的单位,是进程中一个“单一的连续控制流程”(a single sequential flow of control)的执行路径,又被称为轻量级进程(lightweighht process),负责的是应用程序的执行顺序。
- Threads run at the same time, independently of one another;
- 一个进程可以拥有多个并行的(concurrent)线程(至少一个);
- 一个进程中的线程共享相同的内存单元/内存地址空间--->可以访问相同的变量和对象,而且他们从同一堆中分配对象--->通信、数据交换、同步操作
- 由于线程间的通信实在同意地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简单而且信息传递的速度也更快。
实现
- 继承 Thread 类:重写run(),直接new当前对象调用start(),无法再继承其他类
实现 Runnable 接口:实现run(),使用 new Thread(Runnable obj).start() 可以同时实现继承,方便共享资源
- 静态代理模式
- 创建真实角色
- 创建代理角色并持有真实角色的引用 + Thread(引用) + 代理角色 .start()
- 两个角色实现同一接口
线程状态(声明周期)
- 新生状态
- 就绪状态
- 运行状态
- 阻塞状态
- 死亡状态


线程终止
- 自然终止:线程体正常执行完毕
- 外部干涉:
- 线程类中定义线程体使用的标识
- 线程体使用该标识
- 提供对外的方法改变该标识
- 外部根据条件调用该方法即可
阻塞
- join:合并线程
- yield:暂停自己的线程 static 并不绝对
- sleep
- 优先级:代表概率
同步(并发 )
多个线程访问同一份资源,确保资源安全,又称线程安全
- 同步块:synchronized(引用类型||this||类.class){},锁的是对象
- 同步方法:方法声明中加入synchronized
死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁,死锁是我们在使用同步时才可能产生的。
并发常见问题
生产者-消费者模型
信号灯法
读者-作者模型
宴席的哲学家
Java基础知识介绍的更多相关文章
- java基础知识小总结【转】
java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- java 基础知识二 基本类型与运算符
java 基础知识二 基本类型与运算符 1.标识符 定义:为类.方法.变量起的名称 由大小写字母.数字.下划线(_)和美元符号($)组成,同时不能以数字开头 2.关键字 java语言保留特殊含义或者 ...
- 学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(2)----动态代理
Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
随机推荐
- AC日记——病毒侵袭 hdu 2896
2896 思路: 好题: 代码: #include <queue> #include <cstdio> #include <cstring> using names ...
- (七)MySQL数据操作DQL:单表查询1
(1)单表查询 1)环境准备 mysql> CREATE TABLE company.employee5( id int primary key AUTO_INCREMENT not null, ...
- 通俗了解TCP/IP三次握手四次挥手
前言: tcp/ip通信机制是计算机中很重要的一个知识点,不是一句两句就能解释清楚的,需要反复推敲其中的玄妙. 通俗理解: 但是为什么一定要进行三次握手来保证连接是双工的呢,一次不行么?两次不行么?我 ...
- Android学习--还有一些小技巧
这些小技巧 通过上面的这些文章,就把简单的安卓项目总结了一遍,当然你说懂这些就可以做Android开发的话还是不行的,欠缺的还有很多,但欠缺的这些我们有只能在工作中去总结以及不断的提高,这篇文章我们还 ...
- 洛谷——P2719 搞笑世界杯
题目背景 很久很久以后,一次世界杯,. 题目描述 随着世界杯小组赛的结束,法国,阿根廷等世界强队都纷纷被淘汰,让人心痛不已. 于是有人组织了一场搞笑世界杯,将这些被淘汰的强队重新组织起来和世界杯一同比 ...
- ZOJ 2112 Dynamic Rankings (动态第 K 大)(树状数组套主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 转 IntelliJ IDEA 快捷键
https://www.cnblogs.com/clwydjgs/p/9390488.html 一.视图查看 Ctrl+F12 查看file,method结构图.类继承机构图 (不知道方法结构,Ctr ...
- mdadm Raid5 /dev/md0 lost a disk and recovery from another machine
centos -- how to add a new disk into a mdadm raid5 /dev/md0 which lost a /dev/sdc1 disk and revoery ...
- [Contest20180328]同构
我们先把两棵树的所有节点的儿子排序,然后dfs,记录访问的深度序列 然后可以发现题目中的两个操作都只会在深度序列中删掉一位,不会对其他位有影响(自己画画图就知道了) 对于一个深度序列$d_{1\cdo ...
- 【枚举】URAL - 2081 - Faulty dial
//._. ... ._. ._. ... ._. ._. ._. ._. ._. //|.| ..| ._| ._| |_| |_. |_. ..| |_| |_| //|_| ..| |_. ._ ...