![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
wanhf11
无。
展开
-
Java 内部类
java内部类总结 (1) 在方法间定义的非静态内部类: ● 外围类和内部类可互相访问自己的私有成员。 ● 内部类中不能定义静态成员变量。 在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象(2) 在方法间定义的静态内部类: ● 只能访问外部类的静态成员。 静态内部类没有了指向外部的引用(3)原创 2016-03-16 11:23:15 · 215 阅读 · 0 评论 -
编程实现三个线程ABC,并让它们顺次打印ABC
package ABC;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Main { private static final Lock lock=ne原创 2016-03-16 12:19:34 · 956 阅读 · 0 评论 -
Java 线程
synchronized保证被包含的代码段具有原子性,可见性 原子性:防止多个线程同时修改变量 可见性:确保在同步结束之前,使所有线程都能看见修改注意: volatile只保证可见性 static变量的修改,默认JVM会自动帮你同步ReentrantLock效率比synchronized要高private static Lock lock = new ReentrantLock();pub原创 2016-03-04 19:58:07 · 278 阅读 · 0 评论 -
请用普通的互斥锁编程实现一个读写锁
参考import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Main { //写锁 private static Lock writer_lock=new ReentrantLock(); private static volatil原创 2016-03-17 16:06:54 · 2118 阅读 · 0 评论 -
Java Map 排序
import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;public class Mai原创 2016-03-18 08:54:47 · 240 阅读 · 0 评论 -
Java static和volatile的区别
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。 static变量或者方法强调的是模块之间的访问。 参考原创 2016-03-18 09:33:06 · 362 阅读 · 0 评论 -
消费者生产者
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Main { private static final Lock lock=new ReentrantL原创 2016-03-06 09:23:37 · 215 阅读 · 0 评论 -
Java 基础知识
面向对象编程的原则是什么? 主要有四点,多态、继承、封装和组合。重载和重写的区别: 1.重写必须继承,重载不用。 2.重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。 3.重写的方法修饰符大于等于父类的方法,重载和修饰符无关。 4.重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常静态类型有什么特点? 静态变量是和类绑定到一起的,而不是类的实例对象。每一个原创 2016-03-07 09:09:14 · 195 阅读 · 0 评论 -
Java Servlet
执行流程:第一个servlet请求到达,init() 创建request和response,传参并执行service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()) 当servlet不再需要时,执行destory()Get 和 Post的区别:GET使用URL或Cooki原创 2016-03-04 12:02:36 · 274 阅读 · 0 评论 -
bit和byte的关系
8bit=1byte=1B 1024B=1kb 1024kb=1m 1024m=1G原创 2016-03-14 20:27:11 · 199 阅读 · 0 评论 -
Comparable 和 Comparator
Comparator 和 Comparable 相同的地方他们都是java的一个接口, 并且是用来对自定义的class比较大小的,什么是自定义class: 如 public class Person{ String name; int age }.当我们有这么一个personList,里面包含了person1, person2, persion3….., 我们用Collections.sort(原创 2016-04-01 09:22:43 · 304 阅读 · 0 评论 -
Java IO
字节流(FileInputStream、DataInputStream、BufferedInputStream、 FileOutputSteam、DataOutputStream、BufferedOutputStream) 字符流 (BufferedReader、InputStreamReader、FileReader、BufferedWriter、 OutputStreamWriter、Prin原创 2016-03-05 10:05:05 · 252 阅读 · 0 评论 -
Java xml解析方式
解析方式:Xpath(抽象,定义了实现的方式) DOM,SAX,JDOM,DOM4j(具体,实现了定义) 参考DOMDOM是基于树的结构,通常需要加载整文档和构造DOM树,然后才能开始工作。 优点: a、由于整棵树在内存中,因此可以对xml文档随机访问 b、可以对xml文档进行修改操作 c、较sax,dom使用也更简单。 缺点: a、整个文档必须一次性转载 2016-03-21 09:52:32 · 290 阅读 · 0 评论 -
数据库连接池实现原理
连接数据库的原理一般来说,java应用程序访问数据库的过程是: ①装载数据库驱动程序; ②通过jdbc建立数据库连接; ③访问数据库,执行sql语句; ④断开数据库连接。瓶颈分析: 程序开发过程中,存在很多问题:首先,每一次web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出原创 2016-03-21 10:43:07 · 766 阅读 · 0 评论 -
Java 字符编码
2.1. iso8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母’a’的编码为0x61=97。很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然”中文”两个字不存在iso8859-1编码,以gb原创 2016-03-09 11:41:28 · 251 阅读 · 0 评论 -
Java 变量初始化
**成员变量会被系统默认初始化,局部变量没这功能,所以必须自己初始化。 还要注意静态成员变量也没系统默认初始化,必须在初始化块或者定义时或者构造函数里进行手动初始化。**原创 2016-03-09 17:51:30 · 197 阅读 · 0 评论 -
Java Annotation
package annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Inherited;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.a原创 2016-03-11 10:53:00 · 203 阅读 · 0 评论 -
Java 面向对象
访问修饰符访问修饰符 本类 同包 子类 其他 Private 是 Default 是 是 Protected 是 是 是 Public 是 是 是 是继承(单继承)隐藏:若B隐藏了A的变量或方法,那么B不能访问A被隐藏的变量或方法,但将B转换成A后可以访问A被隐藏的变量或者方法。 覆盖:若B覆盖了A的变量或者方法,那么不仅B不能访问A被覆盖的变量原创 2016-03-05 09:08:21 · 161 阅读 · 0 评论 -
JAVA8 十大新特性详解
这里写链接内容 “Java is still not dead—and people are starting to figure that out.” 本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字。 一、接口的默认方法Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码 代码如下:inte原创 2016-03-11 15:07:09 · 210 阅读 · 0 评论 -
Java 泛型
泛型Java的泛型是伪泛型,不同于C++的泛型。 C++的泛型是为每一个类型生成一个执行代码,容易导致代码膨胀。 Java的泛型是为将每种泛型生成唯一字节码。类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法类型擦除的原创 2016-03-05 09:19:55 · 200 阅读 · 0 评论 -
ClassLoader源码
jvm中默认定了三种classloader,分别为:bootstrap classloader, extension classloader, system classloader.bootstrap 使用c语言来实现,没有对应的ClassLoader对象。 该方法String.class.getClassLoader() 返回null。 extension 用于从jre/lib/ext原创 2016-03-23 19:00:47 · 306 阅读 · 0 评论 -
Java 序列化
class Student implements Serializable { .... } //Student对象序列化过程 FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeO原创 2016-03-15 08:37:43 · 213 阅读 · 0 评论 -
Java Arraylist知识
/** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. */ private transient Object[]转载 2016-03-15 09:16:30 · 224 阅读 · 0 评论 -
Java 集合类
Java集合类最重要的三个接口List,Queue,Set,Map,其中List和Set继承于Collection。 还有两个抽象类:Collection(非有序,允许重复) List(有序,允许重复)【ArrayList、LinkedList、Vector】 Set(非有序,除了TreeSet【二叉排序树】,不允许重复)【HashSet、TreeSet】 Map(非有序,除了TreeMap原创 2016-03-04 13:34:26 · 229 阅读 · 0 评论 -
互斥锁和自旋锁
参考互斥锁:若线程被阻塞后,会释放掉自己所占用的锁,进行上下文切换,不会产生cpu空转的情况。 自旋锁:若线程被阻塞后,会一直占用自己所占的锁,不断占用cpu的时间。区别自旋锁是一种非阻塞锁,也就是说,如果某线程需要获取自旋锁,但该锁已经被其他线程占用时,该线程不会被挂起,而是在不断的消耗CPU的时间,不停的试图获取自旋锁。互斥量是阻塞锁,当某线程无法获取互斥量时,该线程会被直接挂起,该线程不再消原创 2016-03-25 18:56:02 · 299 阅读 · 0 评论 -
java final 修饰符
final表示最终的意思,它修饰的类是不能被继承的;final修饰的方法能被继承(Math类里就有),但是不能够被重写。其实关系并不复杂,你只需要记住这样一句话:final可用于声明属性、方法和类,分别表示属性不可变,方法不可重写,类不可继承。 当然final修饰的方法是可以被重载的。static interface in1{}final interface in2{}编译出错原创 2016-04-10 11:46:07 · 231 阅读 · 0 评论 -
Java序列化id
简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。 当实现java.io.Serializable接口的实体(类)没有显式地定义原创 2016-04-27 10:12:46 · 319 阅读 · 0 评论 -
synchronized与static synchronized 的区别
synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码快。实际上,在类中某方法或某代码块中有 sync原创 2016-04-27 10:19:26 · 283 阅读 · 0 评论 -
Java 子类方法的父类方法相互调用
class A{ public void fun1(){ System.out.println("a:fun1"); this.fun2(); } /** * a:fun1 * a:fun2 */ private void fun2(){ System.out.println("a:fun2"原创 2016-04-27 20:28:49 · 4257 阅读 · 0 评论 -
Java 栈帧
结构: 1. 局部变量表:一组变量值的存储空间,用于存放方法参数和方法内的局部变量,编译完成后大小确定,最基本的单位slot,而且slot可以进行重用,一旦某个变量超出其存在的域,其他变量可重用其内存 2. 操作数栈:操作栈(运算),局部变量表(存储) 3. 动态链接: 4. 方法返回地址:正常返回或者异常返回 5. 额外附加信息;方法调用方法调用不等于方法执行静态解析(编译时确定):st原创 2016-05-01 12:44:47 · 1544 阅读 · 0 评论 -
Java 基本数据类型
Java的基本数据类型内存分配在栈中 引用类型的引用分配在栈中,对象分配在堆中类型 字节数 取值范围 boolean ->1/8 -> 2^1(true,false) byte ->1 -> -2^7~2^8 char ->2(中文字符) short ->2 -> -2^原创 2016-04-20 07:32:05 · 288 阅读 · 0 评论 -
Java SubList的使用陷阱
代码: public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.addAll(Arrays.asList(1, 4, 2, 5)); List<Integer> sub = list.subList(1, 3);原创 2016-05-04 12:56:22 · 1183 阅读 · 0 评论 -
Java 继承和实例化
Java子类对象都记录着同一个父类.class对象Java子类实例化时会先实例化父类,再实例化自身(抽象类其实也能够实例化,只不过不能通过代码显式实例化,实例化:在内存中开辟一个空间,用于储存新的数据)Java子类的修改不会影响其他子类,引用的父类对象不同原创 2016-04-20 11:38:04 · 354 阅读 · 0 评论 -
Java 常量池与字符串
public class Main { public static void main(String[] args) { /** * 常量池记录的是引用 * JDK 1.6 :intern()会将首次出现的字符串拷贝至永久代,再返回在永久代的引用 * JDK 1.7 :intern()直接返回首次出现的字符串的引用原创 2016-04-20 11:51:35 · 209 阅读 · 0 评论 -
CAS :compare and swap非阻塞同步算法
CAS(乐观锁算法)compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值do{ 备份旧数据; 基于旧数据构造新数据; }while(!CAS( 内存地址,备份的旧数据,新数据 )) 就原创 2016-04-20 15:32:16 · 429 阅读 · 0 评论 -
String、StringBuilder与StringBuffer源码分析
AbstractStringBuilder扩容:2倍*2 void expandCapacity(int minimumCapacity) { int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity < 0) newCapacity = minim原创 2016-04-20 16:14:41 · 235 阅读 · 0 评论 -
Object 源码分析
equals() 方法实际判断引用地址public boolean equals(Object obj) { return (this == obj); }hashcode() 方法和equals相同,实际判断引用地址:这就是用hashCode()方法判断的。hashCode()是Object类的方法(equals()方法也是),所有类都间接或直接继承了Object类,因此都原创 2016-04-20 16:30:06 · 315 阅读 · 0 评论 -
Java Integer
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured原创 2016-06-07 11:19:11 · 274 阅读 · 0 评论 -
Java for循环写法效率
import java.util.ArrayList;import java.util.List;public class Main { // 46 // 2 // 2 private static void test(List<Integer> list) { long start = 0L; long end = 0L;原创 2016-06-08 09:52:46 · 3307 阅读 · 0 评论 -
Thread Join 方法
在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。public class Main { private static class mySubThread extends Thread {原创 2016-06-26 11:52:41 · 225 阅读 · 0 评论