一、前言
在学习java的时候,我印象最深的一句话是:程序=数据结构+算法,对于写java程序来说,这就是java的入门。
二、java基本数据结构与算法
1、数据类型
java中的数据类型8种基本数据类型:
整型
byte 、short 、int 、long
浮点型
float 、 double
字符型
char
布尔型
boolean
还有包装类型。所谓包装类型可以理解为都是类。
2、java常见数据结构
栈、队列、数组、链表和红黑树
3、java常见算法算法
排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序等。
查找算法:顺序查找、二分查找、哈希查找等。
字符串匹配算法:暴力匹配、KMP算法、Boyer-Moore算法等。
图论算法:最短路径算法、最小生成树算法、拓扑排序等。
动态规划算法:背包问题、最长公共子序列、最长上升子序列等。
三、如何验证:程序=数据结构+算法
/**
* 获取当前时间,格式为:yyyy-MM-dd HH:mm:ss
* @return
*/
public static String getDateStr() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(new Date());
}
比如上面这段代码获取当前时间,格式为:yyyy-MM-dd HH:mm:ss
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat 这个首先是个类型,它的算法就是构造函数
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
和
df.format(new Date());
这两个算法
返回的String类型其实也就是数据结构
这一段程序涉及到两个数据结构和两个算法
算法1:
public SimpleDateFormat(String pattern)
{
this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}
将这种格式: yyyy-MM-dd HH:mm:ss 作为参数加工
加工(算法)1:
public SimpleDateFormat(String pattern, Locale locale)
{
if (pattern == null || locale == null) {
throw new NullPointerException();
}
initializeCalendar(locale);
this.pattern = pattern;
this.formatData = DateFormatSymbols.getInstanceRef(locale);
this.locale = locale;
initialize(locale);
}
加工(算法)2:
/* Initialize compiledPattern and numberFormat fields */
private void initialize(Locale loc) {
// Verify and compile the given pattern.
compiledPattern = compile(pattern);
/* try the cache first */
numberFormat = cachedNumberFormatData.get(loc);
if (numberFormat == null) { /* cache miss */
numberFormat = NumberFormat.getIntegerInstance(loc);
numberFormat.setGroupingUsed(false);
/* update cache */
cachedNumberFormatData.putIfAbsent(loc, numberFormat);
}
numberFormat = (NumberFormat) numberFormat.clone();
initializeDefaultCentury();
}
一层一层下来的算法还是很多的。所以
获取当前时间,格式为:yyyy-MM-dd HH:mm:ss 涉及的算法其实很多。但我们最终程序输出的是字符串类型的 yyyy-MM-dd HH:mm:ss,里面嵌套的函数是一个个算法,当然算法了也涉及到其他的数据类型和结构
一次类推
/* Initialize the fields we use to disambiguate ambiguous years. Separate
* so we can call it from readObject().
*/
private void initializeDefaultCentury() {
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add( Calendar.YEAR, -80 );
parseAmbiguousDatesAsAfter(calendar.getTime());
}
/* Define one-century window into which to disambiguate dates using
* two-digit years.
*/
private void parseAmbiguousDatesAsAfter(Date startDate) {
defaultCenturyStart = startDate;
calendar.setTime(startDate);
defaultCenturyStartYear = calendar.get(Calendar.YEAR);
}
推到最下层
我们发现是这样的
@SuppressWarnings("ProtectedField")
protected int fields[];
就是定义了一个int类型的数组,所以底层还是数据结构。